范式:
1.第一范式(确保每一列的原子性,都是不可再分的)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
例如在存储学生信息时,学生的姓名和学号需要分开存储而不是存储在同一列中。
2.第二范式(确保每一列的值都与主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
例如在存储学生和学生所属班级时,我们设计表项为:(学生学号(主键),学生姓名,所属班级班号,班级人数)
在上述设计中,班级人数和学生学号(主键)是不相关的,所以这样的设计不符合第二范式,应该另建一张班级表,把班级人数放在班级表中,学生表引用班级表中的外键。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第一种说法:在数据表中不存在依赖传递例如A和B相关,B和C相关,那么不能把ABC都放在同一个表中。也就是表中的所有项都要与主键之间相关。
第二种说法:表项中不存在冗余的内容(自认为描述这种比较恰当)。
范式的优点:
范式的更新操作通常较快
当设计比较好的符合范式时,很少或者没有重复的数据,所以修改更少的数据
范式化的表通常较小,可以放在内存中缓存,速度更快
范式的缺点:稍微复杂的查询可能在数据库中关联许多表
反范式是针对范式的缺点,再设计时允许违反范式,而达到更好的效率。
例如将一些不直接关联的数据放在同一张表中,在查询时就不需要关联,只需要在一张表里查询,而在一张表里查询,通常情况下使用的是顺序I/O,速度就会较快。