范式

概念

这里的范就是规范的意思,范式就是我们设计表的基本规范,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,此时,就叫做传递依赖!

 

上面的表就出现了传递依赖,所在院系依赖于主键,而系办地址和系办电话都依赖于所在院系!

思考:如何优化?

将产生传递依赖的部分单独的独立出来:

总结:

满足范式的基本技巧:在设计数据表的时候,尽量一张数据表内只存放一类数据!

 注意:

范式是一种理想的规范,不是绝对的标准,一般的做法是先满足数据库设计的要求,再进行优化处理!有时候为了提高效率或者使用方便,还会故意违反范式!

原文地址:https://www.cnblogs.com/mrszhou/p/7468007.html