基本概念
- Entity(实体):对象,如学生、教师,用方形表示
- Entity Set(实体集):类
- 一个实体集必须至少有一个非主键的属性
- 或者它是多对一/多对多关系中的“多”
- Attribute(属性):如学号、姓名,用圆形表示
- Relationship(关系):两个实体间的关系,用棱形表示
关系
- “一对一”关系可以看作是“多对一”关系的特殊情况
- 注意在“一”的实体集合内可以有空的,如one-one中的b,如果实体集合内每一个元素都有且仅有一个实体与它对应,则该“一”用圆箭头表示
子类
- 继承关系:用三角形表示
- 子类继承父类的所有属性,还可以有自己的属性
Constraint 约束
Entity Integrity 实体完整性
- 每个实体集必须有一个主键,不可以为空,不可以重复
- 主键用下划线表示
- 主键可以是一个或多个属性
- 有继承关系的实体,主键必须在父类上,该主键是父类和所有子类的主键
Referential Integrity 参照完整性
- foreign key(外键):一张表中的某个属性是参照另一张表的主键,则称该属性为外键
- 外键必须取参照关系中的某个主键值,或者为空
Weak Entity Set 弱实体集
- 确定该实体集需要依赖该实体集的主键和另一个实体集的主键,那么该实体集是一个弱实体集
- 弱实体集用双边方形表示,两个实体集之间的关系用双边棱形表示
- 两个实体集之间的关系称为支持联系
设计原则
- 避免冗余
- 当增加一个属性就可以时,不要增加一个实体集
- 小心使用弱实体集
ER模型转化为关系模型
关系的转化
- 关系的表中,属性有其连接的实体集合的主键和关系上的属性
- 在“多对一”关系中,可以把关系的表合并到“多”的一方。如在下图中,我们不需要额外增加一张表Favorite(drinker, beer),而是合并到Drinkers表中,Drinkers(name, addr, favorite_beer)
- 在“多对多”关系中,如果按照上述方法合并,会造成冗余
弱实体集的转化
- 对于弱实体集,它的属性还需要包括支持实体集的主键
- 不需要为支持联系额外设置一张表
子类的转化
- OO方式:子类继承父类的所有属性,这样可能造成冗余
- Product(name, price, category, manufacturer)
- EducationalProduct(name, price, category, manufacturer, ageGroup, topic)
- SoftwareProduct(name, price, category, manufacturer, platforms, requiredMemory)
- EducationalSoftwareProduct(name, price, category, manufacturer,ageGroup, topic, platforms, requiredMemory)
- ER方式:子类只继承父类的主键,这样避免了冗余,但查询的时候可能需要多表查询
- Product(name, price, category, manufacturer)
- EducationalProduct(name, ageGroup, topic)
- SoftwareProduct(name, platforms, requiredMemory)
- 空值方式:只有一张表,允许出现空值,但浪费空间
- Product(name, price, category, manufacturer,ageGroup, topic, platforms, requiredMemory)