今天来介绍数据库中的几种范式。
一、常用的几个范式
1、第一范式(1NF)
定义:在关系模式R中,当且仅当所有域值包含原子值,即每个分量都是不可再分的数据项,则称关系模式R属于1NF。
用自己的话来形容:1NF即原子性。
举例:
供应者和它所提供的两件信息表
Sno | Sname | Status | City | Pno | Qty |
S1 | 精益 | 20 | 天津 | P1 | 200 |
S1 | 精益 | 20 | 天津 | P2 | 300 |
S1 | 精益 | 20 | 天津 | P3 | 480 |
S2 | 盛锡 | 10 | 北京 | P2 | 168 |
S2 | 盛锡 | 10 | 北京 | P3 | 500 |
S3 | 东方 | 30 | 北京 | P1 | 300 |
S3 | 东方 | 30 | 北京 | P2 | 280 |
S4 | 泰达 | 40 | 上海 | P2 | 460 |
关系模式R和函数依赖集F如下:
R(Sno,Sname,Status,City,Pno,Qty)
F={Sno→Sname,Sno→Status,Status→City,(Sno,Pno) →Qty}
每个分量都是不可再分的数据项,因此关系模式R∈1NF
1NF存在缺点:(1)冗余度大;(2)引起修改操作的不一致性;(3)插入异常;(4)删除异常。
2、第二范式(2NF)
定义:若关系模式R属于1NF,且每个非主属性完全依赖于码(即主键),则关系模式R属于2NF。
用自己的话来形容:R∈1NF,且组合主键中的某一个能推出某一字段。
举例:
将关系模式R分解成R1(Sno,Sname,Status,Ciy)和R2(Sno,Pno,Qty)后,R1,、R2都属于2NF,将1NF分解成2NF,解决了非主属性对码的“部分依赖”。
3、第三范式(3NF)
定义:若关系模式R(U,F)中不存在这样的码X,属性组Y及非主属性Z使得X→Y,Y→Z且X函数不依赖与Y成立,则关系模式R属于3NF。
用自己的话来形容:R∈2NF,且主键能推出所有列。
举例:
将关系模式R1分解成R11(Sno,Sname,Status)和R22(Status,City)后,R11、R22都属于3NF,将2NF分解成3NF,解决了非主属性对码的“传递依赖”。
总结:由此可知,通过分解,可以将一个低一级范式的关系模式转换成若干个高一级范式的关系模式。
二、扩展的范式
1、巴克斯范式(BCNF)
定义:设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。当3NF消除了主属性对码的部分和传递依赖,则称为BCNF。
用自己的话来形容:R∈3NF,且组合主键不能互相可以退出。
仓库管理表(仓库ID,存储物品ID,管理员ID,数量)
F={(仓库ID,存储物品ID) →(管理员ID,数量),(管理员ID,存储物品ID) → (仓库ID,数量)}
由此可知,(仓库ID,存储物品ID)和(管理员ID,存储物品ID)都是仓库管理表的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
这样数据库表就符合BCNF范式了。
2、第四范式(4NF)
关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y不属于X),X都含有候选码,则R∈4NF。4NF是限制关系模式的属性间不允许有非平凡且非函数的多指依赖。
想了解4NF,请点击!
最后一个范式(5NF),不常用,不做讲解。1NF、2NF、3NF、BCNF、4NF、5NF这几种范式,级别依次升高。