多个外国重叠外键中的同一列 - 好的做法?

Same column in multiple foreign overlapping foreign keys - good practise?

我的问题很容易解释,我自己想出了一个解决方案,但我不确定以后是否会引起冲突,所以我把它放在这里。

我有一辆 table 货车。有问题的货车归技术人员所有,并且装满了必须注册的零件。 每辆公共汽车都有两个股票(由零件组成)。行政库存,货车 应该 有多少(比如,一辆货车应该有 20 个螺栓),一个是实际库存,也就是实际库存已统计。

现在,这两种股票都是货车的弱实体。他们继承了Van的主要标识符VanName,然后有一个属性UpdateTime。这两者共同构成了两种类型的 Stock 主要标识符。

总结一下:

Van
PK: VanName

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

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

现在有问题的部分来了。我想做一份报告,列出同一货车的某个 ActualStock 和某个 AdministrativeStock 之间的差异(部分计数差异)。它由它报告的 Van、它使用的 ActualStock 和它用来比较的 AdministrativeStock 定义。

所以,我知道的最 "correct" 方法是像这样构造 table:

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) 可能是多余的,因为这通常已经被其他两个暗示了(加上可能的事实,即那里引用的表本身有一个 FK,保证VanName 的存在)。