热门关键字:  项目经理  分析师  CEO  中间件  报名费





完整性控制

来源: 作者: 时间:2008-04-02 点击:

DBMS的完整性控制机制应具有三个方面的功能:


⑴ 定义功能,提供定义完整性约束条件的机制.


⑵ 检查功能,检查用户发出的操作请求是否违背了完整性约束条件.


⑶ 保护功能,如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性.


完整性约束条件包括有六大类,约束条件可能非常简单,也可能极为复杂.一个完善的完整性控制机制应该允许用户定义所有这六类完整性约束条件.
检查是否违背完整性约束的时机通常是在一条语句执行完后立即检查,我们称这类约束为立即执行约束(Immediate Constraints).有时完整性检查需要延迟到整个事务执行结束后再进行,检查正确方可提交,我们称这类约束为延迟执行约束(Deferred Constraints).如银行数据库中"借贷总金额平衡"就是延时执行约束.从帐号A转帐到帐号B是一个事务,从帐号A转出后帐不平衡,必须等到转入帐号B后才能平衡,这时才能进行完整性检查.如果违背了完整性约束条件,系统将拒绝操作,对于延迟执行约束,系统将拒绝整个事务,把数据库恢复到事务前的状态.


关系系统中,最重要的完整性约束是实体完整性和参照完整性,其他完整性约束条件则可以归入用户定义的完整性.


实体完整性:基本关系的所有主属性都不能取空值,以便唯一地标识实体.


参照完整性:若属性或属性组F是基本关系R的外码,它与基本关系S的主码K相对应,则对于R中的每个元组在F上的值必须为空值或等于S中某个元组的主码值.其中S和R可以是同一关系.参照完整性定义了外码和主码之间的引用规则.


用户定义完整性:除了实体完整性和参照完整性外,针对某一具体的关系数据库,如果需要一些特殊的约束条件,用户可以自行定义其约束条件.


目前DBMS系统中,提供了定义和检查实体完整性,参照完整性和用户定义完整性的功能.对于违反实体完整性和用户定义完整性的操作,一般拒绝执行,而对于违反参照完整性的操作,不是简单的拒绝,而是根据语义执行一些附加操作,以保证数据库的正确性.


下面详细讨论实现参照完整性要考虑的几个问题.


1. 外码能否为空值问题


例如:学生-班级关系中,学生关系student和班级关系class,其中class关系的主码为班级号cno,student关系的主码为学生号sno,外码为班级号cno,称class为被参照关系,student为参照关系.student关系中某一元组的cno列值若为空值,表示这个学生还没有分配到任何班级.这个和应用环境的语意是相符的,因此student的cno列可以取空值.


在客户-订单关系中,包含客户关系client和订单关系order,client关系为被参照关系,其主码为客户编号cno.order为参照关系,主码为订单编号ono,外码为订单客户编号cno.若order中元组的cno为空值的话,则表明存在没有客户的订单.这与实际的应用环境是不相符合的,因此order的cno列不能取空值.
因此在实现参照完整性时,系统除了提供定义外码的机制外,还应提供定义外码是否允许空值的机制.


2. 在被参照关系中删除元组的问题


当删除被参照关系的某个元组时,而参照关系存在若干元组,且其外码值与被参照关系中删除元组的主码值相同.如:员工和部门关系,部门dept关系中,部门编号dno是主码;员工employ关系中,员工编号eno是主码,员工所在部门dno是外码,对应dept中的主键.删除dept部门编号dno=9999的部门,而employ中存在dno=9999的8名员工.这时可有三种不同的删除策略:


(1)级联删除(CASCADES)


将参照关系外码值与被参照关系中要删除元组主码值相同的元组一起删除.如上例中,删除关系dept中dno=9999的部门,同时删除employ中8名dno=9999的员工.


(2)受限删除(RESTRICTED)


仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才执行删除操作,否则拒绝此删除操作.如上例中,删除关系dept中dno=9999的部门时,检查employ中是否有dno=9999的员工,如果有则不能删除,只有先删除employ中dno=9999的8名员工,然后才能删除关系dept中dno=9999的部门.


(3)置空值删除(NULLIFIES)


删除被参照关系的元组,并将参照关系中相应元组的外码值置空值.如上例中,删除关系dept中dno=9999的部门时,检查employ中是否有dno=9999的员工,如果有将employ中dno=9999员工的dno设置为NULL.


3. 在参照关系中插入元组时的问题


当参照关系插入某个元组,而被参照关系不存在相应的元组.如向关系employ中插入部门编号dno=9999,员工编号eno=1968的元组(1968,9999),而关系dept中没有dno=9999的部门.这时可有以下两种插入策略:


(1)受限插入


仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才允许插入,否则拒绝插入.在上例中,系统拒绝插入employ元组(1968,9999),因为被参照关系dept中没有dno=9999的元组.


(2)递归插入


首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组.在上例中,系统先在dept中插入dno=9999的元组,然后在关系employ中插入元组(1968,9999).


4. 修改关系中主码的问题


(1)不允许修改主码


在有些RDBMS中,不允许修改关系主码.如上例中不能修改dept关系中的部门编号dno.如果要修改,只能先删除,然后再增加.


(2)允许修改主码


在有些RDBMS中,允许修改关系主码,但必须保证主码的唯一性和非空,否则拒绝修改.当修改的关系是被参照关系时,还必须检查参照关系.如上例中修改dept中的dno=9999为dno=8888,检查employ关系中是否有dno=9999的元组,如果存在,则与删除策略相同.当修改的关系是参照关系时,要检查被参照关系.如学生-选课关系中,选课关系elective中的学生号sno和课程号cno联合为主码,sno也是外码,对应student中的学生编号sno.如果选课elective关系中的(90211111,20,90)改为(90212222,20,90),检查student关系中是否存在sno=90212222的主码值,否则与插入策略相同.


从上面的讨论我们看到DBMS在实现参照完整性时,除了要提供定义主码,外码的机制外,还需要提供不同的策略供用户选择.选择哪种策略,都要根据应用环境的要求确定.





最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
企业电子商务

赞助商