2014-10-08 104 views
0

将一个表的外键用作另一个表中的主键时,是否有任何一般设计注意事项(好/差/中立)?将外键用作主键的设计注意事项

例如,假定下面的表作为一个电影目录的一部分:

titles 
------ 
id 


episodes 
-------- 
title_id (PK/FK) 

情节可明显既ID和的title_id,其中id将是PK和title_id的将是唯一的完成,但是由于title_id已经是唯一的,并且在技术上可以识别出这一集,所以在使用它作为PK时会有什么需要考虑的吗?一般情况如何?你能看到什么样的设计考虑?

感谢您的想法!

+0

是否可以有多个标题相同的剧集(例如,标题可以作为系列标题)?有没有至少一集的标题? – 2014-10-08 23:45:32

+0

不能有多个标题相同的剧集。是的,可以有一个没有插曲的标题。有不同类型的标题。类型剧集的标题将有一个情节记录。 – 2014-10-09 20:06:16

+0

然后这看起来合适。实际上,您正在实现一种继承形式(请参阅[本文](http://stackoverflow.com/a/12037398/533120)中的“物理表示”部分)。在这种情况下添加代理键不会有好处。 – 2014-10-10 11:44:12

回答

0

您的问题的答案基本上是称为“共享主键”的技术的描述。因此,我用单个标签shared-primary-key替换了关于主键和外键的两个标签。

共享主键是一种设计,其中一个表的PK也是引用另一个表的PK的FK。正如shared-primary-key的标记wiki所表明的,这对于一对一关系非常有用,无论它们是强制还是可选。这些关系有时被称为IS-A关系,如“一辆汽车是一辆车”。车辆与汽车之间的关系也被称为类/子类或类型/子类型关系。

像任何设计技术一样,它有其优点和成本。

编辑答复评价:

最大的好处是共享主关键是它强制的关系的1对1的性质。在数据库中实施此规则通常比试图确保所有应用程序代码遵循规则更有成效。

第二个好处是它使两个表格之间的连接简单快捷。它的速度很快(对于某些数据库系统),因为优化器使用支持PK的索引来加速连接。

第三个好处是,第三个表可以用相同的FK引用这两个表。

成本是有一些编程涉及向两个表中添加新条目。主表中的PK必须复制到辅助表中,系统通常不会为您执行此操作。而且,加入速度虽然快,但并不是免费的。

+0

嗯,当然...这就是我要问的。什么样的好处和成本? (感谢您将我指向分片主键标签。) – 2014-10-09 21:11:05