DBMS-2.3 数据库设计(3)——数据库规范化设计实现(3NF、BCNF模式分解)

本文章的素材与知识来自李国良老师和王珊老师。

  • 关系模式分解的定义

一.关系模式分解的定义

1.定义

2.理解

(1)关系不丢失:所有子关系的属性集加起来 = 原关系的属性集。即分解中不能把某个属性给丢了

(2)模式不冗余分解出的若干个子关系间不能出现包含关系,如果子关系R1和子关系R2存在关系:R1含于R2,那么对分解出的整个子关系集来说,R1就是冗余的。

(3)依赖不丢失:对于一个子关系R1<U1,F1>,若其U1={ A,B,C },那么其F1就是 原关系F 的闭包F+中,所有仅由A、B、C这三个属性构成的函数依赖。对每一个子关系都是如此,即保证了分解中不能把某个函数依赖给丢了

二.关系模式分解的原则

针对这两种原则,有两种分解方式:保持无损连接性的模式分解 和 保持函数依赖性的模式分解。

  • 分解的无损连接性

一.模式分解保证无损连接性的定义

1.定义

2.示例

(1)无损连接分解不仅要求不能丢失信息,还要求不能出现冗余信息。即使分解后未丢失任何信息,但只要出现多余的信息,就不是无损连接分解。

(2)由上述例子可以看出,一般是无法直接由定义判断一个分解是否为无损分解,只能对分解后的子关系做自然连接后与原关系比较才能判断,但这种方式明显不适用于多数据。因此通常使用验证算法来判断一个模式分解是否具有无损连接性

二.验证模式分解是否保持无损连接性的算法

1.算法

步骤(1):关系模式R分解为若干子关系,每行就是一个子关系,列就是所有属性
步骤(2):遍历每行每列,如果当前第i行这个子关系,拥有第j列这个属性,则把i行j列填入aj,否则填入bij
步骤(3):遍历每一个函数依赖X->Y,对于属性X,对于那些拥有属性X的子关系(即第X列上的值为a而不是b),它们的Y列都要设成相同的值,那么要设成什么值呢,这些关系的Y列只要有一个a,则全部都可以设为a,否则全部设为b。

2.示例

为了理解上述这些步骤,我们举一个分解例子,并按照上述步骤来逐步推荐,判断这个分解例子是否保持无损连接性。

对于关系R<U,F>,其属性集U={A,B,C,D},其函数依赖集F={A->B,A->C,B->D,D->C}。对该关系R进行一次分解,得到三个子关系:

R1=<U1,F1>,R1的属性集U1={A,B}

R2=<U2,F2>,R2的属性集U2={A,C,D}

R3=<U3,F3>,R3的属性集U3={B,D}

接下来就开始利用算法分析:

(1)构建表

表的每一行就是一个分解出的子关系,上述三个子关系每个子关系一行;表的每一列就是原关系的一个属性,原关系的四个属性每个属性一列。因此构造出一个3行4列的表:

(2)填充表

遍历每一列,针对每一列对应的属性,再遍历每一行,如果第j列对应的属性 在 第i行对应的子关系 的属性集中,则用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值