Sql 多个外键重叠中的同一列-良好的实践?

Sql 多个外键重叠中的同一列-良好的实践?,sql,foreign-keys,primary-key,composite-primary-key,Sql,Foreign Keys,Primary Key,Composite Primary Key,我的问题很容易解释,我有自己的解决办法,但我不确定它以后是否会引起冲突,所以我把它放在这里 我有一辆客货两用车。有问题的货车属于技术人员所有,并且装满了必须登记的零件。 每辆公共汽车有两个由零件组成的库存。一个管理库存,这是货车应该有多少,比如说,一辆货车应该有20个螺栓,一个是实际库存,这是已经计算的数量 现在,这两种股票都是Van的弱势实体。它们继承VanName(Van的主要标识符),然后具有属性UpdateTime。这两者共同构成了这两种股票的主要标识符 总而言之: Van PK: Va

我的问题很容易解释,我有自己的解决办法,但我不确定它以后是否会引起冲突,所以我把它放在这里

我有一辆客货两用车。有问题的货车属于技术人员所有,并且装满了必须登记的零件。 每辆公共汽车有两个由零件组成的库存。一个管理库存,这是货车应该有多少,比如说,一辆货车应该有20个螺栓,一个是实际库存,这是已经计算的数量

现在,这两种股票都是Van的弱势实体。它们继承VanName(Van的主要标识符),然后具有属性UpdateTime。这两者共同构成了这两种股票的主要标识符

总而言之:

Van
PK: VanName

ActualStock
PK: VanName, UpdateMoment
FK: VanName (Van.VanName)

AdministrativeStock
PK: VanName, UpdateMoment
FK: VanName (Van.VanName)
现在问题来了。我想做一份报告,列出同一辆货车零件数量差异的特定实际库存和特定管理库存之间的差异。它由它报告的货车、它使用的实际库存以及它用来比较的管理库存来定义

因此,我所知道的最正确的方法是这样构造表:

Report
PK: VanName, ActualStockUpdateMoment, ActualStockVanName, AdministrativeStockUpdateMoment, AdministrativeStockVanName
FK: VanName (Van.VanName)
FK: ActualStockUpdateMoment (ActualStock.UpdateMoment), ActualStockVanName (ActualStock.VanName)
FK: AdministrativeStockUpdateMoment(AdministrativeStock.UpdateMoment), AdministrativeStockVanName(AdministrativeStock.VanName)
这意味着我将继承相同的VanName三次,根据定义,这三个条目必须相同。这对我来说简直是浪费

所以我想知道我是否可以这样做

Report:
PK: VanName, ActualStockUpdateMoment, AdministrativeStockUpdateMoment
FK: VanName (Van.VanName)
FK: ActualStockUpdateMoment (ActualStock.UpdateMoment), VanName (ActualStock.VanName)
FK: AdministrativeStockUpdateMoment (AdministrativeStock.UpdateMoment), VanName (AdministrativeStock.VanName)
因此,同一列成为三个不同外键的一部分


那是不是一个好习惯?如果我这样做,我会遇到麻烦吗?假设一份报告总是在同一辆面包车的两个股票之间

不,没有错


有一点吹毛求疵,第一个FK VanName可能是多余的,因为其他两个加上可能的事实,即引用的表本身有一个保证VanName存在的FK。啊,我没想到的VanName!