【问题标题】:One to one relation in SQL databaseSQL数据库中的一对一关系
【发布时间】:2012-10-20 19:38:35
【问题描述】:

我有两个表:“Person”和“Details”。 Person 应该与 Details 具有一对一的关系。我有两个选择:

  1. 在Details表中写入DetailsId,使其FK到Details.Id(PK);
  2. 将Details.PersonId同时作为PK和FK为Person.Id;

在这两种情况下,关系都是一对一的。你能解释一下哪个更好,在什么情况下?

编辑:

我正在使用实体框架并希望获得这样的详细信息:Person.Detail,而不是 Person.Details.First()

【问题讨论】:

  • 您忘记了第三种情况:在 Details 表中写入 PersonId 并将其设为 Person.Id(PK) ;)
  • @danihp 这将是一对多的关系。一个人可能在您的案例中有很多详细信息
  • ... 并将 UNIQUE 约束设置为 PersonId 字段。
  • @danihp EF 认为它是一对多的关系,抱歉我之前不得不提到 EF
  • 为什么不把它都放在人的桌子上呢?

标签: entity-framework database-design relational-database


【解决方案1】:

制作两个表“Person”和“Details”。 在“详细信息”表中,取一个字段“person_id”,这将是您的 FK,它将引用“Person”表的 id 字段(PK)。 那是更好的解决方案。 因为“详细信息”表将需要比“人员”表更多的操作,如更新等。因此,将“Person”表设为 Master,将“Details”设为从机。

【讨论】:

    【解决方案2】:

    对于真正的 1:1 关系,您的默认解决方案应该是将表合并在一起,除非有 specific reasons 反对。

    但我怀疑您实际上是在谈论 1:0..1,在这种情况下,(2) 将模拟您所需要的。

    我不明白 (1) - 那里的自引用 FK 的目的是什么?您实际上是指 FK in Person 引用详细信息吗?

    【讨论】:

      【解决方案3】:

      “人”有专门的子类吗?在这种情况下,您可能希望拥有两个以上的表,每个子类都有一个不同的子类表。请参阅 SO 中的标签“[Class Table Inheritance]”。您还应该查找标签“[Shared-Primary-Key]”。它比为子类表使用单独的 FK 和 PK 效果更好。

      您还需要考虑选择单表解决方案的好处和成本。

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 2014-11-06
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多