数据库完整性(Database Integrity)是指数据库
中数据在逻辑上的一致性、正确性、
有效性和
相容性。数据库完整性由各种各样的
完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。数据库完整性约束可以通过
DBMS或
应用程序来实现,基于DBMS的完整性约束作为模式的一部分存入数据库中。通过DBMS实现的数据库完整性按照
数据库设计步骤进行设计,而由应用软件实现的数据库完整性则纳入应用软件设计(本文主要讨论前者)。
原理
数据库完整性对于
数据库应用系统非常关键,其作用主要体现在以下几个方面:
1.数据库完整性约束能够防止
合法用户使用数据库时向数据库中添加不合语义的数据。
2.利用基于DBMS的
完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的
运行效率。同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。
3.合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能。比如装载大量数据时,只要在装载之前临时使基于DBMS的数据库完整性约束失效,此后再使其生效,就能保证既不影响
数据装载的效率又能保证数据库的完整性。
4.在应用软件的功能测试中,完善的数据库完整性有助于尽早发现应用软件的错误。
数据库完整性约束可分为6类:列级静态约束、元组级静态约束、关系级静态约束、列级动态约束、元组级动态约束、关系级动态约束。动态约束通常由应用软件来实现。不同DBMS支持的数据库完整性基本相同。
关系模型
关系完整性的用于保证数据库
中数据的正确性。系统在进行更新、插入或删除等操作时都要检查数据的完整性,核实其
约束条件,即
关系模型的完整性规则。在关系模型中有四类完整性约束:
实体完整性、
域完整性、
参照完整性和用户定义的完整性,其中实体完整性和参照完整性约束条件,称为关系的两个不变性。
实体
关系数据库的完整性规则是
数据库设计的重要内容。绝大部分
关系型数据库管理系统RDBMS都可自动支持关系完整性规则,只要用户在定义(建立)表的结构时,注意选定
主键、
外键及其参照表,RDBMS可自动实现其完整性约束条件。
(1)
实体完整性(Entity Integrity)。实体完整性指表中行的完整性。主要用于保证操作的数据(记录)非空、且不重复。即实体完整性要求每个关系(表)有且仅有一个主键,每一个主键值不允许为“空”(NULL)或重复。
(2)
实体完整性规则要求。若属性A是基本关系R的
主属性,则属性A不能取
空值,即主属性不可为空值。其中的空值(NULL)不是0,也不是空隔或空字符串,而是没有值。实际上,空值是指暂时“没有存放的值”、“不知道”或“无意义”的值。由于主键是实体数据(记录)的惟一标识,若主属性取空值,关系中就会存在不可标识(区分)的实体数据(记录),这与实体的定义矛盾,而对于
非主属性可以取空值(NULL),因此,将此规则称为实体完整性规则。如学籍关系(表)中主属性“
学号”(列)中不能有空值,否则无法操作调用学籍表中的数据(记录)。
域完整性
域完整性(Domain Integrity)是指数据库表中的列必须满足某种特定的
数据类型或约束。其中约束又包括
取值范围、精度等规定。表中的CHECK、FOREIGN KEY 约束和DEFAULT、 NOT NULL定义都属于域完整性的范畴。
参照完整性
参照完整性(Referential Integrity)属于表间规则。对于永久关系的
相关表,在更新、插入或删除记录时,如果只改其一,就会影响数据的完整性。如删除父表的某记录后,子表的相应记录未删除,致使这些记录称为孤立记录。对于更新、插入或删除表间数据的完整性,统称为参照完整性。通常,在客观现实中的实体之间存在一定联系,在关系模型中实体及实体间的联系都是以关系进行描述,因此,操作时就可能存在着关系与关系间的关联和引用。
在关系数据库中,关系之间的联系是通过公共属性实现的。这个公共属性经常是一个表的主键,同时是另一个表的外键。参照完整性体现在两个方面:实现了表与表之间的联系,外键的取值必须是另一个表的主键的
有效值,或是“空”值。
参照完整性规则(Referential Integrity)要求:若属性组F是
关系模式R1的主键,同时F也是关系模式R2的外键,则在R2的关系中,F的取值只允许两种可能:空值或等于R1关系中某个主键值。
R1称为“被参照关系”模式,R2称为“参照关系”模式。
注意:在实际应用中,外键不一定与对应的主键同名。外键常用下划曲线标出。
用户定义完整性
用户定义完整性(User-defined Integrity)是对
数据表中字段属性的约束,用户定义完整性规则(User-defined integrity)也称域完整性规则。包括字段的
值域、字段的类型和字段的有效规则(如小数位数)等约束,是由确定关系结构时所定义的字段的属性决定的。如,百分制成绩的取值范围在0~100之间等。
设计阶段
一个好的数据库完整性设计首先需要在
需求分析阶段确定要通过数据库完整性约束实现的业务规则,然后在充分了解特定DBMS提供的
完整性控制机制的基础上,依据整个系统的
体系结构和性能要求,遵照
数据库设计方法和应用
软件设计方法,合理选择每个业务规则的实现方式;最后,认真测试,排除隐含的约束冲突和性能问题。基于DBMS的数据库完整性设计大体分为以下几个阶段:
需求分析
经过
系统分析员、数据库
分析员、用户的共同努力,确定
系统模型中应该包含的对象,如人事及
工资管理系统中的部门、员工、经理等,以及各种业务规则。
在完成寻找业务规则的工作之后,确定要作为数据库完整性的业务规则,并对业务规则进行分类。其中作为数据库模式一部分的完整性设计按下面的过程进行。而由应用软件来实现的数据库完整性设计将按照
软件工程的方法进行。
概念设计
概念结构设计阶段是将依据
需求分析的结果转换成一个独立于具体DBMS的
概念模型,即
实体关系图(ERD)。在概念结构
设计阶段就要开始数据库完整性设计的实质阶段,因为此阶段的
实体关系将在
逻辑结构设计阶段转化为实体完整性约束和参照完整性约束,到逻辑结构设计阶段将完成设计的主要工作。
逻辑设计
此阶段就是将概念结构转换为某个DBMS所支持的
数据模型,并对其进行优化,包括对关系模型的规范化。此时,依据DBMS提供的完整性
约束机制,对尚未加入逻辑结构中的完整性约束列表,逐条选择合适的方式加以实现。
在逻辑结构设计阶段结束时,作为数据库模式一部分的完整性设计也就基本完成了。每种业务规则都可能有好几种实现方式,应该选择对数据库性能影响最小的一种,有时需通过实际测试来决定。
设计原则
在实施数据库完整性设计的时候,有一些基本的原则需要把握:
1.根据数据库完整性约束的类型确定其实现的系统层次和方式,并提前考虑对
系统性能的影响。一般情况下,静态约束应尽量包含在数据库模式中,而动态约束由应用程序实现。
2.实体完整性约束、参照完整性约束是
关系数据库最重要的完整性约束,在不影响系统关键性能的前提下需尽量应用。用一定的时间和空间来换取系统的易用性是值得的。
3.另一方面,
触发器的多级触发不好控制,容易发生错误,非用不可时,最好使用Before型语句级触发器。
4.在
需求分析阶段就必须制定完整性约束的命名规范,尽量使用有意义的
英文单词、缩写词、表名、列名及
下划线等组合,使其易于识别和记忆,如:
CKC_EMP_REAL_INCOME_EMPLOYEE、PK_EMPLOYEE、CKT_EMPLOYEE。如果使用CASE工具,一般有缺省的规则,可在此基础上修改使用。
5.要根据
业务规则对数据库完整性进行细致的测试,以尽早排除隐含的完整性约束间的冲突和对性能的影响。
6.要有专职的
数据库设计小组,自始至终负责数据库的分析、设计、测试、实施及早期维护。数据库设计人员不仅负责基于DBMS的数据库完整性约束的设计实现,还要负责对应用软件实现的数据库完整性约束进行审核。
7.应采用合适的CASE工具来降低数据库设计各阶段的工作量。好的CASE工具能够支持整个数据库的
生命周期,这将使数据库设计人员的
工作效率得到很大提高,同时也容易与用户沟通。