ER图
E-R
E-R
Entity/Relationship
实体(方形):
- 和table的设计不同, Entity的属性只包含和自己有关的部分. 如teacher表里有dept_name属性,但是E-R图里应该把dept拿出来做一个teacher和department之间的relationship
关系(菱形):
属性:
- primary key加下划线,多值属性用
{phone}
这样代表一个集合 - 实体的属性写在框里面relationship的额外属性,用虚线连出一个方框
Constraints
mapping cardinality
一对一,一对多,多对一,多对多
- ER图上用箭头表示,箭头指向"1"
或者也可以用l..r
表示 1..*
表示对应1~无数个。
participation
- total participation: 若一个实体集全部参与到关系中,要用两条线
- partical participation 部分参与
Weak Entity set*
弱实体集weak entity set:一些实体集的属性不足以形成主键
- 用于表示一些关系中的依赖性,弱实体集需要和强实体集关联才有意义 如course和section. section的主键是(course_id,sec_id,year),包含了course的主键course_id. 不存在没有class的section
- 被依赖的强实体集叫做identifying entity set, 对应的关系叫做identifying relationship
- 那么就把属于强实体集的属性course_id放到实体course里面, 弱实体section只存储其他的属性(用下划线标识,称为discriminator/partial key)
- 经常出现在一对多的关系中,在ER图中需要用双菱形表示identifying relationship
Reduction to schema*
怎么把E-R图转化为sql的表
- 每个实体集(矩形)都建一个表
- 强实体集直接用原来的属性建表
- 弱实体集=某个强实体集的属性+partial key
- 每个关系(菱形)根据mapping判断
- 多对多一定要单独建表 如
advisor(s_id,i_id)
那就有student,instructor,advisor 3个表 - 一对多: 大部分情况不建表,把"一"作为"多"的foreign key. 如
[instructor]--<inst_dept>-->[department]
. 那就instructor(dept_name)
但是单横线可能会引入null值, 如果不想要null值, 可以单独建表也可。 - 弱实体集的identifying relationship不用建表(建弱实体集的表就可以了)
- 多对多一定要单独建表 如
- 组合属性: 取最底层的信息
- 多值属性(
{}
) 单独建表:每个值占一行。如一个老师有多个电话,建一个表phone(teacher_id,phone_number)
Aggregation
画一个框 看成虚拟entity (见作业题?)