https://blog.csdn.net/ljp812184246/article/details/50706596
1NF,2NF,3NF,BCNF,4NF,5NF:
5 范式:https://www.cnblogs.com/leodaxin/p/7425580.html
一般到 BCNF 就足够了

三大范式:

1NF:

每个属性(字段)都不可再分,即一个字段不能表示多个属性
image.png

2NF:

属性完全依赖于主键,消除部分子函数依赖。即对组合主键来说,其他属性不能只依赖主键中的某一个
组合主键:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

应该分成三个表:

  • 学生:Student(学号, 姓名, 年龄)
  • 课程:Course(课程名称, 学分)
  • 选课关系:SelectCourse(学号, 课程名称, 成绩)

所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

例子:一个订单有多个产品
image.png
优化:使用中间表,进行多对多的关联
image.png

3NF:

属性不依赖于其他非主属性,消除传递依赖。即提取子表,使用外键,减少冗余
(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)

应该分成两个表:

  • 学生:(学号, 姓名, 年龄, 所在学院);
  • 学院:(学院, 地点, 电话)

image.png

BCNF:

不存在任何字段任一候选关键字段传递函数依赖
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)

改进:
仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

优点:

  • 保证数据的一致性
    • 数据冗余
    • 插入异常
    • 删除异常

缺点:

  • 多表查询,查询性能降低。提高 sql 复杂度

反范式:

冗余
一次查询,不需要关联表操作

优点:

  • 提升查询性能