标签:
设计关系数据库时,需要遵从不同的规范要求以设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。
范式的作用:<减少><数据库中数据的冗余>,<增加><数据的一致性>.
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,还又称完美范式)。
第一范式
数据库表的<每一列><都是><不可分割的><原子数据项>,而不能是<集合>,<数组>,<记录>等<非原子数据项>。
即同一列中不能有多个值。
它确定了关系表中属性的"原子性".
比如某关系有属性"工资"包括基本工资和绩效工资
工资
-----------------------
基本工资 绩效工资
此关系就不满足第一范式(实际上,在关系数据库中,所有的关系均满足第一范式的要求,不满足第一范式的数据库不能称之为关系数据库。)
第二范式的概念为
第二范式是在第一范式的基础上发展起来的,<<非主键属性列>>必须<<完全函数依赖>>于<<主键列字段>>,而不能只与主键列的某一部分相关(主要针对联合主键而言).
第二范式在1NF基础上消除非主键列对主键列字段的部分函数依赖,这可以大大减少数据插入、删除异常等问题。
例如有选课关系表:学号,课程号,成绩,学分,,主键是复合主键:学号和课程号。但是由于非主键列学分仅仅依赖于课程号,对这个复合
主键只是部分依赖,而不是完全依赖,因此会导致数据冗余,
解决办法是将其分成两个表:学生表:学号,课程号,分数 第二个表是课程表、课程号,学分
第三范式消除了非主键列对主键列的传递函数依赖
任何非主键列不依赖于其它非主键列,也就是在满足2NF的基础上,任何非主键列不得传递依赖于主键列
(即不存在这种情况,关键字段->(决定)非关键字段1,非关键字段1->(决定)非关键字段2
即对于所有的非关键字字段,不存在某个非关键字字段决定另一个非关键字字段。
目的也是为了少存储冗余信息。
简单来说,就是:
第一范式:具有原子性
第二范式:主键列与非主键列遵循完全函数依赖关系
第三范式:非主键列之间没有传递函数依赖关系
巴斯-科德范式(BCNF)
Boyce-Codd Normal Form(巴斯-科德范式)
在1NF基础上,任何非主属性不能对主键子集依赖[在3NF基础上消除对主码子集的依赖]
反范式化:
但是其实并不是一定需要满足2NF,因为存储空间的节省和读取速度的效率是一个矛盾,像如果经常的需要两个大表的连接,
比如从一个表的user_id连接user表得到user_name,这样光为了读取一个username就必须把这两个表连接一次,
会导致读取速度的变慢,因此可考虑将username也保存进那个表中,这样虽然不满足2nf,但是会加快数据的读取速度。
标签:
原文地址:http://www.cnblogs.com/winner-0715/p/4891781.html