【问题标题】:Same column in multiple foreign overlapping foreign keys - good practise?多个外部重叠外键中的同一列 - 好习惯吗?
【发布时间】:2018-02-15 12:12:11
【问题描述】:

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

我有一张桌子范。有问题的货车由技术人员拥有,并装满了必须注册的零件。 每辆公共汽车都有两个股票(由零件组成)。一个管理库存,即货车应该有多少(例如,一辆货车应该有 20 个螺栓类型),一个是实际库存,即已计算的数量.

现在,这两种股票都是货车的弱实体。它们继承 VanName(Van 的主要标识符),然后具有属性 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 定义。

所以,我所知道的最“正确”的方式是像这样构造表格:

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)

所以同一列成为三个不同外键的一部分。

这是好习惯吗?如果我这样做,我会遇到麻烦吗? (假设报告总是只在同一辆货车的股票之间)

【问题讨论】:

    标签: sql foreign-keys primary-key composite-primary-key


    【解决方案1】:

    不,这没什么问题。

    有一个有点挑剔的说法,第一个 FK (VanName) 可能是多余的,因为其他两个通常已经暗示了这一点(加上可能的事实是,引用的表本身有一个 FK,可以保证存在范名)。

    【讨论】:

    • 啊,我没想到的 VanName !
    猜你喜欢
    • 2010-09-11
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多