[MySQL] 数据库设计
一.范式
1.范式的概念
数据库的范式是一组规则
在设计关系数据库时 , 遵循不同的规范要求 , 设计出合理的关系型数据库 , 这些不同的规范要求被称为不同的范式
关系型数据库有 六种范式 : 第一范式(1NF) , 第二范式(2NF) , 第三范式(3NF) , 巴斯-科特范式(BCNF) , 第四范式(4NF) , 第五范式(5NF,又称完美范式)
越高的范式数据库冗余越小 , 并且普遍认为范式越高对数据关系有更好的约束性 , 但是 也可能导致 IO 更繁忙 , 因此在实际应用中 , 数据库设计通常只需满足第三范式
2. 第一范式
- 数据库表的每一列都是不可分割的原子数据项 , 而不能是集合 , 数组 , 对象等非原子数据
- 在关系数据库中 , 满足第一范式是对关系模式的基本要求 ; 即 : 不满足第一范式的数据库就不能称作关系数据库
- 在关系型数据库中 , 每一列都可以用基本数据类型表示 , 就天然满足第一范式
示例 : 定义一个学生表 , 需要记录学生信息和学校信息
正例 :

反例 :

3.第二范式
- 在满足第一范式的基础上 , 不存在 非关键字段 (非主键字段) 对候选键 (主键 , 外键 , 唯一键) 的部分函数依赖(只对复合主键中的一个主键有依赖关系) ; 存在于 表中定义了符合主键的情况下
- 第二范式强调的是部分函数依赖 , 当一个列中没有复合主键或主键只有一列时 , 那么就天然满足第二范式
示例 : 学⽣可以选修课程,课程有对应的学分,学⽣考试后每⻔课程会产⽣成绩
正例 :

按照这三个表来创建关联关系
反例 :

- 这张表使用学号+课程名定义复合主键来唯一标识一个学生某门课程的成绩
- 学生时通过学号来确定的 , 学生的姓名,年龄,性别和课程没有关系 , 即学生的信息只依赖于学号 , 不依赖于课程名 ; 学分时通过课程来确定的 , 课程的学分于学生没有关系 , 即学分只依赖于课程名 , 不依赖于学生
- 对于使用复合主键的表 , 如果一行数据中的有些只能 与 复合主键中的一个和或其他列有关系 , 那么就说明存在部分函数依赖 , 不满足第二范式
注意 : 不满足第二范式时可能出现的问题
1.数据冗余
部分记录重复出现 , 造成了大量的数据冗余
2.更新异常
如果要调整 学分 这一列 , 就需要将所有关于 这门课的记录进行修改 , 一旦执行中断导致某些记录更新失败 , 就会造成表中同一门课程出现不同学分的情况 , 出现数据不一致的问题
3.插入异常
如果某一门课程没有参加考试 , 那么在表中就没有这位同学对应这门课程的成绩是不存在的
4.删除异常
如果把已经毕业的学生的成绩删除 , 则会把课程和学分的信息删除掉 , 导致一段时间内 , 数据库中没有某门课程的成绩和学分等信息
4.第三范式
在满足第二范式的基础上 , 不存在非关键字段 , 对任一候选键的传递依赖
示例 :

把学院信息拆分出来定义学院表 , 学生与学院表做关联
反例

- 因为是要描述学生信息 , 并且在表中定义了 ID 为主键 ; 在这个表中可以看出学生的学号,姓名,年龄,性别是与 ID 强相关 ; 学院电话,学院地址是与学院强相关 ; 在一张表中出现了两个强相关的关系 , 而且这两个强相关关系又存在传递现象 , 即通过学生 ID 可以找到学生记录 , 学生记录中包含学院名 , 每个学院又有电话 ; 这种传递现象称为传递依赖 , 所有不满足第三范式
二.设计过程
1.从现实业务中抽象得到概念类
- 概念类是在需求分析阶段就确定下来的
- 类对应了数据库中的实体 , 实体对应了数据库中的表
- 类中的属性对应实体中的属性 , 实体属性对应表中的列
2.确定实体与实体之间的关系 , 画出 E-R 图 , 方便项目参与人员理解和沟通
3.根据 E-R 图完成 SQL 语句的编号并创建数据库
三.实体-关系图
1.E-R 图的概念
实体关系图 , 简称 E-R 图 , 也称作实体联系模型 , 实体关系模型 ; 是一种用于描述数据模型的概念图 , 主要用于数据库设计阶段
2.E-R 图的基本组成
包含了以下三种基本成分 :
- 实体 : 即数据对象 , 用矩形框表示 , 比如用户,学生,班级等
- 属性 : 即实体的特性 , 用椭圆或圆角矩形表示 , 比如学生的姓名 , 年龄等
- 关系 : 即实体之间的联系 , 用菱形框表示 , 并表名关系的类型 , 并用直线将相关实体与关系连接起来
3.关系的类型
- 一对一关系 (1:1)
- 一对多关系 (1:N)
- 多对多关系 (N:N)
