6 java mysql database hibernate
我已经看到我们可以使用复合键,其中主键由两个表的组合主键组成.
喜欢人和书
person_id and book_id will make the primary key.
Run Code Online (Sandbox Code Playgroud)
但我想问一下,我们需要硬编码编程语言
我的意思是,它可以,我可以有任何名称的单独列作为主键,然后我不必硬编码它,我可以像往常一样执行我的功能
id,person_id ,book_id
Run Code Online (Sandbox Code Playgroud)
在"新"应用程序中永远不应考虑复合键.过去曾经使用它们的人曾经认为"商业钥匙"比"代理钥匙"更好.
编辑:正如克里斯所问,我正在扩大我的答案.
首先让我说明我将这个问题理解为"复合主键"与"代理键".
此外,我承认有一个用例,其中复合键是有意义的:在交叉引用表中,也称为"链接表".它们用于多对多表中,并且只包含两个字段,两个字段都是形成外部参照表主键的外键.例如,UserRole
表将包含user_id
和role_id
,没有别的.例如,对于像这样的表,Java中没有类表示.这通常是a @ManyToMany
,Collection
双方都有.
我分享我的自然键与代理键意见另一个答案(休眠:在复合PK VS代孕PK意见),我相信组合键分享一些自然键的缺点,没有携带任何实际的好处.
复合键的问题是您需要两个值来唯一标识记录.一旦开始具有引用第一个表中的记录的表,这就成了问题.然后第二个表需要两列才能引用一条记录.如果第二个表使用由单个值+外键组成的复合键,则现在有三列可唯一标识一个记录.第三个表需要这三个额外的列才能引用第二个表中的一个记录.真的,这是一个雪球.
另一个缺点是需求会发生变化.每时每刻.因此,今天似乎是一个好的复合键并不是明天的关键.这就是为什么我们有代理键:为了面向未来.
主要使用复合键,以便表中的记录基于一组列是唯一的.例如,如果您有一个Customers
表,则可能有NationalId
+ Country
作为唯一值,这意味着如果两个用户的国家/地区是美国,则他们无法共享相同的SSN.但如果两个记录不在同一个国家/地区,则可以使用相同的数字.如果你喜欢复合键,这将是一个很好的选择.但正如我之前所暗示的那样,您可以使用代理键并应用unique
约束.您将获得复合键的好处以及代理键的安全性.