关于数据库三大范式理解

来源:互联网 发布:notepad++ for mac 编辑:程序博客网 时间:2024/06/03 10:38

1、数据库基础概念

要理解数据库的范式,先应该了解关于关系数据库的一些基础概念,关系型数据库是用二维表来保存数据的,表与表之间可以有关联。

  • 实体:指的是客观存在的东西,比如现实生活中的一个人、一本书等等,在数据库中可以理解为属性(列)与属性(列)之间的关系。
  • 属性:在数据库中实则就是表的一列。
  • 元组:在数据库表的实则就是表的一行。
  • :表中可以唯一确定一个元组(行)的某个属性(或多个属性组成属性组),如果只有的码不止一个,那就称之为候选码,从候选码中挑出一个主要的,就为主码。
  • 全码:如果一个码包含了所有的属性,那就是全码。
  • 主属性:一个属性在任何的候选码中出现过,就是为主属性。
  • 非主属性:相对于主属性而言。
  • 外码:一个属性或者属性组,它不是码,但是它是别的表的码,就为外码。

2、认识数据库范式

(1)数据库范式(Normal Form)是由英国E.F.Codd提出来的,是从关系数据库模型总结出来的,它是数据库理论的基础,也是数据库设计过程中必须要遵循的规则。

(2)范式通常有8种范式,分别为:1NF、2NF、3NF、BCNF、4NF、5NF、DKNF、6NF。我们往往只用到前三个范式,1NF、2NF、3NF。

3、三大范式介绍

(1)第一范式:即1NF,要求数据表的列不能再分,不能再分为其他的列,这也就是保持列的原子性。举例子可以这样理解:
我们数据库有这样的表user_list
这里写图片描述
其中TEL电话号码分为手机号码与公司座机号码,也就是列TEL是可以再分的,这就不是1NF,不符合第一范式,我们应该拆分数据表列为(UESR_ID,NAME,AGE,TEL1,TEL2)。这样才符合第一范式要求,也就是1NF。

(2)第二范式:即2NF,首先肯定是要满足1NF的,另外还要满足两个要求:

  • 第一是表必须要有一个主键,这里的主键不一定只是一个列属性。
  • 第二是没有包含在主键中的列必须完全依赖与主键,而不能只依赖于主键的一部分

    举下面的例子,可以加深理解:

    这里写图片描述
    表中不包含在主键中的列,例如STUDENT_NAME、COURSE_NAME等都是不符合2NF中的第二条的要求的,即只依赖与主键(STUDENT_ID,COURSE_ID)的一部分。
    解决此类问题的办法就是拆分表为:
    表student(STUDENT_ID,STUDENT_NAME,MAJOR)
    course(COURSE_ID,COURSE_NAME,COURSE_TIME,TEACHER_NAME)
    之后两个表通过外键的形式相关联。

(3)第三范式:即3NF,首先要满足2NF,另外要满足条件: 非主键必须直接依赖于主键,不存在传递依赖(即不存在:非主键列C依赖与非主键列B,非主键列B依赖与主键的情况)
举例子可以这样理解:
我们有一张订单表,Order(OrderID,OrderDate,CustomerID,CustomerName)。其中主键为(OrderID),剩下的非主键完全依赖于主键(OrderID),另外CustomerName是依赖于CustmerID的,而CustmerID是依赖与OrderID的,CustmerName不是直接依赖于OrderID的,所以不符合3NF。
解决此类的办法是拆分表:
表一Order(OrderID,OrderDate,CustmerID)
表二Customer(CustomerID,CustomerName)

4、总结

1NF是很容易理解的,但是2NF跟3NF容易混淆,其实区别2NF与3NF最主要的还是:2NF:看非主键是否完全依赖于主键,还是依赖与主键的一部分。3NF:非主键列是直接依赖主键,还是直接依赖于非主键列的

原创粉丝点击