RDBMS最佳实践 - autoid用于关联表?

时间:2011-07-08 19:41:29

标签: mysql database-schema

我有两个表,假设它们被称为表A和表B.表B中的项可以存在于A的多个实例中,并且每个A可以包含多个B,因此我有一个名为a_b的表,它链接它们一起按主键。我的问题是,当我定义这个关联表时,我应该在关联表上有一个主键吗?还是不需要?只是试图避免在TDWTF上结束,这就是全部:)

4 个答案:

答案 0 :(得分:2)

主键位于关联表中的表A PK列和表B PK列上。这样,您可以确保不会在关联表中出现任何重复的行。

主键的主要用途之一是保证参照完整性。也就是说,保持表中的数据干净,没有重复。在这种情况下,PK将确保您在关联表中永远不会有2个重复的行。

答案 1 :(得分:2)

我认为您可能想要使用主键来显示您的意图。例如,如果你不想要 a,b
a,b
然后在A.a和B.b上定义的主键会更清晰。如果您不关心,但是您有a,b和其他字段,那么添加代理键作为主键可能有助于为您提供统一的方法来删除您不想要的行。否则你将不得不删除a = a和b = b和??然后从要删除的行中选择一些字段值。而使用代理键,您可以选择行并说删除mykey = 36或其他地方......

但实际上这取决于商业案例。许多相交表具有某种日期范围,或者除了两个表的键之外还有与该关系相关的其他字段。根据您的需要,在现有列上定义主键,新的代理键,一些唯一索引,一些约束或甚至没有索引都可以是有效的操作过程。

我会说绝对做任何让你的意图最明确的事情。

答案 2 :(得分:0)

不需要。两个键都应构成关联表的主键。如果您要进行双向导航,请考虑添加一个反转键的索引。

答案 3 :(得分:0)

始终需要主键。

然而,我会说这取决于应该是什么。如果您打算使用某种ORM系统(例如Hibernate),那么最好有一个代理标识符,而这两个外键(指向表A和B)应该形成一个唯一索引。

此外,如果需要从另一个表中引用这样的关系,那么这个代理标识符将非常方便。

相关问题