27

我有表1与主键user_id和表2其中user_id是一个外键。MySQL - 也使用外键作为主键

表2中每user_id只能有1条记录,没有记录就不能存在。

问题:表2中的user_id可以同时为外键和主键,如果是,这是一个好主意,有什么优点/缺点?

+0

相似的问题(但不是重复):[如何创建也是MySQL的主键的外键?](http://stackoverflow.com/questions/5575051/how-to-create-foreign-key -that-is-also-primary-key-in-mysql) – naXa

回答

32

是的,你可以做到这一点(你应该从数据库设计的角度)。

但是,如果user_id是表2中的主键,请考虑这意味着什么。实际上,表2中的每一行都对应于某个用户,但您已经有了一个表,其中每一行都与用户对应:表1.这提出了一个问题:“为什么不把表2中的所有数据都放入表1中的可空列中?”。毕竟,拥有两个表格意味着您必须进行两次查询才能获取此数据而不是一个。

现在也有一些场景中这种做法可能是一个好主意:如果你有很多用户,但在表2中只有几行

  • ,也许在表2中的查询将只进行很少;与此同时,您获得表1中的存储空间和修改速度。
  • 将来可能会改变表2的主键而外键仍然存在;如果你把所有的数据放在表1中,这个修改很可能会破坏你的数据库模型

这可能是一个好主意,但它取决于你的应用程序的细节。

+2

谢谢。在我的情况中,这是你提到的第一个场景,再加上表2中有很多列的事实,并且还有表3,4等,这些表与表1类似,因此将所有列放置太多。 – CodeVirtuoso

+5

这是有道理的一种情况是,如果你使用[类表继承](http://stackoverflow.com/a/3579462/1709587),表2代表表1的子类。我想这是一个特殊的您的第一个要点。 –

+0

这样做的另一个原因是,如果您有两个不同的表(表A和表B),它们共享表C中的列。例如,您有一个名为Contacts的表,另一个名为Employees,另一个名为People。人名,姓氏等,联系人和雇员都代表人。 –