数据库主键的设计和思考 (二)

2014-11-24 09:52:41 · 作者: · 浏览: 1
能变成一个登录名对应两条记录,因此可以使用其作为主键。另外,例如“一号通用户信息表”中,“一号通号码”肯定是唯一的,因此也可作为主键。

3.5 GUID主键

目前一个比较好的主键是采用GUIDGlobally Unique Identifier,全球唯一标识符),GUID的特点如下:

(1) 在空间上和时间上具有唯一性,保证同一时间不同地方产生的数字不同;

(2) 世界上的任何两台计算机都不会生成重复的GUID值;

(3) 需要GUID的时候,可以完全由算法自动生成,不需要一个权威机构来管理;

(4) GUID的长度固定,并且相对而言较短小,非常适合于排序、标识和存储。

可以将GUID主键定义为字符型,但值由GUID生成,GUID是可以自动生成,也可以程序生成,而且键值不可能重复,可以解决系统集成问题,几个系统的GUID值导到一起时,也不会发生重复,就算有“o”老数据也可以区分,而且效率很高。在SQL里也可以使用 NewID()生成。主要优点是:

1)同 IDENTITY 列相比,uniqueidentifier 列可以通过 NewID() 函数提前得知新增加行的ID,为应用程序的后续处理提供很大方便;

2)便于数据库移植,其它数据库中并不一定具有 IDENTITY 列,而 GUID列可以作为字符型列转换到其它数据库中,同时将应用程序中产生的GUID值存入数据库,它不会对原有数据带来影响。

缺点是:

1GUID值较长,不容易记忆和输入,而且这个值是随机、无顺序的。

2GUID的值有16个字节,与其它诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键,可能会带来两方面的消极影响:存储空间增大、索引时间较慢。

基于上面的分析,使用GUID的利大于弊,笔者推荐可以采用此种方式。

3.6 自制唯一字符型主键

为了系统集成等的方便,笔者建议将主键定义成字符型,可以使用GUID作为主键,也可以定义一个字符型的主键字段,但是它的值使用变成编程指定。该种方式的优点是:

1)在异库异构数据库的情况下,若旧系统这些表的主键ID是自增的(数值型),而新系统生成的主键是比较长的字符串型(例如15位),那样旧系统生成或之前的旧数据同步到新系统时,都不会冲突。

这种方式的缺点是:

(1) 需要程序能生成定长的唯一字符串,例如:当前时间+自动机号+进程ID+……;

(2) 由第三方系统生成或手动生成该主键时,处理比较麻烦。

3.7 总结

在上面几种主键中,较为常用的是“3.1 自增主键”和“3.5 GUID主键”,当在有些特殊的表和某些特定情况中,也可以采用“3.4 具有实际意义的主键”和“3.6 自制唯一的字符型主键”。

4、 参考文档

1)《主键设计用什么字段类型比较好》:http://www.2cto.com/database/201110/108039.html

2)《主关键字_百度百科》:http://baike.baidu.com/view/68068.htm

3)《GUID_百度百科》:http://baike.baidu.com/view/185358.htm