纠结的主健设计

主键基本可以分为以下4种
1.Identity
2. GUID
3. 数据库MaxID算法
4.程序生成Id

如果在数据量不大,没有性能问题时,主键用那种一其实都没什么很大问题,如果数据量大,不得不考虑分布式数据库时,主健设计就显的非常重要,如果前期考虑不周到,后期扩展就会变得非常麻烦,甚至根本没办法扩展,现在简单分析一下这几种类型优缺点

Identity
优点:
       使用方法,性能好

缺点:
      1.多个数据库做数据库群,没办法弄
      2.数据脚本导入麻烦(比如要把开发库的数据库脚本要升级到生产库时,很麻烦)

GUID
   优点:
         1.多个数据库做数据库群,方便
         2.数据脚本导入方便
  缺点:
        1.性能不好(在园子里看到很多园友,说得他一文不值,其实,我现在的系统20W数据没有感到很差的性,当然可能数据太小了,到成百上千W可能就问题大了,呵呵)

数据库MaxID算法

     优点:
         1.多个数据库做数据库群,方便
    缺点:
        1.如果记录非常大的话,那么Max()也会影响效率的;更严重的是并发性问题,如果同时有两人读到相同的Max后,加一后插入的ID值会重
        2.数据脚本导入麻烦(比如要把开发库的数据库脚本要升级到生产库时,很麻烦,手动更改主键)
  程序生成Id(自制加一,生成数字主键)
       优点:
          1.多个数据库做数据库群,方便
          2.查询性能好
       缺点:
           1.实现起来麻烦
           2.数据脚本导入麻烦(比如要把开发库的数据库脚本要升级到生产库时,很麻烦,手动更改主键)
以上分析,都是个人见解,难免有错,有错望各位指出,感激不尽
经过分析,我选择了GUID和程序生成Id,为后选方案,其实我更倾向用 程序生成Id方案,对于程序生成Id中的数据脚本导入的麻烦的问题,可以通过开发小工具来解决,我主要担心,还在性能方面,性能主要表现在,程序生成Id实现是通过是建一个特别的表,字段为:表名,当前序列值。这样在往表中插入值时,先从此表中找到相应表的最大值后加一,进行插入根本不能缓存,每次数据有插入操作时,都要去更那个表,在并发量大时,会不会性能很差。
另外,有园友提出,程序生成Id,按日期或是其它方式生成字符串的主键,我觉得这种方式,跟GUID生成方式,没什么两样,我们要生成数字型的主键主要是为了在大表连结的性能考虑的用字符的失去他的好处.不知道各位园友,在这方面的解决方案是什么,请多多指教,谢谢

参考资料

http://zhenyulu.cnblogs.com/articles/25326.html

http://www.cnblogs.com/chuncn/archive/2009/04/21/1440233.html

http://database.51cto.com/art/200611/35274.htm

http://tintown.cnblogs.com/archive/2005/03/02/111459.aspx

http://www.cnblogs.com/houleixx/archive/2008/12/13/id_and_guid.html

posted @ 2010-11-24 23:24  天朝子民  阅读(2172)  评论(17编辑  收藏  举报