范式
概念
这里的范就是规范的意思,范式就是我们设计表的基本规范,Normal Format。
范式的作用就是通过合理的数据储存,从而使得数据的冗余度最小化以及运行效率的最大化!
范式是分层的!!
所谓的分层,就是根据不同的需要标准,一层一层的严格递进,一层比一层严格!理论上来说一共有6层!
比如:第一范式、第二范式……
但是,后面的范式实在是太严格了,很难达到,所以,在数据库中,只引入了前三层!
一般来说,我们认为满足了第三层范式的数据库就是合理的优秀的数据库!
第一范式 1NF
第一范式是最容易满足的,就是要求把各个数据设计成一个一个单独的信息,不能再进行拆分!
也就是说,字段里面的数据都可以直接被外部所调用,而不是提出出来之后还要进行分割!
上面的数据表就不满足第一范式!
解决方案:对上面的姓名和性别进行拆分即可!
第二范式2NF
第二范式就是在满足第一范式的基础之上,再满足以下的两个条件:
1,表中的每一行都具有唯一的可区分的特性(不存在完全一样的记录)
特别强调:
在设计表的时候,一定不能先把逻辑主键ID字段加上来!因为ID字段只是用来标记一条不同的记录,跟实体信息之间没有任何的关系!
所以,从某种意义上来说,上面的数据表就不满足第二范式的第一个条件!
2,不能有部分依赖!
什么叫依赖?
如果确定了表中的某个字段A,就能确定该表的另一个字段B,那么我们就说B依赖于A
很显然,所有的非主键字段都应该依赖于主键!
什么叫部分依赖?
主键可以是单一主键,也可以是组合主键(注意:在设计的表的时候,应该找一个非ID主键,再最后才把ID作为逻辑主键),
如果某个表的主键是组合主键的时候,就容易出现部分依赖!
假如一张表的组合主键是(A,B),其他所有的非主键字段都应该依赖于(A,B)的组合,
但此时如果字段C,只依赖于A,也就是说,只要A确定了,C就确定了,这种情况,就叫做部分依赖!
思考:
上面的表,应该如何设计它的主键?
此时,应该设计成一个组合主键:学生 + 课程名称
虽然上面的表满足了第一范式,但是我们还是能够明显的感觉到数据的冗余!
因为产生了部分依赖:
性别和籍贯只依赖于学生,而学分只依赖于课程名称!
思考:如何优化?
对表进行拆分,把部分依赖的字段独立出来:
这样一来,以上的三个表都各自记录了一类信息,并且可以各自加上ID号作为逻辑主键!
第三范式3NF
第三范式就是在满足第二范式的基础之上消除传递依赖!
什么叫传递依赖?
如果主键是A,B依赖于A,而C又依赖于B,此时,就叫做传递依赖!
上面的表就出现了传递依赖,所在院系依赖于主键,而系办地址和系办电话都依赖于所在院系!
思考:如何优化?
将产生传递依赖的部分单独的独立出来:
总结:
满足范式的基本技巧:在设计数据表的时候,尽量一张数据表内只存放一类数据!
注意:
范式是一种理想的规范,不是绝对的标准,一般的做法是先满足数据库设计的要求,再进行优化处理!有时候为了提高效率或者使用方便,还会故意违反范式!