程序员应知??数据库设计的两个误区
作者:网络转载 发布时间:[ 2011/10/10 13:28:23 ] 推荐标签:
误区之二 有意义的编码
现象描述:
使用有意义的编码作为一条记录的ID,甚至作为数据库的主键存在,例如,一个员工的编码设置为0203004,其中02代表员工所在分公司,03代表员工所在部门,004代表员工进入到该部门的序号。
原因分析:
ID的设置方式大概有以下几种,一种是纯粹的流水号,从1开始,每次加1,或者对其将以改进,将数字转换成为字符串的格式,比方说“0000001”;一种是无意义的随机编码,比方说GUID;还有一种是有意义的编码,特定的位数会代表一定的意义。
我想之所以大家这么喜欢使用这种方式,主要是因为想要从编码中能够得到一些信息,甚至有些程序中还有专门的对编码进行解析的模块。像我们的身份证号码一样,看到身份证号可以知道办身份证时的所在地、生日、性别等信息。
问题所在:
其实有意义的编码会导致很多问题,请看:
问题一:对编码资源的浪费。如果是纯粹的流水号,那么从1到10000可以代表一万条记录,但是,如果使用有意义的编码,很可能1000条记录会让五位的编码不够用。我遇到过真正的情况,我们公司的投保单号码的第一位是有意义的,代表的时该投保单所属的渠道,后面跟着很长的一串数字(9位)。理论上来说,这些编码永远都不会用完,但是,开始的三个渠道使用的是1、4、7三个编码,但是一次新保险法的实行,导致原有的投保单作废,于是又启用了三个数字2、5、8,接下来公司改名,三个渠道又分别将投保单报废,重新启用新的开头数字,这样,短短的几年间,所有的投保单号码全都被用完了,其实打印出来的投保单不过100万张。
问题二:不一定是的,难以作为主键。想一下,我们的身份证号码是这样的。原先15位的时候,后三位是序号,而男性会使用奇数,女性会使用偶数,这样是说,一个地区同生日的人,男女都不能超过500人,否则会导致号码的重复,尽管出现这种现象的概率比较低,但是还是客观存在的。
问题三:代表的意义不一定准确。比方说用带有意义的编码来为员工定义工号,其中可能会有部门、职务等等意义,但是如果员工在部门间发生了调动,或者职级发生了改变,是否需要改变他的编码呢?改变吧,那么所有的历史数据都要随之修改一次,工作量会非常大;不改变吧,那么代表的意义不再准确,我们无法从编码中得到该员工准确的信息。
解决方案:
所以,对于编码,非常不建议使用有意义的编码,要么使用纯粹的流水号,但这样可能需要定义一个范围比较大的类型,对于海量记录的数据,可能会不够用;那样的话可以使用GUID,这样编码永远都不会重复,而且会有大量的编码资源可用。
从上面的两点我们可以看出,在数据库设计的过程中,有一些在非常多系统中都使用了,但是却带来了很多问题的方法,对于这种情况,我们应该仔细思考,然后痛下决心,坚决抵制。

sales@spasvo.com