范式和反范式

来源:互联网 发布:rf手游网络错误 编辑:程序博客网 时间:2024/05/20 08:44

范式:

1.第一范式(确保每一列的原子性,都是不可再分的)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

例如在存储学生信息时,学生的姓名和学号需要分开存储而不是存储在同一列中。

2.第二范式(确保每一列的值都与主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

例如在存储学生和学生所属班级时,我们设计表项为:(学生学号(主键),学生姓名,所属班级班号,班级人数)

在上述设计中,班级人数和学生学号(主键)是不相关的,所以这样的设计不符合第二范式,应该另建一张班级表,把班级人数放在班级表中,学生表引用班级表中的外键。

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

第一种说法:在数据表中不存在依赖传递例如A和B相关,B和C相关,那么不能把ABC都放在同一个表中。也就是表中的所有项都要与主键之间相关。

第二种说法:表项中不存在冗余的内容(自认为描述这种比较恰当)。


范式的优点:

范式的更新操作通常较快

当设计比较好的符合范式时,很少或者没有重复的数据,所以修改更少的数据

范式化的表通常较小,可以放在内存中缓存,速度更快

范式的缺点:稍微复杂的查询可能在数据库中关联许多表


反范式是针对范式的缺点,再设计时允许违反范式,而达到更好的效率。

例如将一些不直接关联的数据放在同一张表中,在查询时就不需要关联,只需要在一张表里查询,而在一张表里查询,通常情况下使用的是顺序I/O,速度就会较快。



0 0
原创粉丝点击