【发布时间】:2009-06-08 07:42:22
【问题描述】:
在 Java 的 JPA(通过 EmbeddedId 或 IdClass 注释)中似乎只有对复合数据库键的第二类支持。当我阅读复合键时,无论使用何种语言,人们都会觉得它们是坏东西。但我不明白为什么。这些天仍然可以使用复合键吗?如果没有,为什么不呢?
我找到了一个同意我的人: http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx
但另一个不这样做的人: http://weblogs.java.net/blog/bleonard/archive/2006/11/using_composite.html
只有我一个人,还是人们无法区分复合键在哪里合适?我看到复合主键在表不代表实体时很有用 - 即当它代表连接表时。
一个简单的例子:
Actor { Id, Name, Email }
Movie { Id, Name, Year }
Character { Id, Name }
Role { Actor, Movie, Character }
在这里,Actor、Movie 和 Character 显然受益于将 Id 列作为主键。
但是 Role 是一个多对多连接表。我认为创建一个 id 只是为了识别数据库中的一行是没有意义的。对我来说,主键是{ Actor, Movie, Character } 似乎很明显。这似乎也是一个相当有限的功能,特别是如果连接表中的数据一直在变化,一旦主键序列回绕到 0,您可能会发现主键冲突。
那么,回到最初的问题,使用复合主键仍然可以接受吗?如果没有,为什么不呢?
【问题讨论】:
-
Character { Id, Name }——这肯定是支持复合键的论据吗?我的意思是,我看不出将角色与它出现的电影分开建模有什么价值。是否所有名为“罗宾汉”的角色都使用相同的 ID?如果一部电影中的“罗宾汉”不是人们所期待的林肯绿紧身衣人物呢?
标签: java sql language-agnostic database-design