【发布时间】:2011-07-08 19:41:29
【问题描述】:
我有两个表,假设它们被称为表 A 和表 B。表 B 中的一个项目可以存在于 A 的多个实例中,并且每个 A 可以包含多个 B,所以我有一个名为 a_b 的表来链接它们通过他们的主键一起。我的问题是当我定义这个关联表时,我应该在关联表上有一个主键吗?还是不需要?只是想避免以 TDWTF 告终,仅此而已:)
【问题讨论】:
标签: mysql database-schema
我有两个表,假设它们被称为表 A 和表 B。表 B 中的一个项目可以存在于 A 的多个实例中,并且每个 A 可以包含多个 B,所以我有一个名为 a_b 的表来链接它们通过他们的主键一起。我的问题是当我定义这个关联表时,我应该在关联表上有一个主键吗?还是不需要?只是想避免以 TDWTF 告终,仅此而已:)
【问题讨论】:
标签: mysql database-schema
主键将位于关联表中的表 A PK 列和表 B PK 列上。这样,您可以确保不会意外在关联表中获得任何重复的行。
主键的主要目的之一是保证参照完整性。也就是说,保持表中的数据干净,没有重复。这种情况下的 PK 将确保您在关联表中永远不会有 2 个重复的行。
【讨论】:
我认为您可能想要使用主键来显示您的意图。例如,如果您不想要
a, b
a, b
然后在 A.a 和 B.b 上定义的主键会更清楚。如果您不在乎,但您有 a、b 和其他字段,那么添加代理键作为主键可能有助于为您提供一种统一的方式来删除您不想要的行。否则你将不得不删除 where a=a and b=b and ??然后从要删除的行中选择一些字段值。而使用代理键,您只需选择行并说 delete where mykey = 36 或其他...
但实际上这取决于业务案例。许多相交表除了两个表的键之外,还具有某种日期范围或与关系相关的附加字段。根据您的需要,在现有列上定义主键、新代理键、一些唯一索引、一些约束,甚至没有索引都可能是有效的操作过程。
我会说绝对做任何让你的意图最清楚的事情。
【讨论】:
不需要。这两个键都应该构成关联表的主键。如果您要进行双向导航,请考虑添加键反转的索引。
【讨论】:
始终需要主键。
但是,我会说这取决于它应该是什么。如果您打算使用某种 ORM 系统(例如 Hibernate),那么最好有一个代理标识符,而这两个外键(指向表 A 和 B)应该形成一个唯一索引。
此外,如果需要从另一个表中引用这样的关系,那么这个代理标识符将非常方便。
【讨论】: