数据库设计理论(三)——模式分解理论

写在开头

在前面两篇了解到了函数依赖和各种范式,那么在关系模式不符合某范式时,总需要对该模式进行分解,那就会想到在分解模式时有什么问题呢,这就是本文需要讨论的。

模式分解

模式分解即是将一个冗余较大操作比较繁琐 的关系模式拆解为几个等价的关系模式。
那在进行关系分解时只是根据我们的直观感觉进行分解就可以了吗?显然是没那么简单的,我们在分解的时候一定要保证分解前后的等价性,那如何保证等价性需要从两方面考虑:
1>保持无损连接性
解释:在分解之后,n个分解关系通过自然连接(自然连接是在等值连接的基础上去掉相同的列,如果自然连接中找不到等值信息那么自然连接就等价于笛卡尔积)形成的二维表和没分解之前关系的二维表是等价的(元组没有增加也没有减少),则称这种分解形成的关系模式保持无损连接性;
【⭐其实在分解后的关系再次自然连接后是经常会多一些之前没有的属性出来的,而这些之前没有的肯定就是错误信息了,一定是不能有的,所以需要特别注意】
2>保持函数依赖性
解释:若分解之后的关系模式中仍然存在和没分解之前属性的函数依赖关系则称保持分解的函数依赖性。【原有的依赖性也很容易丢失的喔】

1.无损连接检验算法

我们需要一个算法来判断分解后的关系是否无损:Rρ表判断法
1)构造一张k行n列的表格,每列对应一个属性Aj(1≤j≤n),每行对应一个模式Ri(1≤i≤k)。如果Aj在Ri中,那么在表格的第i行第j列处填上符号aj,否则填上符号bij
2)把表格看成模式R的一个关系,反复检查F中每个FD在表格中是否成立,若不成立,则修改表格中的元素。修改方法如下:对于F中一个FD:X→Y,如果表格中有两行在X分量上相等,在Y分量上不相等,那么把这两行在Y分量上改成相等。如果Y的分量中有一个是aj,那么另一个也改成aj;如果没有aj,那么用其中的一个bij替换另一个(尽量把ij改成较小的数,亦即取i值较小的那个)。
3)在上述修改的表中,如果我们发现有一行变成全是a,则ρ是无损连接分解,否则ρ是由损连接分解。
快捷判断
当然我们在进行模式分解的时候,我们遇到的经常是把一个大的关系模式分解为两个小关系模式,那么这种情况下有更简单的算法判断是否无损:

分解为两个关系模式

2.保持依赖分解

保持依赖分解的过程其实是一个求属性闭包的过程,而结果属性也必须是关系模式的属性
(好吧老实讲我这里没太听懂那个算法......)

3.关系模式分解成BCNF

在前面提到分解成为BCNF范式时提到一种方法是将左边不含候选键的函数依赖单独组成一个关系,将包含候选键的组成一个关系;但这样分解好的关系是无损连接吗?是满足保持依赖性吗?这是我们需要研究的
发现该算法可以保证分解成BCNF范式又是无损连接的(但不一定保持连接)

4.关系模式分解成3NF

在前面提到分解为第三范式是直接粗暴的将关系集合拆解为几个简单的小关系,再合并。
发现该算法可以保证分解成BCNF范式又是保持依赖的(但不一定无损连接)

image.png

既保持依赖又无损连接的分解

定理如图所示

⭐总结来讲,就是用之前的方法经过分解和重新简单合并,使新的关系模式满足第三范式(用前面提到的简单粗暴的方法),然后合并至什么程度呢,就是让其中有一个关系模式包含了候选键的所有属性,那么就是无损连接的,这也就是既保持依赖又无损连接的分解

至此数据库的设计理论就介绍完毕,主要对数据库结构的约束关系做出了规范,明白了什么是好的依赖关系
当然一个大的关系分解成一个个小的关系模式时,在查询的时候是要进行连接的,这是比较耗费时间的;而大的数据关系模式又会容易冗余和出错,所以我们在数据库设计时需要做的是折中考虑

image.png

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容