【问题标题】:How to get around needing two foreign keys referencing same table如何绕过需要引用同一个表的两个外键
【发布时间】:2012-03-05 01:56:48
【问题描述】:

我有一个 Person 表,需要记录有关此人过去和当前职业的数据。我有一个包含职业名称和代码列表的职业表。由于在 Person 表中我不能将 current_occupation 作为引用 Occupation 的外键,也不能将 past_occuption 作为引用 Occupation 的外键,我该如何解决这个问题?即使我添加一个辅助表来记录Person和Occupation之间的关系,我仍然遇到同样的问题,即每个Person需要来自Occupation的两条数据。

【问题讨论】:

  • 是什么让您认为在 Person 中不能有 2 个不同的列以及 Occupation 的外键?这是什么数据库?

标签: database-design ms-access foreign-keys relational-database


【解决方案1】:

在 Person 表中,您可以将 current_occupation 作为引用 Occupation 的外键,也可以将 Past_occuption 作为引用 Occupation 的外键。在“关系”窗口中,添加“职业”表的第二个副本。然后创建一条从 current_occupation 到一个 Occupation 副本的关系线,以及另一个从 past_occuption 到另一个副本的关系线。

但是,这种方法会将您限制为每个人只能使用一个 past_occuption。如果要记录每个人以前的多个职业,Widor 建议的设计会更好。

【讨论】:

  • 该设计只要求记录一个过去的职业,但我想我会按照Widor的建议,增加一列来记录它是过去还是现在的职业。感谢您的帮助。
【解决方案2】:
SELECT Person.PersonId, Person.Name, 
CurrentOccupation.OccupationName AS CurrentOcc, 
PreviousOccupation.OccupationName AS PrevOcc
FROM (Person INNER JOIN Occupation AS CurrentOccupation ON Person.CurrentOccId = CurrentOccupation.OccupationId) 
INNER JOIN Occupation AS PreviousOccupation ON Person.PreviousOccId = PreviousOccupation.OccupationId;

这段代码在 SQL 中有两次占用表,一次使用 currentOcc 的外键,一次使用 previousOcc 的外键,但是上面创建一个名为 PersonOccupations 的新表的建议是一个更灵活和健壮的解决方案,因为它允许任何该人的职业数量。

【讨论】:

    【解决方案3】:

    为什么不使用带有附加字段的PersonOccupation 表来按“最近”或仅按应用日期对其进行索引。然后从中派生出currentpast_occupation

    那么您只需要一个外键来关联PersonOccupationOccupation 之间的OccupationId

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多