E-R实体集的转换
概念结构设计之后就是对E-R图进行逻辑结构设计:即将E-R图转化成关系的过程。逻辑结构设计主要用于数据库管理系统上,为了让数据在计算机系统中更好地表示。
此设计过程用到的数据模型有:除了前面讲过的关系模型还有层次模型、网状模型;和属于基于对象的的逻辑模型的E-R模型不同,它们都属于基于记录的逻辑模型。
在转换过程中有些名词需要做一些“变更”:
实体(实体集)
实体(集)的属性
实体(集)的标识符
实体(集)之间的联系
关系模式(表头)
属性(列名)
键(主键、外键、复合键等)
关系表间的参照完整性约束
示例:
E-R联系的转换
根据E-R的联系类型:一元、二元、三元,需要分类进行转换。其中一元和二元的转换是类似的,而三元需要先变成二元联系而后根据二元的转换规则进行。故只进行二元联系转换的介绍:
注:在此之前,我们已经进行了第一步——E-R实体集的转换。
二元联系包括包括1:1、1:n(或n:1)、n:n。
二元联系转换
1:1联系转换
只需要在两个中任选一个关系加入另一个关系中的主键,并且加上该联系自带有的属性。比如:
假设有两个关系:
Student(Sno, Sname, Sgender, Sage, Sdept)、StuCard(StuCardID, Cardbalance, CardExp)。
那么转换之后:
Student(Sno, Sname, Sgender, Sage, Sdept, StuCardID)、StuCard(StuCardID, Cardbalance, CardExp)
或者是:
Student(Sno, Sname, Sgender, Sage, Sdept)、StuCard(StuCardID, Cardbalance, CardExp, Sno )
什么叫该联系自带有的属性?不是指原有的关系中就有的属性,而是关系之间的联系可能产生的新属性。比如这两个表之间的联系是“持有”,但这个并没有额外的属性产生,但也能实现转换。
1:n(或n:1)联系的转换
就是在n端加入1端的主键,并且加上该联系自带有的属性。
假如有两个关系:学校和学生的关系是1:n
Student(Sno, Sname, Sgender, Sage, Sdept)、School(SchoolID, SchoolName, SchoolLocation)
转换之后:
Student(Sno, Sname, Sgender, Sage, Sdept、SchoolID)、School(SchoolID, SchoolName, SchoolLocation)
倘若是1端加入n端的主键,将会出现1端(比如学校ID)重复冗余的情况。
这里的联系是“录取”,学校录取学生,同样地,这个联系也没有额外的属性产生。
n:m联系的转换
通过新建一个关系模式,并且这个关系模式的属性由原来两个关系模式的主键和它们的联系自带有属性构成。
假如有两个关系,分别是学生表和选课表,而转换之后就会是一个新的关系叫成绩表,由于原有的两个关系之间的联系是“选课”,即学生选课。则该联系所带有的属性可能是“学生的课程成绩”。那么就可以有如下的转换过程:
原先的两个关系:
Student(Sno, Sname, Sgender, Sage, Sdept)、Course(Cno, Cname, Cpno, Ccredit)
转换结果(新的关系模式):
SC(Sno, Cno, Grade)
其实上面的1:1和n:1类型都能使用类似于第三种的方式进行:即建立一个新的关系。
比如1:1
新的是Hold(Sno, StuCardID)此外还有Student(Sno, Sname, Sgender, Sage, Sdept)、StuCard(StuCardID, Cardbalance, CardExp)
比如1:n
新的是Admission(Sno, SchoolID)此外还有Student(Sno, Sname, Sgender, Sage, Sdept)、School(SchoolID, SchoolName, SchoolLocation)
三元联系转换
E-R图可能是这样的:
同样地,我们先按照概念结构设计的步骤先完成到二元的转换,即生成一个新的实体集叫“修读计划”,如图所示。那么转换过程就是:
原先:
学生关系 Student(Sno, Sname, Sgender, Sage, Sdept)
课程关系 Course(Cno, Cname, Cpno, Ccredit)
学校关系 School(SchoolID, SchoolName, SchoolLocation)
先变成二元联系:
新的实体集:修读计划关系 Plan(PlanID, PlanName)
转成二元关系:遵循“包含原关系的主键和联系自带有属性”
包含关系 Contain(PlanID, Cno),
制定关系 MakePlan(PlanID, SchoolID)
选择关系 SelectPlan(PlanID, Sno)