这是我最近一直在考虑的另一个问题。
我们在前面的讨论中得出结论:“自然主键不好,人工主键好。”
较早使用Hibernate时,我已经看到Hibernate默认为所有表创建一个序列。起初我对此感到困惑,为什么要这么做。但是后来我看到了它的优点,它使父母和孩子之间的联系变得愚蠢。因为没有表具有相同的主键值,所以意外地将父级与不是子级的表链接不会产生任何结果。

有谁看到这种方法的任何弊端。我只看到一个:数据库中的记录不能超过999999999999999999999999999999。

最佳答案

根据在数据库中实现序列的方式,总是命中相同的序列可能会更好或更坏。当只有几个或一个线程请求新值时,将不会有锁定问题。但是,实施不当可能会导致拥塞。

另一个问题是回滚事务:序列不会回滚(因为其他人可能已经要求更高的价值),因此您可能会有很大的缺口,这将以比预期更快的速度吞噬您的数字空间。 OTOH,需要花费一些时间才能吃掉2或40亿个ID(如果您“仅”使用32位(带符号)整数),因此在实践中很少出现问题。

最后,如果需要的话,您不能轻松地重置序列。但是,如果需要重新启动序列(例如,自午夜以来的记录数),则可以告诉Hibernate创建/使用第二个序列。

一个主要的优点是您可以仅通过ID来唯一标识数据库中任何位置的对象。这意味着您可以严格削减在生产系统中编写的日志信息,如果仅具有ID,则仍然可以找到一些信息。

关于oracle - 征求意见:所有表格都按顺序排列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1536479/

10-10 07:56