博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关系模式的范式~NF分类与规范化
阅读量:3941 次
发布时间:2019-05-24

本文共 1567 字,大约阅读时间需要 5 分钟。

文章目录

一、范式分类

第一范式(1NF):字段都是单一属性的,分量不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

第二范式(2NF):不存在非关键字段对任一候选键字段的部分函数依赖 / 所有非关键字段都完全依赖于任意一组候选关键字(例:候选键ABC,非主属性D,如果ABC–>D则满足2NF;如果AB–>D,则非2NF)。

第三范式(3NF):在2NF基础上,不存在非关键字段对任一候选关键字段的传递函数依赖。传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段x → 非关键字段y

BCNF: 在3NF的基础上不存在关键字段决定关键字段的情况,每个属性都不传递依赖于键码。

参考:https://blog.csdn.net/xingchenhy/article/details/71424906

二、规范化(提高关系模式级别)

3NF分解方法

  1. 对于R上FD集,先求出Fmin,然后把Fmin中那些左部相同的FD用合并性合并起来
  2. 对合并后的每个FD X→Y构成一个模式XY
  3. 在构成的模式中,如果每个模式都不包含R的候选键,那么将候选键作为一个模式放入模式集中

注:这样得到的模式集是R的一个分解,具有无损分解和保持函数依赖

例:设R(ABCD),F是R上的FD集,F={AB→CD,A→D},说明R为什么不是3NF,试把R分解为3NF

解:1)判断
可知,AB是候选键,存在传递依赖;AB →A, A →D不满足定义17 非主属性传递依赖于候选键,或者 A →D不满足定义18 A不是超键
所以, R不是3NF.
2)R的分解:
最小函数依赖集
右边单属性: AB →C, AB→D,A→D
左部不可约: AB →C, A→D,A→D
去除冗余: AB →C, A→D
候选键是: AB
可分解为: R1={ABC}, R2={AD} 因为R1中已经包含候选键AB因而不用写新的模式

例:R(ABCDE),F={B→C,B→E,C→B,C→D},将R分解为3NF

解:
最小函数依赖集
右边单属性: B→C,B→E,C→B,C→D
左部不可约: B→C,B→E,C→B,C→D
去除冗余: B→C,B→E,C→B,C→D
合并: : B→CE; C→BD
候选键:AB, AC
可分解为: R1={BCE}, R2={CBD}; R3={AB}; R4={AC}

BCNF分解方法

  1. ρ={R}
  2. 检查ρ中各关系模式是否均属于BCNF,若是结束
  3. 设ρ中Ri(Ui)不属于BCNF,那么必有X→A∈Fi+但X非Ri的超键,对Ri进行分解为ρ={XA,U-{A}},U=U-{A}转到(2)

注:这样得到的模式集是R的一个分解,具有无损分解,但不一定保持函数依赖

例:R(CGHRST),F={ C→T,HR→C,TH→R,CS→G,HS→R },将R分解分解为BCNF

解:候选键为: HS+={HSRCTG}
(尽量先选择X–>Y的Y在F集中只在右边出现;其次选择Y没有在别的函数依赖左边出现的;最后选择超键,把候选键留到最后)
①选 CS →G; ρ = {CSG, CHRST}
R1={CSG}是 BCNF;R2={CHRST} F2={C→T,HR→C,TH→R,HS→R}
②选C→T; ρ = {CT, CHRS}
R3={CT}是 BCNF;R4={CHRS} F4={HS→R}, HR →C}
③选HR →C; ρ = {HRC,HSR}
R5={HRC}是 BCNF;R6={HSR}也是BCNF,都是BCNF可以停止
所以,分解成ρ={CSG,CT,HRC,HSR}

你可能感兴趣的文章
docker网络
查看>>
锐捷交换机的多对多镜像口
查看>>
Linux系统修改编码
查看>>
word文档不能显示图片的处理
查看>>
linux的多桌面环境Xephyr
查看>>
初探debian桌面的管理启动
查看>>
七层协议图
查看>>
华为交换机作为AC的条件
查看>>
禁用Ubuntu 15.04登录界面显示客人会话(简单-实用)
查看>>
linux X下安装的软件
查看>>
Linux监测某一时刻对外的IP连接情况
查看>>
CentOS7 最小环境安装Jumpserver 1.0版脚本
查看>>
X-Security X的安全控制
查看>>
openVAS的安装
查看>>
Centos 6.5 初始安装无网卡驱动解决方法
查看>>
linux中的网桥bridge
查看>>
linux中的teaming与bonding
查看>>
LVM
查看>>
用shell切分文件--split
查看>>
python中判断字符是否为中文
查看>>