MySQL-也使用外键作为主键

MySQL-也使用外键作为主键,mysql,foreign-keys,primary-key,foreign-key-relationship,primary-key-design,Mysql,Foreign Keys,Primary Key,Foreign Key Relationship,Primary Key Design,我有一个主键为user\u id的表1和一个外键为user\u id的表2 表2中每个用户id只能存在一条记录,没有它就不能存在任何记录 问题:表2中的user\u id可以同时是外键和主键吗?如果可以,这是一个好主意,优点/缺点是什么?是的,您可以这样做(从数据库设计的角度来看,您应该这样做) 但是,考虑一下,如果 USER ID 是表2的主键,它意味着什么。实际上,您是说表2中的每一行对应一个用户,但您已经有了一个表,其中每一行对应一个用户:表1。这就提出了一个问题:“为什么不将表2的所有数

我有一个主键为
user\u id
的表1和一个外键为
user\u id
的表2

表2中每个
用户id
只能存在一条记录,没有它就不能存在任何记录

问题:表2中的
user\u id
可以同时是外键和主键吗?如果可以,这是一个好主意,优点/缺点是什么?

是的,您可以这样做(从数据库设计的角度来看,您应该这样做)

但是,考虑一下,如果<代码> USER ID 是表2的主键,它意味着什么。实际上,您是说表2中的每一行对应一个用户,但您已经有了一个表,其中每一行对应一个用户:表1。这就提出了一个问题:“为什么不将表2的所有数据放入表1中可为空的列中?”。毕竟,拥有两个表意味着您必须进行两次查询才能获取此数据,而不是一次查询

现在,在一些场景中,这种做法可能是个好主意:

  • 如果表2中有很多用户,但只有几行,那么表2中的查询可能很少执行;同时,您可以在表1中获得存储空间和修改速度
  • 将来,表2的主键可能会更改,而外键可能会保留;如果将所有数据都放在表1中,此修改很可能会破坏数据库模型

这可能是个好主意,但这取决于您申请的具体情况。

谢谢。在我的例子中,这是您提到的第一个场景,加上表2有很多列,还有表3、表4等等,它们与表1的关系类似,因此放置所有列会太多。如果您使用表2,并且表2代表表1的子类,那么这是有意义的。我想这是你的第一个要点的一个特例。另一个原因是如果你有两个不同的表,表a和表B,它们共享表C中的列。例如,你有一个名为Contacts的表,另一个名为Employees的表和另一个名为People的表。人员有firstname、lastname等,联系人和员工都代表人员。我使用此场景构建了一个包含用户设置的表:所有用户都有相同的设置,但可以更改值。类似问题(但不是重复问题):