范式

Form

不要把所有鸡蛋放在同一个篮子
概述
. 是关系模式满足不同程度的规范化要求的标准,如建材的甲醛标准
. 满足最低程度要求的范式属于第一范式,简称1NF;在第一范式中进一步满足一些要求的关系属于第二范式,简称2NF;依次类推
. 对关系模式的属性间的函数依赖加以不同的限制就形成了不同的范式。这些范式是递进的,即如果一个关系是1NF的,它比不是1NF的关系要好;同样,2NF的关系比1NF的关系要好等等
. 范式越高、规范化程度越高,关系模式就越好,数据库冗余越小
1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF ⊃ 4NF ⊃ 5NF
. 没有冗余的数据库未必是最好的数据库, 有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据
. 一般说来,数据库只需满足第三范式3NF就行了
. 尽量将依赖降低之最少
. 尽量为每一个实体单独创建关系,通过外键和其它实体发生联系
1NF
. 关系模式R的每一个分量|每个列与行的交点处的取值,都是不可再分的数据项|原子性
. 属性值只有原子值 | 不可分解;强调的是列的原子性,即列不能够再分成其他的几列
. 存在问题:数据冗余、删除异常、更新异常、插入异常
. 级别最低
. 我们使用的Excel表单基本上都不符合1NF
常见的可分解字段
字段 说明
工资 多个项目
家庭成员 多个成员
高级职称 副教授、教授
2NF
. 每一个非主属性都完全依赖于 任何 一个候选码;即:消除非主属性对候选码的 部分 依赖
. 只有在复合属性作主键时,才可能出现不满足2NF的情况
. 2NF要求:使用唯一主键,不能使用组合键|联合主键|复合键
. 2NF要求:一个表只描述一件事情
. 某个关系R中,AB是候选码,C是非主属性;如A → C,B → C,则存在非主属性C是对候选码的部分依赖,R ∉ 2NF
. 如果仅有A → C,则C完全依赖候选码A,R ∈ 2NF
3NF
. 消除非主属性对候选码的 传递 依赖,即: 非主属性之间不存在函数依赖
. 如果非主属性存在函数依赖,而非主属性又完全依赖候选码,所以就存在非主属性到主属性之间的函数传递
. 表中的每一列只与主码直接相关而不是间接相关 | 表中的每一列只能依赖于主码
. 断开传递链
. 某个关系R中,AB是候选码,C、D是非主属性;如AB → C,C → D,则存在非主属性D是对候选码的传递依赖,R ∉ 3NF
原始设计
字段名 说明 实例
orderId 订单编号 101
roductId 产品编号 1001
count 数量 100
price 单价 80
total 金额 8000
优化设计
字段值 说明 实例
orderId 订单编号 101
roductId 产品编号 1001
count 数量 100
price 单价 80
total 金额 8000
巴斯-科德范式 BCNF
. 多值依赖
. 是第三范式的补充,且要满足:
. 主码之间不存在依赖|主码独立
. 在3NF的基础上消除主属性对于码的部分与传递函数依赖
. 给出R(A,B,C),F{AB → C},R ∈ BCNF
. 2NF、3NF关注的重点都是非主属性的函数依赖
. BCNF关注的是主属性的函数依赖
. 如果没有非主属性,即全部都是主属性,则至少是3NF
. 判断某个属性是否存在依赖或是说明依赖,只需要看该属性在右部的情况
范式识别
找候选码
区分主属性、非主属性
找非主属性的部分函数依赖;如果主码是单属性,那只需要判断是否完全依赖;组合属性才需要判断部分依赖
找非主属性的传递函数依赖
判断第几范式
关系模式R(A1,A2,A3,A4,A5,A6),函数依赖集F={A1→A3, A1A2→A4, A5A6→A1, A3A5→A6, A2A5→A6},其中,()主键,R为()。
A1A4
A2A5
A3A4
A4A5
不存在传递依赖,是1NF
不存在传递依赖,是2NF
存在传递依赖,是3NF
每个非主属性完全依赖主键,是2NF
A4在R。肯定不是,排除ACD,∴ B;A2在L,一定是,进一步确定
D
已知R<U,F>,U={A,B,C},F={AC→B,B→C},求候选码并判断其范式
A
AB
ABC
以上都不是
1NF
2NF
3NF
BCNF
A在L部,A肯定在。BC都LR,可能是。只能是AB或AC,所以选B[实际上AC也是候选码,不存在非主属性,应该是3NF+]
主属性C部分依赖于候选码,所以不是BCNF,是3NF
已知R<U,F>,U={A,B,C},F={B→C,B→A,A→BC},判断其范式
直观的去分析:B能推出A、C,所以B是候选码;同样,A可以推出BC,A也是候选码
C在右部,不是候选码,只能是A、B
B可以推出A,还可以推出C,所以B是候选码
同理,A也可以推出BC,所以A也是候选码
主属性是AB,非主属性是C
非主属性C完全于候选码B,至少是3NF
候选码A、B都是单属性,不存在部分依赖,同样也不存在传递依赖,∴ R ∈ BCNF
已知R<U,F>,U={A,B,C},F={A→C,A→B},判断其范式
BCNF
模式合并后,A→BC,只有一个依赖,肯定是BCNF
另:A是主码;主码和非主码之间都没有部分和传递,∴ BCNF
已知R<U,F>,U={A,B,C,D},F={A→C,BC→D},判断其范式
候选码是AB
AB是主属性;CD是非主属性
非主属性C依赖于A,是部分依赖于候选码AB,所以是1NF
模式分解
说明
. 将一个低级范式的关系模式转换为若干个高级范式的关系模式的过程,称为规范化
. 通过分解后的模式达到第几范式来评价模式规范化的程度
. 拆表:利用投影分隔列
谁跟你好,就带谁走
. 基本过程
找候选码
找非主属性
消除非主属性对候选码的部分依赖→2NF
消除非主属性对候选码的传递依赖→3NF
消除主属性对候选码的传递依赖→BCNF
S-L-C(Sno,Sdept,Sloc,Cno,Grade),Sloc是学生的宿舍,一个系的学生住一起
求码

S-L-C(Sno,Cno)

标记主属性和非主属性

主属性:Sno,Cno

非主属性:Sdept,Sloc,Grade

列出函数依赖

(Sno,Cno) → Grade

Sno → Sdept

Sno → Sloc

Sdept → Sloc

判断范式

非主属性 Sdept,Sloc部分依赖候选码|没有完全依赖于候选码:依赖Sno,但不依赖Cno

∴ 不属于2NF,属于1NF

模式分解:S-L-C(Sno,Sdept,Sloc,Cno,Grade)

S-C(Sno,Cno) → Grade ∈ 2NF

S-L(Sno,Sdept,Sloc) ∈ 2NF

继续判断

S-L(Sno,Sdept,Sloc) 存在传递依赖

模式分解:S-L(Sno,Sdept,Sloc)

S-D(Sno,Sdept) ∈ 3NF

D-L(Sdept,Sloc) ∈ 3NF