论坛首页 Java企业应用论坛

为了方便以后在各种数据库间移植,采用那种主键生成方式最好...

浏览 53023 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-11-24  
因为用无意义的数字作key是毫无意义的
对查询的效率根本没用
0 请登录后投票
   发表时间:2004-12-15  
原则上设计主键的时候要选择非业务数据,这是非常重要的.uuid.hex理论上是有重复的可能,我刚做过一个产品,由于开始没有考虑数据库的移植,使用了identity(ms sql server),现在为了不改动程序,只好使用sequence来支持oracle,这样,只需要在配置文件做改动就可以了
0 请登录后投票
   发表时间:2006-12-21  
用uuid不好,不足如下:
  1.位数太多,影响性能,如果数据量少了倒也无所谓,如果数据量到了几万几十万就能体现出来了,uuid的索引要比整型索引占用更多空间,查询比较也会更浪费时间,两个16位长度的字符串之间的比较要比两个数字之间的比较要慢几倍呢,数据量大的时候对性能影响很大。虽然用缓冲池能多少改善一点性能,但这种方法也不是万能的。

  2.生成uuid时的性能开销:uuid是用缓存的方式产生吧,它预先先给你先生成几个uuid,然后你取走几个它在后台再给你生成几个放在缓存里面,如果一次取一个或者一次取几个的速度还是很快的,但如果超出了缓存的大小,缓存中没有备用的uuid了,但你还在向缓存要uuid,这时候每次取uuid都是后台实时计算的,这个时候的性能就不好说了。


我觉得最好的方式是sequence的方式,但这种方式不便于数据库移植,如果有移植数据库的需要的话个人认为hilo是更好的选择。

好像hilo是一张表智能存一个键??如果要是有多个键的话还得建多个表,也许是我使用的不对吧,我觉得要是能用一个名字来区分一下就好了,不过这个功能可以自己扩展一下,如果这个扩展后的hilo能想uuid一样有缓存功能就更好了。
0 请登录后投票
   发表时间:2007-04-27  
我看很多人把记录主键值的工作交给数据库.用文件存储不可以吗?根据需要缓存n个递增的整形值在内存里.然后根据规则生成,得到,有什么问题吗?我现在知道有一个不太爽的就是要在save之前给主键赋值.
0 请登录后投票
   发表时间:2007-04-27  
就GUID长度而言(好像去除“-”后的长度是32位),对于任何数据库,这个字段长度还不至于影响到什么效率问题,索引做好了,根本不影响运行;再有很多人说记忆有障碍,我就纳闷了,记忆主键的值对开发系统而言有什么用呢?要查询数据也是查业务数据,主键在里面的角色就是唯一性限制,我赞成非业务主键的做法,对移植和后期业务调整都很有好处,业务主键用的非常少。
0 请登录后投票
   发表时间:2007-04-27  
在程序员杂志上面看到个介绍  大概的意思是说 用主键包含一下类别父子关系...意思是如果这个对象是一个类的实现,那它的前缀肯定是这个类的主键..后面再加上这个对象的排号.. 不知道这样效果会不会比较好..
0 请登录后投票
   发表时间:2007-04-27  
总结一下:
1、需要适合在各种数据库间移植(这是楼主),这类当然是有JAVA生成最好,如UUID。
2、需要性能上的考虑或是比较好的可读性,当然数据库生成会好一点,如sequence或identity。

我个人比较喜欢用identity之类的自增主键,原因有:
1、INT型的索引、排序性能好一点,尤其是大数据量,根据主键生成的顺序即可知道数据生成的先后顺序,无需额外的时间字段。
2、可读性强,不象UUID一长串的像乱码一样的东西,想直接检索一条数据很简单。

唯一的不足是插入数据的时候会有些许的不方便,但一个稳定的系统一般不会出现删除数据又手工插回去的问题。有的话也可以通过SQL直接处理掉。
0 请登录后投票
   发表时间:2007-04-27  
总结一下:
1、需要适合在各种数据库间移植(这是楼主),这类当然是有JAVA生成最好,如UUID。
2、需要性能上的考虑或是比较好的可读性,当然数据库生成会好一点,如sequence或identity。

我个人比较喜欢用identity之类的自增主键,原因有:
1、INT型的索引、排序性能好一点,尤其是大数据量,根据主键生成的顺序即可知道数据生成的先后顺序,无需额外的时间字段。
2、可读性强,不象UUID一长串的像乱码一样的东西,想直接检索一条数据很简单。

唯一的不足是插入数据的时候会有些许的不方便,但一个稳定的系统一般不会出现删除数据又手工插回去的问题。有的话也可以通过SQL直接处理掉。
0 请登录后投票
   发表时间:2007-04-27  
总结一下:
1、需要适合在各种数据库间移植(这是楼主),这类当然是有JAVA生成最好,如UUID。
2、需要性能上的考虑或是比较好的可读性,当然数据库生成会好一点,如sequence或identity。

我个人比较喜欢用identity之类的自增主键,原因有:
1、INT型的索引、排序性能好一点,尤其是大数据量,根据主键生成的顺序即可知道数据生成的先后顺序,无需额外的时间字段。
2、可读性强,不象UUID一长串的像乱码一样的东西,想直接检索一条数据很简单。

唯一的不足是插入数据的时候会有些许的不方便,但一个稳定的系统一般不会出现删除数据又手工插回去的问题。有的话也可以通过SQL直接处理掉。
0 请登录后投票
   发表时间:2007-04-27  

总结一下:
1、需要适合在各种数据库间移植(这是楼主的需求),这类当然是有JAVA生成最好,如UUID。
2、需要性能上的考虑或是比较好的可读性,当然数据库生成会好一点,如sequence或identity。

我个人比较喜欢用identity之类的自增主键,原因有:
1、INT型的索引、排序性能好一点,尤其是大数据量,根据主键生成的顺序即可知道数据生成的先后顺序,无需额外的时间字段。
2、可读性强,不象UUID一长串的像乱码一样的东西,想直接检索一条数据很简单。

唯一的不足是插入数据的时候会有些许的不方便,但一个稳定的系统一般不会出现删除数据又手工插回去的问题。有的话也可以通过SQL直接处理掉。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics