目前,我们系统中的主键长度为 10 位,刚刚超过 Java 整数的限制。我想避免这些键中的数字溢出导致的任何维护问题,但同时我不想牺牲太多系统性能来存储我永远不需要的无限大数字。
您如何处理管理主键的大小?我是否最好坚持使用 Java 整数,以获得更大的 Long 的性能优势,并在需要时增加大小,或者我应该硬着头皮,在我的大部分 PK 中使用 Java Long,并且永远不必担心溢出序列大小?
目前,我们系统中的主键长度为 10 位,刚刚超过 Java 整数的限制。我想避免这些键中的数字溢出导致的任何维护问题,但同时我不想牺牲太多系统性能来存储我永远不需要的无限大数字。
您如何处理管理主键的大小?我是否最好坚持使用 Java 整数,以获得更大的 Long 的性能优势,并在需要时增加大小,或者我应该硬着头皮,在我的大部分 PK 中使用 Java Long,并且永远不必担心溢出序列大小?
似乎答案取决于您的数据溢出 Java 整数的可能性有多大。如果不了解您的数据是什么,就无法知道这一点。
我一直使用长键(数据库中的数字(18,0)),因为它们只是消除了这种情况在几乎所有情况下发生的可能性(除了极端数据囤积风格的应用程序)。在所有表中为键具有相同的数据类型意味着您可以在父类中的所有模型对象之间共享该字段,以及在您的 SQL getter 中使用一致的代码,等等。
性能优势可以忽略不计,所以我的建议是使用长键。不得不处理这个问题可能会是一个很大的麻烦。
这是存储和使用长整数的成本与溢出 32 位整数的可能性之间的平衡。
考虑一个无符号的 32 位整数存储超过 40 亿个值。如果您认为在接下来的 136 年中,此表中每秒平均有超过 1 个新行,那么您需要使用 Long。
java中的32位整数是有符号整数,所以只有20亿。如果由于某种原因,您的 SEQUENCE 时不时地跳动,那么您的 PK 之间就会出现一些差距。
有很长的时间并没有什么坏处(请记住,Y2K 问题的发生是因为一些 COBOL 开发人员认为他们会在日期中保存一些字节??):-)
因此,我总是使用 Long。