多个外国重叠外键中的同一列 - 好的做法?
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 的存在)。
我的问题很容易解释,我自己想出了一个解决方案,但我不确定以后是否会引起冲突,所以我把它放在这里。
我有一辆 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 的存在)。