将外键作为主键可以吗?

Duc*_*ran 87 database foreign-keys primary-key

我有表"User"(用户名,密码)和表"Profile"(profileId,性别,dateofbirth,...).目前我正在使用这种方法:每个Profile记录都有一个名为"userId"的字段作为外键,链接到User表.当用户注册时,将自动创建其配置文件记录.我对我朋友的建议感到困惑:将"userId"字段作为外键和主键并删除"profileId"字段.哪种方法更好?

Rob*_*vey 117

外键几乎总是"允许重复",这将使它们不适合作为主键.

相反,找到唯一标识表中每条记录的字段,或添加一个新字段(自动递增整数或GUID)作为主键.

唯一的例外是具有一对一关系的表,其中链表的外键和主键是同一个.

  • 由两个外键组成的复合主键对于实现多对多关系也非常好. (61认同)
  • 关于外键,没有任何内容表明它是一对多(或如所写的“允许重复”)。键约束和唯一性是数据库中的两个独立的概念,并且可以像添加索引一样轻松地混合(这将是第三个独立的概念)。 (5认同)
  • @rezadru:我不同意 rightfold,但代理键几乎总是更好的选择。 (2认同)

kot*_*zot 34

主键始终需要唯一,如果表是一对多关系,则外键需要允许非唯一值.如果表通过一对一关系而不是一对多关系连接,则使用外键作为主键是完全正确的.如果您希望相同的用户记录可能具有多个相关的配置文件记录,请使用单独的主键,否则请坚持使用您拥有的内容.


小智 6

是的,在这些表之间存在一对一关系的情况下,外键可以是主键

  • 这对于超类型-子类型设计也很有用。子类型表的主键应该是对超类型表的外键引用。 (3认同)

小智 5

是的,将主键作为外键是合法的。这是一种罕见的构造,但适用于:

  • 1:1关系。由于不同的权限和特权仅适用于表级别,因此无法将两个表合并为一个表(从2017年开始,这样的数据库将很奇怪)。

  • 1:0..1关系。配置文件可能存在或不存在,具体取决于用户类型。

  • 性能是一个问题,设计是一个分区:与用户表相比,概要文件表很少被访问,位于单独的磁盘上或具有不同的分片策略。如果下划线存储是柱状的,则没有任何意义。