E-R模型
即实体-联系模型
《Oracle入门很简单》第二章
实体-联系模型,即E-R模型。数据库总是存储现实世界中有意义的数据,而现实世界是由一组实体和实体的联系组成的。
实体和联系的概念
实体(Entity)
实体是客观存在的事物。属性(Attribute)是实体的特征;属性总是具有取值范围的,属性的取值范围称为属性的值域(Domain)。
一个实体必然有区别于其他实体的唯一标识属性;这样的属性称作实体的码(Key)。当然实体的多个属性的组合也可成为实体的唯一标识。
实体的码与其他属性的组合称为超码(Super Key)。
候选码:
联系
联系是两个实体间的关联。联系分为三类:
- 一对一联系(one-to-one):
一个实体集与另一个实体集之间是一一对应的关系。例如:一个国家只能有一个元首,一个元首也只能属于一个国家。 - 一对多(one-to-many) :
例如:一个班级包含多个学生,而一个学生只能属于一个班级。 - 多对多(many-to-many):
例如:一个学生可以选择多门课程,而一门课程也可有多个学生选择。
E-R图
E-R图是表示实体-联系模型的常用手段。
实体联系符号
在E-R图模型中,
- 实体符号用一个矩形表示,并标以实体名称。
- 属性利用椭圆形表示,并以属性名称。
- 联系利用菱形表示,并以联系名称。
A[实体符号]
B((属性符号))
C{联系符号}
属性依赖于实体的存在而存在,因此属性往往依赖于实体。
B((属性1)) --- A
C((属性2)) --- A
D((属性3)) --- A
E((属性n)) --- A
A[实体]
联系也是具有属性的。比如,当建立了联系后,才产生的附加属性;比如:校长与学校建立了联系后,将产生附加属性,如入职日期、绩效考核等;这两个属性与校长这个实体没有必然的联系,不属于校长本身的属性信息;与学校也没有必然的联系。只有学校与校长建立了联系之后,这两个属性才会有意义。
B((姓名)) --- A
C((年龄)) --- A
D((性别)) --- A
E((学历)) --- A
G((入职日期)) --- F
A[校长] --- |1| F{管理}
H((绩效考核)) --- F
J((校名)) --- I
K((级别)) --- I
F --- |1| I[学校]
L((地址)) --- I
M((电话)) --- I
一对一联系
B((姓名)) --- A
C((年龄)) --- A
D((性别)) --- A
E((班级)) --- A
A[学生] --- |m| F{选课}
H((得分)) --- F
J((课程名)) --- I
F --- |n| I[课程]
L((得分)) --- I
M((是否必修)) --- I
多对多联系
E-R 图示例
图略
如果两个实体之间是一对多或者多对多联系,那么,可以分别利用1..n和m..n来标识。
E-R模型到关系模型
关系数据库都采用关系模型。在关系模型中,一张二维表对应一个表格。二维表的每行代表一个实体,每个实体的列代表该实体的属性。
E-R图用于描述实体及实体间的联系,E-R图最终需要转换为关系模型才有意义。
实体集转换为关系
只需将实体的属性作为关系的列即可;当然这里的属性应该包括实体的所有属性。另外,主键(实体的主码)也是必须的,及时这样的主键与业务无关。
联系转换为关系
转换会稍微复杂一点。
一对一联系
需要将其中一个实体的主码(或者候选码)作为另一个实体的属性。反映到关系当中,将一个关系的主键作为另一个关系的普通列。另外,联系本身所具有的属性也应该以列的形式植入。
对于一对一联系,可以将主从关系进行颠倒(调换)。
一对多联系
一对多联系需要将"一方"作为主关系,将"多方"作为从关系;联系的所有属性作为从关系的列。这样才不会导致信息丢失。
比如学生与班级,学生表中保存班级ID(主关系的主码)和联系的属性。
多对多联系
多对多联系中,无论将联系的属性加入哪一方,都将造成信息的丢失。此时应当为联系创建独立的关系。该独立的关系,可以分别与两个实体构成一对多关联。
可以将两个实体的主码都加入该新的关系中,并将联系所有的属性也都作为关系的列。
全局关系模型
全局关系模型只需将局部关系模型进行组合即可。
总结联系转换为关系
对于E-R图中的联系,则应当按照联系的类型进行区别对待:
- 如果实体集A与实体集B时间时一对一关系,则有三种方式可以采用。
- 将实体集A的主键作为实体集B的关系列,一建立二者的关联。由联系产生的属性,也作为关系B的列。
- 颠倒顺序,将实体集B的主键及联系的属性值入关系A中。
- 建立新的关系,该关系包含实体集A及实体集B的主键,然后将联系的属性也植入整个新关系中。
- 如果实体集A与实体集B之间是一对多联系,则有两种方式可以采用。
- 将实体集A的主键作为实体集B的关系列,以建立二者的关联。有联系产生的属性,也作为关系B的列。但是不能将二者进行颠倒处理。
- 建立新的关系,该关系包含实体集A及实体集B的主键,然后将联系的属性也植入整个新关系中。
- 如果实体集A与实体集B之间是多对多联系,则只有一种方式可以采用。
- 建立新的关系,该关系包含实体集A及实体集B的主键,然后将联系的属性也植入整个新关系中。
范式
关系模型最终要转换为真实的数据表。数据表的设计除了要综合考虑整个数据库布局,还需要遵循数据库设计的范式。
第一范式
其定义为,数据库中的列(或者说实体中的属性)都是单一属性,不可再分。也就是说每个列均包含唯一的语义。
第二范式
第二范式建立在第一范式的基础之上。其定义为,数据库表中不存在非关键列对任一关键字的部分函数依赖,也即所有非关键列都完全依赖于任意一个关键字。 (在联合主键时,要特别注意这一点)
非关键列对关键字(可能是联合主键)若存在部分依赖;将造成如下问题:
- 数据冗余
- 更新异常。例如:当更新某门课程的学分时,将会由多条记录被同时更新。
- 删除异常。例如:将课程信息都一并存储在该表中,当删除所有学生选课信息时,学校所开设的该课程信息也会不复存在。
- 插入异常。将课程信息都一并存储在该表中,当没有学生选课时,学校也不能开设一门新的课程(考虑它是联合主键,学生学号也是构成主键的)。
解决部分依赖的方法是拆分数据表。
第三范式
第三范式建立在第二范式的基础之上。其定义为,数据表中如果不存在非关键列对任意关键字的传递函数依赖,则符合第三范式。
所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。
BCNF范式
BCNF范式是建立在第三范式的基础之上,并具备了更加严格的限制。