数据库主键设置探讨

2013-06-25 08:45刘敏
中国信息化·学术版 2013年3期
关键词:数据库

刘敏

【摘 要】数据库应用程序涉及到计算机软件应用的方方面面,很多人在开发数据库应用程序时受到数据库表主键设置的影响,导致开发过程遇到不少的麻烦,本文就关系型数据库的表主键设置的必要性、类型、策略等方面作出探讨。

【关键词】数据库 主键 主键设置策略

【中图分类号】TP3 【文献标识码】A 【文章编号】1672-5158(2013)03-0122-02

“工欲善其事,必先利其器”这句话表明工具的重要性,其实也反映了在一个工程项目中基础工作的重要性。同样,在关系型数据库应用程序开发中,我们首先要解决的问题就是数据库的设计,而其中表主键设置的好坏更是决定着程序设计的方便性及效率性,它是一个绕不开的问题。

一、主键的必要性

有些人在设计数据库时纠结要不要设置主键,那就先让我们理清以下两点:

1.什么是主键

主键,又称主码。数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

2.主键的必要性

从主键的定义可以看出,主键可以唯一标识一行记录,所以可以确保执行数据更新、删除的时候不会出现重复及张冠李戴的错误。另外主键的值不能为空,主键往往与外键共同作用,用以保证数据表信息的完整性。而且这些限制可以通过数据库系统做到,不需要另外编写程序来完成,所以为表设置相应的主键是必要的。

二、自然键还是代理键好

有些人会告诉你,你应该使用自然键来作主键,也有人说你应该总是使用代理键作主键,所以首先要确定用自然键还是用代理键来作主键的问题。现实的情况是,自然键和代理键有各自的优点和缺点,并且没有哪一种是完美的,换句话说,你要根据你自己在软件设计中的需求来选择。

1.自然键

自然键也叫业务主键。在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(Natural Key)”。自然键,这是一个主键的属性,它也往往是实体的一个现实中存在的属性,它的好处是,它们已经存在,你并不需要另外引入一个新的“非自然”值到你的数据架构中,而且这种主键见名识义;另外用户通常都是对业务相关的字段进行查找(比如员工的工号,书本的 ISBN No. ),自然键能够实现聚集存放,对于索引及查找的效率是比较高的。

它的缺点也是来自它的业务含义,这种主键信息能有效地耦合到数据库中,业务主键一旦改变则系统中关联该主键的部分的修改将会是不可避免的,并且引用越多改动越大,例如:学生退学,记录删除,学生又回来复读,要用回以前的学号;又如原来学号是数字型的,现决定改为字符型,你首先必需修改学生基本信息表中“学号”的数据类型,然后还要修改所有关联表中的外键数据类型,所以对于以后可能要变动的属性作为主键,对于众多关联表来说维护起来十分麻,毕竞没有任何一个业务是永远不变的。

2.代理键

代理键也叫逻辑主键。在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。它是引入一个新的数据项作为主键,这是一个没有业务含义的主键。例如在学生基本情况表中,我们新增一数据项studentID,它不是学生的学号,在这种情况下,学生学号已经成为一项非键列。

代理键强调主键不应该具有实际的意义,它刚好与自然键是的定义相反,例如订单表中的“订单编号”字段,而这个字段符合自然键的定义,它在订单信息表中具有唯一性,能够唯一标识记录,但是不建议用“订单编号”字段作为主键的,因为具有实际意义的字段,具有“意义更改”的可能性。现实情况是,原先输入某一订单,后来因某一原因该订单作废,并重新生成订单,而且订单号要保持原订单号一致,这样原来的主键就面临危险了。代理键的好处是对于数据表的维护处理方便,当要增加记录时,生成代理键的值是一个新的键值,与原有数据不存在冲突问题。当然,缺点是,这种主键在一定程度增加了表的复杂度。

