E-R模型

Published: by Creative Commons Licence

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图中的联系,则应当按照联系的类型进行区别对待:

  1. 如果实体集A与实体集B时间时一对一关系,则有三种方式可以采用。
    • 将实体集A的主键作为实体集B的关系列,一建立二者的关联。由联系产生的属性,也作为关系B的列。
    • 颠倒顺序,将实体集B的主键及联系的属性值入关系A中。
    • 建立新的关系,该关系包含实体集A及实体集B的主键,然后将联系的属性也植入整个新关系中。
  2. 如果实体集A与实体集B之间是一对多联系,则有两种方式可以采用。
    • 将实体集A的主键作为实体集B的关系列,以建立二者的关联。有联系产生的属性,也作为关系B的列。但是不能将二者进行颠倒处理。
    • 建立新的关系,该关系包含实体集A及实体集B的主键,然后将联系的属性也植入整个新关系中。
  3. 如果实体集A与实体集B之间是多对多联系,则只有一种方式可以采用。
    • 建立新的关系,该关系包含实体集A及实体集B的主键,然后将联系的属性也植入整个新关系中。

范式

关系模型最终要转换为真实的数据表。数据表的设计除了要综合考虑整个数据库布局,还需要遵循数据库设计的范式。

第一范式

其定义为,数据库中的列(或者说实体中的属性)都是单一属性,不可再分。也就是说每个列均包含唯一的语义。

第二范式

第二范式建立在第一范式的基础之上。其定义为,数据库表中不存在非关键列对任一关键字的部分函数依赖,也即所有非关键列都完全依赖于任意一个关键字。 (在联合主键时,要特别注意这一点)

非关键列对关键字(可能是联合主键)若存在部分依赖;将造成如下问题:

  • 数据冗余
  • 更新异常。例如:当更新某门课程的学分时,将会由多条记录被同时更新。
  • 删除异常。例如:将课程信息都一并存储在该表中,当删除所有学生选课信息时,学校所开设的该课程信息也会不复存在。
  • 插入异常。将课程信息都一并存储在该表中,当没有学生选课时,学校也不能开设一门新的课程(考虑它是联合主键,学生学号也是构成主键的)。

解决部分依赖的方法是拆分数据表。

第三范式

第三范式建立在第二范式的基础之上。其定义为,数据表中如果不存在非关键列对任意关键字的传递函数依赖,则符合第三范式。
所谓传递函数依赖,指的是如果存在“A → B → C”的决定关系,则C传递函数依赖于A。

BCNF范式

BCNF范式是建立在第三范式的基础之上,并具备了更加严格的限制。