关系数据库建模
数据库建模是指针对一个给定的应用环境构造数据库模式,建立数据库及其应用系统,能够有效地存储数据,满足用户的应用需求。明确Web系统的业务需求后,关系数据库建模通常由以下两步完成。
- 设计E-R图:构造一个反应现实世界实体之间关系的模型。
- 关系表设计:将E-R图转换为关系表,并定义列类型,建立主键、外键等各种约束。
1. 设计E-R图
E-R图,即实体-关系(Entity-Relationship)图。
- 实体:客观存在的事物、事件、角色等,如老师、订单
- 实体属性:用于描述实体的特性,每个实体可以有多个属性。比如老师的性别、年龄等
- 关系:反应两个实体之间客观存在的关系
实体关系分为以下3类:
- 一对一关系:实体A至多只有一个实体B与之关联,实体B至多只有一个实体A与之关联。例如:人和身份证、你和女朋友
- 一对多关系:实体A可以有零个、一个或者多个实体B与之关联,而实体B之多只有一个实体A与之关联。例如:人与银行卡
- 多对多关系:实体A可以有零个、一个或者多个实体B与之关联,且实体B可以有零个、一个或者多个实体A与之关联。例如:学生和课程
在E-R的绘制中,常用方块表示实体,实体周围的圆圈表示属性,实体之间的菱形表示关系。
上图中定义了4个实体和3个关系
四个实体:老师、课程、学生、学生证
三个关系:
课程与学生多对多
学生与学生证一对一
课程与老师一对多(学校规定一个老师只能教一门课,一个课由多个老师来教)
2. 关系表设计
完成了E-R图设计之后,可以进行关系表的具体设计。
- 数据库选型,例如MySQL、SQL Server、Oracle、PostgreSQL等。
- 将每个实体转换为一个数据表,将实体的属性转化为该表中的列,为每个列定义相应的数据类型。
- 对于有1:1关系的两个表,为两个表设置相同的主键列。
- 对于1:N关系的两个表,在N表中添加一个外键列,该项与1表的主键相关联。
- 对于M:N关系,生成一个单独的表表示该关系,该关系的列由两个表的主键组成。
- 重新审查所有的表,对需要的地方添加约束,对常用的条件字段设置索引。
通过上述步骤,生成4个实体表和1个关系表。
课程表
老师表
学生表
学生证
enroll
在以上表定义中,注意关系的表达方法。
- 表student和表card通过设置相同的主键(student_id)实现了1:1的关系
- 表teacher中通过设置外键course_id实现了与课程1:N关系
- 表enroll实现了“学生”与“课程”的M:N关系
参考自《Python高效开发实战》刘长龙著