三个基本概念
Entity
Entity Set表示一类事物,类似于面向对象中类的概念,而Entity Instance表示一个具体的事物,类似于对象的概念。
Entity中可以有属性(Attribute),也可以与其他Entity之间存在关系(Relationship)。在设计数据库时,一个Entity Set通常就是一个数据表,而Entity Instance就是表中的具体数据。
Strong & Weak
Entity可以分为Strong Entity(强实体)和Weak Entity(弱实体)。如果一个Entity可以独立存在,则称为Strong Entity,反之,如果一个Entity必须依赖于其他Entity,则称为Weak Entity。Weak Entity必须与若干个Strong Entity之间存在依赖关系。
ER图
在ER图中,Strong Entity用实线绘制的矩形表示,其中的主键属性用下划线标识。Weak Entity则用双层实线绘制的矩形表示,并且其中的主键用虚下划线标识。依赖关系则用双层实线绘制的菱形表示,并且由于每个Weak Entity Instance都需要依赖至少一个Strong Entity Instance,因此二者之间为强制参与关系。
Relationship
Relationship(关系)表示Entity之间的交互,Relationship同样可以分为Relationship Set和Relationship Instance。例如在teacher和student两个Entity之间存在teach关系,这是一个Relationship Set,而具体哪个老师教哪个学生则是一个Relationship Instance。由此可以看出,在设计数据库时,一个Relationship Set也可以用一个数据表来表示。但在大多数情况下没有这种必要。
当Relationship单独成表时,表中需要包含数数据有相互交互的两个Entity的主键,以及Relationship自身的属性。
在实际数据库的设计中,对于一对一关系,直接将任意Entity Set的主键以及关系自身的属性作为属性添加到另一个Entity Set中即可。对于一对多关系,需要将“一”的Entity主键以及关系属性作为属性添加到“多”的Entity中。对于多对多关系,则需要专门创建一个新表保存双方的主键的关系自身的属性。
Role表示Entity中参与Relationship的属性,对于二元和多元属性来说,role通常都是Entity各自的主键,因此通常不用标识。而对于一元关系来说,role通常为Entity自身的主键以及有主键生成的另一属性,通常需要标识。
分类
根据关系涉及的Entity种类,可以分为Unary Relationship(一元关系),Binary Relationship(二元关系)以及Ternary Relationship(多元关系),其中二元关系(即有两种Entity参与的关系)最为常见。
按照映射关系,关系可以分为一对一关系,一对多关系和多对多关系。
根据参与限制,可以分为Mandatory Participate Relationship(强制参与关系)以及Optional Participate Relationship(可选参与关系)。
ER图
在ER图中,关系使用实线绘制的菱形表示。除了Weak Entity与Strong Entity之间的依赖关系用双层菱形表示。关系的属性写在单层实线绘制的矩形中,并通过虚线与关系连接。
关系通过实线与相关的Entity连接,在连接线上可以标识关系对应的role。连接线的箭头表示映射关系,对于一对一关系,双方的连接线均有箭头,对于一对多关系,只有“一”的一方有箭头,对于多对多关系,双方均无箭头。
可选参与关系用单实线表示,强制参与关系用双实线表示。在实线上除了可以标识role,还可以添加一些简单的映射限制,用m…n表示。其中m和n分别表示对应侧Entity Instance参数数量的最小值和最大值。当n为*时表示无限制。
Attribute
属性(Attribute)隶属于实体或关系,某些特定的属性可以被称为Key(键)。
分类
按照结构类型,属性可以分为Simple Attribute(简单属性)和Composite Attribute(复杂属性)。简单属性就是普通的属性,例如生日、性别等。复杂属性由多个简单属性组成,例如地址属性可以由国家、省份、城市、街道等简单属性组成。
按照值类型,属性可以分为Single-valued Attribute(单值属性)、Multivalued Attribute(多值属性)、Derived Attributes(派生属性)以及Null Attribute(空属性)。其中单值属性就是基本的属性,只能有一个值。多值属性可以有多个值,例如一个人可以有多个电话号码,因此电话号码就是人的多值属性。如果一个属性可以通过其他属性推导得出,那就称为派生属性,例如可以通过一个人的生日推导出他的年龄,年龄就是一个派生属性。而如果一个属性可以为Null,则称为空属性。
ER图
在ER图中,Primary Key(主键)用下划线表示。
Entity中的属性标注在矩形内部的Entity Name之下,简单属性占据一行,用属性名表示。复杂属性占据多行,首行为复杂属性名,后续每一行用每个隶属于复杂属性的属性名表示,除首行外都要添加一个缩进。多值属性用花括号{}包裹的属性名表示。派生属性则在属性名之后添加一个小括号。
ER图示例
EER Model
EER(Extend Entity Relationship)Model是ER Model的补充版本。主要添加了Entity的继承和聚合的概念。
与OOP中的Class类似,被继承的Entity称为Super Entity,继承之后的称为Sub Entity。
在ER图中,继承关系用带空心箭头的实现表示,箭头指向Super Entity。Sub Entity有着Super Entity的所有属性。
Aggregation(聚合)指的是将一个关系和与其相关的所有Entity视作一个整体,当做一个新的Entity并可以参与其他关系的概念。
Relation Schema
我们使用ER图的目的就是为了设计关系型数据库,而Relation Schema(关系模式)就是关系型数据库表的直接体现。当我们得到了一组Relation Schema,也就得到了一组关系型数据库的基本结构。
简单来说,Relation Schema的结构就是 table_name(item_name1, item_name2, item_name3…)
ER图与Relation Schema之间的映射关系:
- 对于Strong Entity,一个Entity Set就是一个表,每个Attribute为一列,主键同样用下划线表示。
- 对于Weak Entity,一个Entity Set同样是一个表,每个Attribute一列,同时还要将依赖的Entity的主键作为Weak Entity主键中的一列。
- 对于Composite Attribute,直接将其展开,每个子属性作为一列。
- 对于Multivalued Attribute,需要将其视作一个Entity和Multivalued Attribute之间的一对多关系。因此需要为Multivalued Attribute成立一个新的数据表,并将原Entity的主键作为一列添加到数据表中。
- 对于One-to-One Relationship,需要将任意一方Entity的主键作为一列添加到另一Entity表中。
- 对于One-to-Many Relationship,需要将One侧的主键作为一列添加到Many侧Entity的表中。
- 对于Many-to-Many Relationship, 需要以Relationship的名字创建一个新表,表中的字段为两侧Entity的主键,以及Relationship自身的属性。
- 对于Sub Entity,需要为其建立一个新表,表中包含所有Sub Entity引入的新属性,并将Super Entity中的主键作为一列。
- 对于Aggregation,由于其涉及的Entity已经超过两个,需要为其设立新表,其中包含所有涉及的Entity的主键。
总的来说,在转换过程中,每个Entity会被转换成一个数据表,一对一关系和一对多关系会被转换为数据表中的一列或几列,而多对多关系则会用额外的数据表表示。复杂属性会被展开,多值属性会被转换为一对多关系,并为属性创建一个新表。
数据库设计
在设计完Relation Schema之后,数据库的基本结构就已经定下来了,接下来只需要按照每个字段的实际数据为其设计数据类型以及NULL或NOTNULL属性,并根据后续使用需求为其添加合适的索引,即可完成数据库的设计。