相比代理键而言,使用业务主键的主要原因或好处是,增加逻辑主键就是增加了一个业务无关的字段,而用户通常都是对于业务相关的字段进行查找(比如员工的工号,书本的 ISBN No. ),这样我们除了为逻辑主键加索引,还必须为这些业务字段加索引,这样数据库的性能就会下降,而且也增加了存储空间的开销。所以对于业务上确实不常改变的基础数据而言,使用业务主键不失是一个比较好的选择。

因此,使用自然键还是代理键,主要取决于系统规模的大小及日后的变动性,对于小项目,以后扩展不会很大的话,也允许用实际唯一的字段作主键的,否则,使用代理键更利于适应未来不确定的变化。

三、采用单列键还是复合键作为主键

所谓复合主键即联合主键,是通过两个或者多个字段的组合作为主键。

使用复合主键的主要原因和使用业务主键是相关的,在业务主键只使用一个字段不能解决问题情况下,那就只能使用多个字段了。例如在学生成绩管理系统中,有几个表分别是学生(学号,姓名,…)、课程(课程编号,课程名称,…),学生成绩(学号,课程编号,学期号,…),在学生成绩表中使用学号不够用了,要加上课程号,另外还要加上学期号(可能存在同一课程两个学期开设情况)。这种使用复合主键方式存着在几点弊端:

1.数据存储冗余:随着这种主从关系的延伸,必然导致数据库中需要重复存储的数据变大,当主表本身就是复合主键时,关联的从表中要重新存储该主键字段一次,存在多级关联时就更明显。原因是:复合主键导致不良的外键。

2.SQL命令复杂化及效率降低:当存在复合主键时,SQL语句长度增加;同时,联合主键自动生成联合索引,需要将主表的多个字段与子表的多个字段关联以获取满足某些条件的所有详细情况记录。

3.程序复杂度增加:需要设置及传递多个参数。

使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键。

由此可见,单列主键还是比较简单的,特别是对于提高连接和筛选操作的效率而言有优势。

四、几种主键策略的选择

主键设置存在多种策略可以选择,我们可以对比下几种常用策略的优缺点,以利于我们做出选择。

1.编号作主键

此方法就是采用实际业务中的唯一字段的“编号”作为主键设计,也就是自然键方式,在各种实体信息中都存在相应编号,如学生编号,公民身份证编号,员工编号等,在小型的项目中是推荐这样做的,因为可以使项目比较简单化,但在使用中隐含一些麻烦,它的缺点存在两个方面:

—当业务要求编号可以重复时造成存储不了的情况

对涉及编号数据定义改变时需要大量修改关联表引用的外键的定义这个问题在上面自然键中已作出说明。

2.自动编号主键

这种方法就是新建一个ID字段,自动增长,众多数据库系统都可以定义自动增长型主键,方便且满足主键的原则。优缺点如下:(下转59页)

■系统集成问题

由于主键生成脱离了系统中的自动生成方法,在与其他系统集成时,很难保证自制表中的最大值与导入后的保持一致。在导入时,为了区分新老数据,可能会在老数据主键前统一加一个“o”(old)来表示这是老数据,但又会遇到数字型问题。解决办法是,在“自制加一”中把主键设为字符型的,字符型主键可以应付很多我们意想不到的情况。

五、GUID主键

采用GUID主键,优点是:主键值可以自动生成,也可以程序生成,GUID具有唯一性,在任何情况下,可以产生全球唯一的值。当要求从另一个系统中导入数据,键值不可能重复,可以解决系统集成问题。缺点是:GUID值太复杂,不易记忆,而且数据太长,影响数据库效率及增加存储空间。

小结:

由此可见,主键的设置没有固定方式,选择什么样的主键原则还是要根据项目的情况:项目的大小,项目的扩展情况,项目的数据系统的合并或变更情况,主要原则是考虑数据处理的方便性及效率性。

猜你喜欢
数据库
Designer测试大数据预定义均衡配置
MemSQL获3000万美元D轮融
数据库
数据库
数据库
数据库
数据库
数据库
SQL语言在电信业务数据库数据查询中的应用
数据库