范式
要求:后一范式都是在前一范式已经满足的情况下用来“加强要求”。
第一范式(1NF)
原子性:存储的数据应该具有“不可再分性”
不良做法示例:
例如:如果要查询籍贯是江西的学生,就需要把所有的学生字段查询出来,然后做字符串的切割,最后再比较查询的籍贯是“江西”。
可见,其违反了原子性性范式:学生字段的数据存储多个可分的数据。
修改后:
第二范式(2NF)
唯一性:消除非主键依赖连个主键中的部分字段
需要实现每一行数据具有唯一可区分的特征,并不能有部分依赖关系
- 通常,给一个表加主键,就可一做到“唯一可区分”
- 但是主键有这样的情况:
- 1.设定一个字段为主键:此时,表示该一个字段的值就可以明确确定一行数据。
- 2.设定多个字段为主键(联合主键):表示只有这多个字段的值都确定后才能确定一行数据。
不良做法:
改良后:
第三范式(3NF)
独立性:消除传递依赖(非主键值不依赖于另一个非主键值,都应该依赖于主键)
常见错误:
- C依赖B,B依赖A——这就是传递依赖。
则消除该传递依赖的的通常做法,就是将C依赖于B的数据,分离到另一个表中。
不良例子:
改良后:
总结
通常,在实践中,满足3范式只要做到“一个表只存一种类型数据”基本就可以实现。
另外,范式不是绝对要求,有时候我们为了数据的使用方便,还会(需要)故意违反范式。