介绍
依赖理论关注如何构建良好的关系数据库模式,以及当模式有缺陷时如何改进它。
功能依赖
关系 R 上的函数依赖 (FD) 是 R 的两个元组通过其属性相关的关系。
如果他们在其他属性上达成一致,那么他们必须就
此函数依赖关系正式标记为
, 并且说
功能决策
如果确定关系 R 的每个实例都使给定的函数依赖项为真,则称关系 R 满足函数依赖项 f。这是对 R 声明的约束,而不仅仅是对 R 的特定实例的约束。
函数依赖中的函数是什么意思?
之所以称为“函数”依赖,是因为在这个规则中,有一个针对值列表的函数(对于列表中的每个值
),每个属性都会生成一个唯一的值B。这个函数不同于数学中常见的函数,因为这个规则是不能计算的,也就是说后面的属性不能根据前面的属性集来计算,只能通过观察关系来得到结果。
分解规则:可以使用一组 FD
(i=1,2,…m)替换 FD
组合规则:您可以使用一个FD
更换FD套件
(i=1,2,…,m)
平凡函数依赖:如果关系上的约束对所有关系实例都成立,并且与其他约束无关,则称为平凡函数依赖。平凡函数依赖是指一类函数依赖:
,在
简单依赖规则:FD
相当于
其中 C 是集合 B 中的属性,但不在集合 A 中
传递规则:如果关系 R 中的 FD
和
如果两者都正确,则 FD
这在 R 中也适用
关系的关键
如果满足以下条件,则考虑一个或多个属性集{
} 是关系 R 的关键。
1 这些属性函数决定了关系的所有其他属性。换句话说,关系 R 不可能有两个不同的元组具有相同的
价值
2 在 {
},没有函数可以确定R的所有其他属性。也就是说,密钥必须是最小的
超级键
包含键的属性集称为超键。超键满足键的第一个条件,但不满足第二个条件。
关闭属性
假设
是属性集,S是FD集,则S下的属性集为
的闭包是满足以下条件的属性集 B,即满足 S 中所有 FD 的每个关系也满足
、属性集
关闭
计算一组属性的闭包的算法
输入:属性集合
,FD 集合 S
输出:
1 如果必要的话,分解S中的FD,使得每个FD在其右侧只有一个属性。
2 假设 X 是一组属性,即闭包。首先,将 X 初始化为
3 反复寻找此类FD:
, 以便
在 X 中,但 C 不在 X 中;如果找到,则将 C 添加到 X 并重复该过程。由于集合 X 只能增长,并且任何关系模型中的属性都是有限的,因此当没有元素可以添加到 X 时,此步骤结束。
4 当不再有可见属性时,集合 X 为
计算闭包可以轻松确定某些函数依赖关系是否存在。例如,如果相对于 FD 集合 S,
,我们很容易判断FD可以导出
,但不能推断
闭包和钥匙
注意当且仅当
是关系的超键,
是这个关系的所有属性的集合。只有这样,
该功能决定了所有其他属性。
这是关系的关键吗?你可以先检查一下
是否包含关系的所有属性,然后检查是否存在
删除属性后的集合 X
包含关系的所有属性。
函数依赖的闭包集
给定一组 FD S,任何等价于 S 的 FD 集合都称为 S 的基。为了避免基集的增多,只考虑 FD 右侧为单一属性的基集。满足以下三个条件的基集 B 称为关系的最小基。注意,最小基不一定是唯一的。
1 B 中的所有 FD 在其右侧都有一个属性
2 从 B 中移除任意 FD 后,该集合不再是基本集
3 对于B中的任意FD,如果从其左侧删除一个或多个属性,则B不再是基集。
投影函数依赖性
假设存在一个关系 R 和一组 FD S。通过计算
获取 L 在其某些属性上的投影,然后
哪些 FD 在 中成立? 这个问题的答案原则上可以通过计算函数依赖集 S 的投影来获得。 S 的投影是满足以下条件的所有 FD 的集合:
1 从 S 推断 2 仅包含
特性
函数依赖集的投影算法
输入:关系 R 和
计算关系
以及 R 中成立的 FD 集合 S
输出:输入
在以下情况中成立的 FD 集
方法:1 令 T 为最终输出 FD 的集合,并将 T 初始化为空集
2 对于
对于属性集的每个子集X,计算
,计算是基于FD集合S的,可能会涉及到一些不在R模式的数据。
架构中的属性。对于所有
属于
属性 A 将设置所有非平凡 FD
添加到T
3 现在,T 是
中的FD基组,但它可能不是最小化基组。最小化基组是通过如下修改T构造的。
a 如果 T 中的 FD F 可以从 T 中的其他 FD 推断出来,则从 T 中删除 F
b 假设
是T中的FD,Y至少有两个属性,从Y中删除一个属性并记为Z。
可以从 T 中的 FD(包括
)推断,然后使用
代替
c 重复以上两步,直到T不再变化
关系数据库模式设计
如何设计一个好的关系模型呢?一般来说,我们首先设计一个可以工作的关系模型,然后分析这个模型存在的问题,然后对现有的模型进行分解,使得分解后的关系符合 BCNF 范式,同时也消除了以前设计中存在的问题。
当您尝试在关系中包含过多信息时,会出现问题(例如冗余),这称为异常。异常的基本类型包括:
冗余:信息以多个元组的形式重复
更新异常:在更新字段的时候,可能某些元组中的字段被更新了,但是其他元组中的字段可能被忘记更新。
删除异常:如果关系表中存在一些不相关的属性,当其中一个属性需要清除时,其他属性也会被删除,这可能不是用户希望看到的。
分解关系
一般采用分解关系的方法来消除异常。给定一个关系
,将其分解为关系
和
数据库函数依赖关系,并满足:
博伊斯-科德范式
分解的目的是用多个没有例外的关系来代替一个关系。换句话说,在一个简单的条件下,保证不存在所讨论的例外。这个条件称为 Boyce-Codd 范式,简称 BCNF。关系 R 属于 BCNF 当且仅当:
如果成立,
是关系 R 的超键。
任何二元关系都属于 BCNF。我们可以想象两个属性 A 和 B,分别看看可能的情况:
1 不存在非平凡 FD。由于只有非平凡 FD 才能违反此条件,因此 BCNF 必定成立,并且 {A, B} 是唯一键。
成立,但是
不,在这种情况下,A 是唯一的键,并且每个非平凡 FD 左侧都包含 A,因此不违反 BCNF。
成立但
不成立,同上
和
A 和 B 都是键。由于任何 FD 的左侧都至少包含 A 和 B 之一,因此没有 FD 违反 BCNF。
BCNF分解算法如下
输入:关系
以及对它的函数依赖集
输出:
分解后的关系集,每个关系都属于 BCNF
方法:以下步骤可以递归应用于任何关系 R 和 FD 集 S。最初,R =
,S=
1 检查 R 是否符合 BCNF。如果符合,则不执行任何操作并返回 {R} 作为结果。
2 如果违反 BCNF,则假设
.首先计算X的闭包
。选择
作为关系模型,并创建另一个关系模型
包含属性 X 以及不包含在
的属性
3 计算
和
FD 集
和
4 使用该算法进行递归分解
和
. 返回这些分解的结果集合。
分解的利与弊
一个关系模型在分解成一系列属于BCNF的关系之前,可能含有异常,但分解后,就不含有异常了,这叫“优秀”。然而,分解也可能导致一些不好的结果。本节介绍分解的三个性质。
1 异常消除
2 信息的可恢复性。是否有可能从分解的元组中恢复原始关系?
3 依赖关系的保存。如果FD的投影建立在分解后的关系上,能否保证通过join操作重建分解后的关系得到的原始关系仍然满足原始FD?
BCNF分解可以保证1和2,第三范式可以保证2和3,但是没有办法同时保证这三个性质。
如果
对于关系 R 成立,并且 R 的属性集为
,但
第三范式
如果关系 R 满足以下条件,则它符合第三范式:
是一个非平凡的 FD,那么
是一个超密钥,或者每个
但不属于 A 的属性都是键的成员
一种具有无损连接和依赖性保留的 3NF 关系综合算法
输入:关系 R 以及建立在其上的函数依赖集 F
输出:R 分解的关系集,每个关系都属于 3NF。分解具有无损连接和依赖性保留属性。
方法:1. 找到F的一个最小基集,记为G
2 对于 G 中的每个 FD
,使用 XA 作为分解关系的模型
3 如果步骤 2 中分解的关系模式不包含 R 的超键,则添加一个关系,其模式为 R 的任意键
多值依赖 (MVD)
多值依赖是指在关系 R 中,当给定一组属性的值时,存在另一组属性,其值与关系中所有其他属性的值无关。更准确地说,如果给定 R 中属于集合 A 的属性的值,存在一个属性集 B,其值与 R 中不属于 A 或 B 的属性集的值无关,则称为 MVD。
准确地说,为了使 MVD 成立,那么对于 R 中每一对在 A 的所有属性上一致的元组 t 和 u,都存在一个元组 v 满足以下条件:
1 A属性的值与t和u相同
2 B属性的值与t相同
3 R 中不属于 A 和 B 的所有其他属性都具有与 u 相同的值
MVD 规则
简单的 MVD 规则是
,然后 MVD
建立在任何关系中
传输规则,如果有关系
和
,但
升级规则,每个FD都是一个MVD。
第四范式
如果对于 R 中的每个非平凡 MVD
,
都是超密钥,那么 R 属于第四范式
分解为第四范式
输入:关系
,其上的 FD 和 MVD 集为
输出:
分解后的关系集,每个关系集都符合4NF,具有无损连接性质
方法:依次执行以下步骤,然后
1 在 R 中查找 4NF 违规,表示为
,在
不是超密钥。注意,这个 MVD 可以是 S 中的真 MVD,也可以是从 S 中的相应 FD 派生而来的,因为每个 FD 都是一个 MVD。如果不存在,则返回 R 本身就是一个合适的分解。
2 如果存在这样的 4NF 违反数据库函数依赖关系,则将包含 4NF 违反的关系 R 分解为两个模式
,其模式为 A 和 B
,其众数为 A 以及 R 中所有不属于 A 和 B 的其他属性
3 了解详情
和
FD 和 MVD 符合上述要求。根据投影依赖关系递归分解
和
注意,4NF 意味着 BCNF,而 BCNF 意味着 3NF,如下图所示
暂无评论内容