【问题标题】:Having both primary key and foreign key in the same table在同一个表中同时拥有主键和外键
【发布时间】:2015-02-26 22:27:57
【问题描述】:

我应该在同一个表中同时拥有一个主键和一个外键吗?

例如:一对一

我有一个用户表和一个地址表。

每个用户都有一个地址。

我应该只在地址表中添加一个指向用户表中主键的外键吗?

或者我还应该在地址表中创建一个主键吗?

更新:

每个用户都可以有一个地址。因此,并非所有用户都有地址。如果用户决定输入他/她的地址。然后地址将在地址表中结束

【问题讨论】:

  • 最好在每个表中都有一个主键,即使它有其他表的外键。
  • 如果确实是一对一的关系,你可以把地址表的主键设为用户键。它既可以用作外键也可以用作主键,但它确实限制了架构的灵活性。
  • Composite primary key (User,Address) 在一个表中怎么样,因为你有one to one 关系
  • 如果用户和地址真的是1对1的,那为什么还要有地址表呢?
  • 对不起,我错过了一些东西。每个用户可以有一个地址。因此,并非所有用户都有地址。如果用户决定输入他/她的地址。然后地址将在地址表中结束

标签: mysql sql database-design foreign-keys primary-key


【解决方案1】:

正如我在评论中所说,第一个问题是,如果地址表真的是一对一的,为什么还需要地址表?

除此之外,我会扭转这种关系。您声明:

Each User has one address.

如果这是对模型的准确描述,则用户表应该引用地址表,而不是相反。一个地址可以有多个用户。所以用户表会有一个指向地址表的外键列。

关于其他 cmets 和答案,我同意几乎每个表都有一个主键是一个好习惯。当然也有例外,但这是一个很好的经验法则。

【讨论】:

  • 从创建一对一关系的表中分离信息是一种很好的做法 - 请参阅Third Normal Form。
  • 对不起,我错过了一些东西。每个用户可以有一个地址。因此,并非所有用户都有地址。如果用户决定输入他/她的地址。然后地址将在地址表中结束
  • @RobFarr:TNF 没有说将 1-1 关系移动到单独的表中。如果一个地址直接与用户绑定,它应该在同一个表中——这就是 TNF 所说的。如果一个地址可以共享(一对多),那么地址应该在一个单独的表中。
  • @user2722667:如果地址确实是用户的一部分——换句话说,它不与用户共享并随用户更改,最好的选择仍然是将其存储在用户表中并使字段可以为空。如果地址可以共享或必须在单独的表中,请将其设为可为空的引用(外键)。
  • 我认为这回答了手头的问题。确实,通过一对一的关系,您实际上不需要单独的地址表。我会将它们分开,但在地址表中有 fk。这样一来,当您决定以后更改模型时,例如拥有账单地址和居住地址,就可以减少工作量。
【解决方案2】:

我建议您在每个表中使用一个主键。可能会发生 2 个用户住在同一所房子里。为了安全起见...

【讨论】:

  • 如果 2 个用户住在同一所房子里,那么根据原始问题的描述,这将不是一对一的关系。
  • 我的意思是,如果您在地址表中有两次相同的地址,就会出现复杂情况 - 使用主键
  • 我看到这个错误在地址方面犯了很多 - 两个用户共享一个地址实体。然后其中一个移动到一个新地址,因此该行得到更新,系统有效地将两个用户移动到新地址。除非一个人或企业可以有多个地址,否则单独的地址表很少有用。
【解决方案3】:

所有表都应该有一个主键。外键指向另一个表中的主键以建立关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    相关资源
    最近更新 更多