E-R模型和关系模型都是现实世界抽象的逻辑表示
- E-R模型并不被 DBMS直接支持,更适合对现实世界建模
- 关系模型是 DBMS直接支持的数据模型
基本 E-R图中的元素包括实体集、联系集、属性
椭圆框表示属性,矩形框表示实体集,菱形框表示联系
属性处理
关系模型要求关系的所有属性都是原子的。然而 E-R模型中的复合属性和多值属性不是原子的,E-R模型还允许出现派生属性,这三种属性需要特殊处理
(1)派生属性
派生属性的值可以通过计算得到,它的值不在数据库中存储,转换时直接忽略
(2)复合属性
采用"展平"技术:忽略复合属性本身,直接考虑它的成分属性。如果某个成分属性仍然是复合的,用相同方法处理
例如,考虑实体集职工复合属性"家庭住址",它包含成分属性省、城市、街道、邮政编码。在将该实体集转换成关系模式时,忽略复合属性"家庭住址",而直接使用成分属性省、城市、街道、邮政编码作为关系模式的属性
(3)多值属性
需要为每个多值属性 M创建一个关系
- 如果多值属性 M是实体集 E的属性,K是 E的主码,则关系 的属性由 M和 K组成
- 如果多值属性 M是联系集 R的属性,并且 R涉及实体集 E1,…,En,它们的主码分别是 K1,…,Kn,则关系 的属性由 M和 K1,…,Kn组成
注意:如果 M还是复合属性,则需要按复合属性的处理方法对 M做"展平"处理。关系 的码需要根据实际问题的语义确定。此外一旦为多值属性创建了关系,后续处理就不再考虑多值属性
例1、多值属性转换
如总图,Phones 是实体集 Departments 的多值属性,为其创建一个关系。由于 Phones还是复合属性,需要对它做"展平"处理:直接使用其成分属性 Office 和 Phone#。实体集 Departments 的码是 Dno。由此得到多值属性 Phones 的关系模式为:Phones(Phone#, Dno, Office)
假定每部电话都在一个院系的办公室,因此 Phone# 可以作为 Phones 的码
注意:这里把为多值属性 Phones 创建的关系用 Phones 命名。原则上如何命名没有规定,但是采用容易记忆的名字有助于理解,并且当多值属性是复合属性时,直接使用多值属性名作为关系名是方便的
实体集处理
强 / 弱实体集
一般地,如果一个实体集的任何属性集都不足以形成该实体集的码,则称该实体集为弱实体集。与此相对,存在码的实体集称为强实体集
弱实体集中的任何实体(简称弱实体)都不能独立地存在于系统中,即每个弱实体必须依赖于一个强实体。例如每个家属必须存在依赖于一个特定的职工(只有这样他才被公司视为家属),当一位职工离开公司,他的配偶和子女都不再被公司视为家属
- 弱实体集必须与另一个称为标识实体集或属主实体集的强实体集相关联才有意义
- 称标识实体集拥有它所标识的弱实体集,将弱实体集与其标识实体集相关联的的联系称为标识性联系
- 标识性联系是从弱实体集到标识实体集的多对一联系,并且弱实体集对该联系的参与是全部参与
在弱实体集中,如果它的一个属性集可以唯一确定 存在依赖于同一个强实体的弱实体,则称该属性集为弱实体集的分辨符。弱实体集的标识实体集的码和该弱实体集的分辨符共同形成弱实体集的码,弱实体集的分辨符又称弱实体集的部分码
每个强实体集用一个关系表示。实体集名可以作为关系名,实体集的全部属性构成关系的属性(复合属性按照前面的方法"展平"),实体集的码作为关系的码
每个弱实体集用一个关系表示。弱实体集名可以作为关系名,弱实体集存在依赖的标识实体集的主码和弱实体集的全部属性构成关系的属性(复合属性按照前面的方法"展平"),标识实体集的码和弱实体集的分辨符组合成关系的码。下图给出了强实体集职工和弱实体集家属转换后的关系模式
联系集处理
每个联系集用一个关系表示,但弱实体集与其标识实体集之间的存在依赖关系忽略
联系集名可以作为关系名,参与联系的诸实体集的主码和联系集的属性(复合属性按照前面的方法"展平")形成关系的属性
关系的码根据联系的类型按如下方法确定
联系集转关系时,先找到一个联系集,然后顺着连线找到关联的多个实体集。观察实体集间的连线:
- 连线的两端都有箭头,说明是一对一的联系,新的主码是两关系的候选码中的一个(两个候选码都画有下划线,但下划线不相连,具体哪个是主码,自定)
- 连线的一端有箭头,说明是一对多的联系,箭头一端是"单端",新的主码由"多端"实体集的码组成
- 连线两端都没箭头,说明是多对多的联系,新的主码由所有实体集的码组成
将基本 E-R图转换成关系模式
为了将联系转换成关系模式,要求参与同一联系的任何两个不同的实体集的主码都不包含相同的属性(这一点容易做到,属性是局部于实体集的,必要时可以对某些属性重命名)
假定复合属性已经"展平",多值属性创建了对应的关系。将 E-R模型转换成关系模式的方法如下
- 每个强实体集用一个关系表示
- 每个弱实体集用一个关系表示
- 将联系集用相应的方法转换成关系表示
- 如果两个关系具有相同的码,可以合并它们(这一步并非必须,但可以减少码重复存放空间开销,使查询可以更有效的求值)
例2、将总图转换成关系模式
总图的多值复合属性 Phones 得到关系模式:Phones(Phone#, Dno, Office)
总图没有弱实体集,由强实体集得到如下关系模式:
Departments(Dno, Dname)
Teachers(Tno, Tname, Sex, Birthday, Title)
Students(Sno, Sname, Sex, Birthday, Enrollyear, Speciality)
Courses(Cno, Cname, Perid, Credit)
其中每个关系模式都源于同名实体集,码用下划线标记。多值属性 Phones 不包含在关系模式 Departments 中,已经将它转换成关系模式
由联系集得到如下关系模式:
Manades(Dno, Tno)
Works_in(Tno, Dno)
Studies_in(Sno, Dno)
Teaches(Tno, Cno)
SC(Sno, Cno, Grade)
Evalues(Sno, Tno, Cno, Escore)
其中每个关系模式都源于同名联系集,码用下划线标记。Manages 和 Works_in 包含相同的属性,但它们含义不同,前者 Tno 表示作为系主任的教师对特定的"系"(用 Tno 表示)的管理,后者表示每位教师在一个特定的系工作
最后一步,合并具有相同码的关系模式(合并时可根据实际情况,也可根据题设要求)
Manages 可以和 Departments 合并,也可以与 Teachers 合并,前者有利于回答 "某系的主任是谁" 之类的问题,后者有利于回答 "某教师的系主任是谁" 之类的问题。前一类问题更常出现,采用前一种方法,得到关系模式 Departments(Dno, Dname, Dheadno)(把表示系主任的职工号的属性名 Tno 改为 Dheadno,使得属性的语义更清楚)
还有两对关系具有相同的码,Teachers 和 Works_in,Students 和 Studies_in,都可以直接合并。最终得到关系模式:
Departments(Dno, Dname, Dheadno)
Teachers(Tno, Tname, Sex, Birthday, Title, Tno)
Students(Sno, Sname, Sex, Birthday, Enrollyear, Speciality, Dno)
Courses(Cno, Cname, Perid, Credit)
Teaches(Tno, Cno)
SC(Sno, Cno, Grade)
Evalues(Sno, Tno, Cno, Escore)
Phones(Phone#, Dno, Office)