📜  分解算法

📅  最后修改于: 2020-12-12 08:02:46             🧑  作者: Mango

分解算法

在上一节中,我们借助小示例讨论了分解及其类型。在现实世界中,数据库架构太大而无法处理。因此,它需要可以生成适当数据库的算法。

在这里,我们将了解针对两种不同范式的函数依赖关系的分解算法:

  • 分解为BCNF
  • 分解为3NF

使用功能依赖项进行分解的目的在于保留依赖项和进行无损分解。

让我们详细讨论一下。

分解为BCNF

在将BCNF分解算法应用于给定关系之前,有必要测试该关系是否为Boyce-Codd范式。测试后,如果发现给定的关系不在BCNF中,我们可以进一步分解它以在BCNF中创建关系。

如果给定的关系模式R满足BCNF规则,则需要测试以下情况:

情况1:检查并测试,如果非平凡依赖性α->β违反BCNF规则,则评估并计算α + ,即α的属性闭包。此外,请验证α+是否包含给定关系R的所有属性。这意味着它应该是关系R的超键。

情况2:如果给定关系R在BCNF中,则不需要测试F +中的所有依赖关系。对于BCNF测试,仅需要确定并检查所提供的依赖集F中的依赖项。这是因为,如果F中没有依赖性导致违反BCNF,则F +依赖性都不会导致任何违反BCNF。

注意:如果关系分解,Case2将不起作用。这意味着在测试给定关系R的过程中,我们无法检查F的依赖性是否违反了BCNF。

BCNF分解算法

如果给定的关系R分解为多个关系R 1 ,R 2 ,…,R n ,则使用此算法,因为它不存在于BCNF中。从而,

对于关系R i中属性的每个子集α,我们需要检查α + (F下α的属性闭包)是否包含关系R i的所有属性或不包含R i- α的属性。

注意:如果Ri中的某些属性α违反算法中的指定条件,则在这种情况下,请考虑功能依赖性α->(α+-α)ꓵRi。这种依赖性可以存在于F +依赖性中。

该算法用于将给定的关系R分解为几个分解器。该算法使用表示违反BCNF的依赖项来执行关系R的分解。因此,这种算法不仅会在BCNF中生成关系R的分解器,而且是无损分解。这意味着在将给定的关系R分解为R 1 ,R 2等时,不会发生数据丢失。

BCNF分解算法在初始关系模式R的大小上花费时间指数。因此,该算法的缺点是它可能不必要地分解给定的关系R,即对该关系进行过规范化。尽管针对BCNF和4NF的分解算法相似,但有所不同。第四个范式适用于多值依赖关系,而BCNF专注于功能依赖关系。多值依赖关系有助于减少某种形式的数据重复,这在功能依赖关系方面是无法理解的。

多值依赖和功能依赖之间的区别

两种依赖关系之间的区别在于,功能依赖关系将某些元组从关系中排除,而多值依赖关系则不这样做。这意味着多值依赖关系不会排除或排除某些元组。而是要求某些形式的其他元组存在关联。由于这种差异,多值依赖关系也称为元组生成依赖关系,而功能依赖关系称为相等性生成依赖关系。

分解为3NF

3NF的分解算法通过为规范封面中的每个依赖关系显式构建一个架构来确保依赖关系的保留。它保证至少一个模式必须拥有要分解的模式的候选键,这又可以确保生成的分解是无损分解。

3NF分解算法

在此,R是给定的关系,而F是给定的功能依赖关系集,F c对其保持规范的覆盖。 R 1 ,R 2 ,… 。 。 R i是给定关系R的分解部分。因此,此算法保留了相关性并生成了关系R的无损分解。

3NF算法也称为3NF合成算法。之所以这样称呼,是因为普通形式适用于依赖项集,而不是重复分解初始架构,而是一次添加一个架构。

3NF分解算法的缺点

  • 分解算法的结果不是唯一定义的,因为一组功能依赖项可以包含多个规范覆盖。
  • 在某些情况下,算法的结果取决于考虑F c依赖关系的顺序。
  • 如果给定的关系已经以第三范式存在,那么它也可以分解一个关系。