实体-联系模型中的连接陷阱及解决方法
李俊平
(深圳职业技术学院软件工程系,广东深圳 518055)
摘要:本文介绍了实体-联系模型中出现的扇形陷阱和深坑陷阱,分析了两种连接陷阱产生的原因及导致的后果并提出了问题的解决方法。
关键字:实体-联系模型; 连接陷阱; 扇形陷阱; 深坑陷阱
Connection Traps in Entity-Relationship Model and it’s Solution
LI Jun – ping
(Software Engineering Department ,Shenzhen Polytechnic,Shenzhen 518055,
Abstract:This paper introduce the fan and chasm traps in ER models,analyse the causes and problems of connection traps,and present the solution for the problems.
Keywords:Entity-Relationship;Connection traps;Fan Traps;Chasm Traps
1 引言
由于对某些实体之间联系的理解不正确,可能使设计的数据库概念模型出现连接陷阱(Connection Traps),两种常见的连接陷阱是扇形陷阱和深坑陷阱。连接陷阱出现的原因是在数据库概念建模阶段对某些实例之间的联系理解出现偏差或不完整,这将直接导致某些用户事务无法实现或事务结果是错误的。
2 扇形陷阱(Fan Traps)
扇形陷阱的出现是当用ER模型表示实体间的联系时,某些特殊实体的实例之间的通路是不明确的。
当一个实体与其它实体之间存在二个或更多的一对多联系时,就可能存在扇形陷阱。例如图1所示的用IDEF1x方法的符号表示的ER模型中,系部实体和学生实体之间是一对多的联系,系部实体和专业实体之间也是一对多的联系,而学生和专业之间没有联系。将这样的设计转化为关系后,如果有一个用户事务要查询某一个学生属于哪一个专业将无法得到正确的结果。因为一个系部可能关联多个专业,一个学生可以通过学生和系部的联系确定属于哪个系,却无法确定属于哪个专业。例如学生S001和S002所属的专业不明确。
图 1(a) 扇形陷阱的ER图示例
图 1(b) 扇形陷阱关系实例
利用现有的联系连接三个关系,可以用以下的SQL语句
Select 系部.DeptNo,专业.MajorNo,学生.StuNo
From 系部,专业,学生
where 系部.DeptNo=专业.DeptNo and 系部.DeptNo=学生.DeptNo
连接后的结果如图2所示,显然一个学生不可能同时属于两个专业。因为学生实体和专业实体之间缺乏联系,使得这两个实体之间无法进行自然连接,因此导致错误的结果。
图 2 扇形陷阱导致的错误查询结果
由关系理论可以知道,以上查询要得到正确的结果,必须在学生、系部和专业三个关系连接后的泛关系模式中存在函数依赖StuNo→MajorNo。从ER图中看出,这种函数依赖并不存在。而且从现有的函数依赖StuNo→DeptNo和MajorNo→DeptNo也无法推导出所需的函数依赖。
解决方案之一就是在专业实体和学生实体之间设计一个一对多联系,如图3所示,也就是在泛关系模式中加入了函数依赖StuNo→MajorNo。这样我们就不但可以确定某一个学生属于哪个系,也能确定他属于哪个专业。当然这种设计其实有冗余的联系存在,因为学生和系部之间的联系是可以通过学生和专业之间以及专业和系部之间的两个联系推导出来,或者说,函数依赖StuNo→MajorNo和MajorNo→DeptNo可以推导出函数依赖StuNo→DeptNo。删除冗余的联系就得到我们的第二种解决方案,如图4所示。
图 3 扇形陷阱的解决方法1
图 4(a) 扇形陷阱的解决方法2
图 4(b) 扇形陷阱解决方案2的关系实例
对以上三个关系重新做连接查询
Select 系部.DeptNo,专业.MajorNo,学生.StuNo
From 系部,专业,学生
where 系部.DeptNo=专业.DeptNo and 专业.MajorNo=学生.MajorNo
就得到所期望的正确结果,如图5。
图 5 消除扇形陷阱后的查询结果
3 深坑陷阱(Chasm Traps)
深坑陷阱的出现是因为当一个模型暗示某些实体类型之间存在联系,而这些实体的某些实例之间却不存在相应的通路。
在关联实体的通路上存在一个或多个基数最小为0的联系时,就可能产生深坑陷阱。在图6所示的ER模型中,专业和教师之间是一对多的联系,教师和学生之间也是一对多的联系。但学生实体参与联系的最小基数是0而不是1,即学生实体对于联系的参与是不完全的。也就是说并不是每一个学生都参加了创新活动,没有创新作品的学生就没有指导教师。那么,我们如何确定没有指导教师的学生属于哪一个专业呢?例如学生S003所属的专业,从这个模型中我们无法得出结果,这就产生了深坑陷阱。
在图6所示的局部ER模型中,如果实体对联系的参与是不完整的,那么在该模型形成的泛关系中就可能存在空值。存在空值的泛关系就不等同于这个局部模型中所有实体的自然连接,即泛关系r≠r1 r2 … rn。所以有些用户事务的结果就是不明确的,包含空值的元组信息就会丢失。
图 6(a) 深坑陷阱的ER图示例
图 6(b) 深坑陷阱的关系实例
对以上三个关系进行连接查询
select 学生.StuNo,教师.TechNo,专业.MajorNo
from 学生,教师,专业
where 学生.TechNo=教师.TechNo and 教师.MajorNo=专业.MajorNo
得到的结果如图7所示,我们发现学生S003的信息丢失了。
图 7 深坑陷阱导致的错误查询结果
解决的方法其实也很简单,我们只要在专业和学生之间建立一个一对多联系就可以了,如图8所示。当然我们也可以在逻辑数据库设计中通过参与约束规定外键不能为空值,将实体对联系的可选参与约束为强制参与。
图 8(a) 深坑陷阱的解决方法
图 8(b) 深坑陷阱解除后的关系实例
重新进行连接查询
select 学生.StuNo,教师.TechNo,专业.MajorNo
from 学生,教师,专业
where 教师.MajorNo=专业.MajorNo and 学生.MajorNo=专业.MajorNo
就可以得到如图9的正确结果。
图 9 消除深坑陷阱后的正确查询结果
4 结论
ER模型中的连接陷阱将在数据库设计中留下隐患并将导致灾难性的后果,因此在概念建模阶段对实体间联系的正确理解显得尤为重要。对于连接陷阱的防范比较好的方法是通过需求阶段的用户事务来确定何检查实体间的联系,找出缺失何不合理的联系。为了防止扇形陷阱的出现,我们应该检查模型中由一个实体扇出的两个或多个多对一的联系,分析这些联系另一端的实体之间是否存在联系;而对于深坑陷阱的预防,我们应该着重检查一对多联系中不完全参与的实体,分析这些实体是否可能出现某些实例在联系中没有通路。解决连接陷阱的方法一般是在模型中增加相关实体之间的联系或重新设计合理的联系;也可以在逻辑数据库设计阶段通过关系的规范化以及约束机制来解决。
参考文献
[1] Thomas Connolly,Carolyn Begg著,何玉洁,梁琦等译.数据库设计教程[M].北京:机械工业出版社,2003.
[2] Thomas Connolly,Carolyn Begg著,宁洪译. 数据库系统——设计、实现与管理[M]. 北京:电子工业出版社,2004.
[3] Abraham Silberschatz,Henry E Korth,S.Sudarshan,杨冬青,唐世渭等译.数据库系统概念[M].北京:机械工业出版社,2003.