NF: Normal Form, 范式
1NF, 第一范式
# 概念
1NF指的是表的属性(即列)具有原子性, 不可再分
# 反例
id name mail_sex
1 wyx wyx@163.com_男
# 正例
id name mail sex
1 wyx wyx@163.com 男
2NF, 第二范式
# 概念
2NF指的是在1NF的基础上, 不能有部分依赖(部分依赖的前提是有组合主键, 也就是非主键属性不能只依赖部分主键)
如果是单一主键, 则符合第二范式
# 反例(该表有两个主键, 学生编号和教师编号, 但是学生姓名只依赖于学生编号, 教师姓名只依赖于教师编号, 这就是部分依赖)
student_id(PK) teacher_id(PK) student_name teacher_name
1001 001 zhangsan wanglaoshi
# 正例(应该拆分成两张表)
student_id(PK) student_name
1001 zhangsan
teacher_id(PK) teacher_name
001 wanglaoshi
3NF, 第三范式
# 概念
3NF指的是在2NF的基础上, 非主键字段和主键字段不能产生传递依赖
# 反例(classname依赖于classid, classid依赖于主键id, 这就是传递依赖)
id(PK) name classid classname
1 wyx 101 1班
# 正例
id(PK) name classid(FK)
1 wyx 101
classid(PK) classname
101 1班
# 概念
通常情况下表的设计要按照3NF, 有时候会例外, 反三范式会提高查询的效率
# Example
现在有两个表, 一个相册表, 一个图片表, 一个相册表中包含很多图片,
相册表中的view(浏览次数)是可以遍历图片表推导出来的, 但是这样会造成查询效率很低,
所以反三范式, 在相册表中加一个view属性, 提高了查询效率.
id(PK) name view
1 相册1 30
id(PK) name view albumid(FK)
10 1.jpg 30 1