Fork me on GitHub
数据库的范式模型
  • 特别说明
    本文中的出现的‘对象’,可以理解为数据库中的一条记录。
    本文中的出现的‘属性’,可以理解为数据库中的一条记录中的字段。
    主属性可以理解为数据库中的一条记录的主键。
    非主属性可以理解为数据库中的一条记录的主键以外的字段。

函数依赖

定义一:Method(x)=y,x、y是一个对象,x在经过一个函数后会得到y。
我们就说:x函数确定y,y函数依赖x。x值决定y值,记成:x->y
例如:

(学号,课程号)->(成绩)
(学号,课程号)->(姓名)
(学号,课程号)->(学号)
(学号)->(姓名)

上面的都是x->y模型。

定义二:x->y,x、y是一个对象,x在经过一个函数后会得到y,y不是x的子集
我们就说:x->y是非平凡函数,否则为平凡函数
例如:

(学号,课程号)->(成绩)是非平凡函数
(学号,课程号)->(姓名)是非平凡函数
(学号,课程号)->(学号)是平凡函数
(学号)->(姓名)是非平凡函数

任何对象都存在平凡函数,一般我们就只讨论非平凡函数的情况。

定义三:x->y,x、y是一个对象,x的任何真子集x'都不能x'->y。
我们就说:x完全属性函数确定y,y完全函数依赖x。完全x对象值决定y值,记成:(full)x->y
x存在一个真子集x'能得到x'->y。
我们就说:x非完全属性函数确定y,y非完全函数依赖x。非完全x对象值决定y值,记成:(part)x->y
例如:

(学号,课程号)->(成绩)是(full)x->y
(学号,课程号)->(姓名)是(part)x->y,因为存在(学号)->(姓名)
(学号)->(姓名)是(full)x->y

定义四:x->y,y->z,且y->x不成立。
我们就说:x传递函数确定z。
例如:
(学号)->(系别),(系别)->(系主任)

范式和规范化

第一范式
定义:一个对象的所有属性不可再分,符合第一范式,记:1NF
例如:

(员工编号,姓名,(基本工资、职务工资)),其中的一个属性可以再分,就不符合第一范式。改成:
(员工编号,姓名,基本工资,职务工资),符合第一范式

第二范式
定义:符合第一范式后,一个对象的非主属性完全函数依赖主属性,符合第二范式,记:2NF
例如:

(学号,课程号,姓名,成绩)

其中的主属性是学号和课程号,应该(full)(学号,课程号)->(姓名,成绩)必须成立才行,

可惜存在(学号)->(姓名),即存在就不符合第二范式。

改成:
(学号,课程号,成绩)和(学号,姓名),符合第二范式

第三范式
定义:符合第二范式后,一个对象的非主属性不传递依赖主属性,符合第三范式,记:3NF
例如:

(员工编号,宿舍编号,宿舍费用),

其中存在一个依赖关系:

(员工编号)->(宿舍编号),(宿舍编号)->(宿舍费用),就不符合第三范式。改成:
(员工编号,宿舍编号)和(宿舍编号,宿舍费用),符合第三范式

posted on 2012-03-20 22:59  HackerVirus  阅读(231)  评论(0编辑  收藏  举报