我必须设计一个表来存储一些远程数据。我通过网络服务获得的数据有一个候选键,由两列组合而成,但我看到很少有帖子不鼓励在休眠中使用复合键,而是建议使用代理键。如果我使用复合键设计一个表,那么我可以直接更新数据,但如果我使用代理键,那么我必须在更新之前先获取主键。我的问题是我应该使用哪一个,复合键还是代理键?
问问题
875 次
1 回答
1
对复合键说不,因为...
- 它们效率低下(取决于数据库)
- 使用麻烦
- 更多数量的参数,而不仅仅是一个
- 容易出现错误
- 如果我们有多个列作为复合键,可能会导致数据重复
因此建议使用代理键。虽然它有自己的缺点
- 性能问题
- 容易出错
- 复制
正如Java Persistence with Hibernate参考中所述:
更有经验的 Hibernate 用户只使用 saveOrUpdate();让 Hibernate 决定什么是新的和什么是旧的要容易得多,尤其是在具有混合状态的更复杂的对象网络中。独占 saveOrUpdate() 唯一(不是很严重)的缺点是它有时无法猜测实例是旧的还是新的,除非在数据库中触发 SELECT,例如,当一个类使用自然复合键映射时,并且没有版本或时间戳属性。
可以在此处找到限制的一些表现形式。
因此,在相关时使用自然键,并在最好使用代理键时使用它们。
于 2015-07-10T05:53:22.947 回答