范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、巴斯-科德范式(BCNF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF,又称完美范式)。通常所用到的只是前三个范式。
第一范式(1NF)
每一列都是不可分割的原子数据项(强调的是列的原子性,即列不能够再分成其他几列)
例如:一个表:学号,姓名,系(系主任,系名),课程名称,分数;这个表中的系这一列还可以被分成两列不符合原子性了
把这个表变成学号,姓名,系主任,系名,课程名称,分数;就符合了。但是只是这样的话数据冗余太多,接着往下看
第二范式(2NF)
在1NF的基础上,非码属性必须完全依赖与码(在1NF基础上消除非主属性对主码的部分函数依赖)
函数依赖:例如:(属性)学号可以确定(属性)姓名的值,就说姓名依赖与学号
码:如果一张表中,一个属性或者属性组,被其他属性完全依赖,则称这个属性为该表的码;例如:学号,课程
主属性:码属性组中的所有属性;
非主属性:除了码属性组的全部属性
表中的非码属性现在是部分依赖与码,而不是完全依赖。如:姓名只依赖主属性中的一部分。
将两个表进行拆分:课程表:【学号,课程名称,分数】学生表:【学号,姓名,系名,系主任】这样设计分数就完全依赖主属性了
第三范式(3NF)
在2NF基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)
如2NF设计的表中:学生表:【学号,姓名,系名,系主任】系主任依赖于系名
在进行拆分:学生表:【学号,姓名,系名】系表【系名,系主任】这样就ok了数据的冗余也减少了许多,按照三大范式设计的数据库表,对数据库进行CRUD时,都不会出现太大的问题。
以上是自己学习完总结的一些,可能有些地方说的不严谨或者错误的,希望您能帮我提出来。