【数据库系统原理】第14篇:关系模式的语义约束:函数依赖的公理系统与闭包计算
2026/6/10 1:24:20 网站建设 项目流程

目录

一、函数依赖:属性间的语义引力

二、Armstrong公理体系:从已知推导未知

三、属性集闭包:算法化的依赖推导

四、函数依赖覆盖与最小化:理论的精简之道

五、结语:迈向范式理论的桥梁


一、函数依赖:属性间的语义引力

在关系模式中,属性之间并非彼此独立,它们受到现实世界语义规则的约束。这种约束最普遍的形式就是函数依赖

设R是一个关系模式,X和Y是R的属性子集。如果对于R的任意合法实例r中的任意两个元组t₁和t₂,当t₁[X] = t₂[X]时,必然有t₁[Y] = t₂[Y],则称X函数确定Y,或Y函数依赖于X,记作X → Y。

这个定义用形式化的语言表达了一个直觉性的概念:如果知道了X的值,Y的值就随之确定了。在“学生”关系中,学号→姓名意味着给定一个学号,对应的学生姓名是唯一确定的——这是现实世界中“学号是学生的唯一标识”这一语义规则在关系模式中的投影。同样,在“选课”关系中,(学号, 课程编号) → 成绩表示,只有同时确定了学生和课程,成绩才是唯一确定的——一个学生在一门课程中只有一个成绩。

函数依赖的本质是语义约束,而非数据快照。它不是从当前存储的数据中归纳出来的偶然规律,而是来自业务规则的先验知识。即便“员工”表中当前的数据碰巧满足“姓名→部门”这一依赖(所有人的姓名互不相同),设计者也不应当据此将“姓名→部门”声明为函数依赖——因为未来可能入职一位同名员工,届时这一“依赖”就会瓦解。函数依赖必须来自业务语义的分析,而非数据的归纳。

函数依赖的几种特殊情形值得辨析。平凡函数依赖:如果Y ⊆ X,则X → Y恒成立(如(学号, 姓名) → 姓名),这样的依赖永远为真,不提供额外的约束信息。完全函数依赖:如果X → Y成立,且对于X的任意真子集X',X' → Y都不成立,则称Y完全函数依赖于X。例如,(学号, 课程编号) → 成绩是完全依赖——单独知道学号或单独知道课程编号都无法确定成绩。部分函数依赖:如果X → Y成立,但存在X的某个真子集X'也满足X' → Y,则称Y部分函数依赖于X。部分依赖通常是冗余的根源,在后续范式讨论中将重点关注。传递函数依赖:如果X → Y成立,Y → Z成立,但Y → X不成立(即Y不函数确定X),且Z不属于X,则称Z传递函数依赖于X。传递依赖同样是更新异常的重要诱因。


二、Armstrong公理体系:从已知推导未知

一个关系模式上的函数依赖集合,通常包含设计者显式声明的依赖——这些依赖来自业务规则的分析。然而,这些显式声明的依赖必然蕴含着其他未显式声明的依赖。例如,已知A → B和B → C,则A → C必然成立——即使设计者没有显式声明它。如果系统只能检查显式声明的依赖是否被违反,而无法识别隐式蕴含的依赖,那么完整性约束的检查就是不完整的。

因此,需要一套推理规则,能够从已知的函数依赖集合F出发,推导出F所蕴含的所有函数依赖。这组规则称为Armstrong公理体系,由威廉·阿姆斯特朗于1974年提出。它由三条基本公理构成,且被证明是完备的——任何被F逻辑蕴含的函数依赖,都可以通过反复应用这三条公理从F中推导出来。

Armstrong公理的三条基本规则:

自反律:如果Y ⊆ X ⊆ U(U为关系模式的全体属性集),则X → Y成立。自反律生成的是平凡函数依赖——它表达的逻辑是,一组属性总是函数确定自身的任意子集。自反律不需要任何前提,它是函数依赖系统的公理起点。

增广律:如果X → Y成立,则对于任意Z ⊆ U,XZ → YZ成立。增广律允许在函数依赖的两侧同时添加相同的属性集,而不改变依赖的有效性。例如,从“学号 → 姓名”可以推导出“(学号, 课程编号) → (姓名, 课程编号)”。

传递律:如果X → Y成立且Y → Z成立,则X → Z成立。传递律捕捉了函数依赖的传递性——这是最直观也最常用的推理规则。从“学号 → 院系编号”和“院系编号 → 院系名称”可以推导出“学号 → 院系名称”。

这三条公理构成了一个形式推理系统。任何从F出发,通过有限次应用上述三条公理推导出的函数依赖,都称为F所蕴含的函数依赖。所有被F蕴含的函数依赖的集合,称为F的闭包,记作F⁺。

Armstrong公理体系的美感不仅在于其正确性,更在于其完备性——它恰恰生成了F⁺中的每一个函数依赖,不多不少。这意味着Armstrong公理完整捕获了函数依赖之间的逻辑蕴涵关系,无需额外的推理规则。

从工程便利性出发,可以在三条基本公理基础上推导出若干附加推理规则,这些规则虽不增加推理能力,但简化了常见推导步骤:

合并律:如果X → Y和X → Z成立,则X → YZ成立。合并律允许将具有相同决定因素的多个函数依赖合并为一个右侧更大的依赖。

分解律:如果X → YZ成立,则X → Y和X → Z分别成立。分解律是合并律的逆操作。

伪传递律:如果X → Y和WY → Z成立,则XW → Z成立。伪传递律是传递律与增广律的组合应用。

这些附加规则为手工推导提供了便利,但在形式化证明中,仅需三条基本公理即已完备。


三、属性集闭包:算法化的依赖推导

Armstrong公理体系为函数依赖的推导提供了理论基础,但在实践中,设计者通常面临一个更具体的问题:给定一个属性集X,在已知的函数依赖集合F下,X能够函数确定哪些属性?换句话说,X的“影响力范围”有多广?

这个问题的形式化表达就是属性集闭包。设F是关系模式R上的函数依赖集合,X ⊆ U(U为R的全体属性集)。X关于F的闭包,记作X⁺,定义为所有被X函数确定的属性的集合:

X⁺ = { A | X → A可由F通过Armstrong公理推导得出 }

X⁺直观地回答了问题:从X出发,能“到达”哪些属性。如果X⁺等于全体属性集U,则X是关系模式的一个超码——它能够唯一标识关系中的每一个元组。

求属性集闭包的算法是一个经典的迭代算法,清晰而高效:

输入:属性集X,函数依赖集合F
输出:X的闭包X⁺

算法步骤

  1. 初始化:令X⁺ = X。

  2. 反复执行以下操作,直到X⁺不再发生变化:
    遍历F中的每一条函数依赖Y → Z:
    如果Y ⊆ X⁺(即依赖的左部已在当前闭包中),则将Z加入X⁺:X⁺ = X⁺ ∪ Z。

  3. 输出X⁺。

这个算法的核心思想是反复应用增广律和传递律:如果当前闭包已经包含了某条依赖的左部,那么该依赖的右部也应该属于闭包。算法的终止条件是闭包不再增长——这意味着在当前的知识状态下,所有能从X推导出的属性都已经被包含。

算法的正确性建立在Armstrong公理完备性的基础之上。算法的时间复杂度为O(|F| × |U|),其中|F|是函数依赖的个数,|U|是属性的个数——每次迭代最坏需要遍历全部依赖,而迭代次数不超过属性总数(因为每次迭代至少新增一个属性,否则终止)。

以具体实例演示。设U = {A, B, C, D, E},F = {A → B, BC → D, D → E},求A⁺。

初始:A⁺ = {A}。
第一轮:检查A → B,A ⊆ {A},加入B → A⁺ = {A, B}。检查BC → D,BC ⊈ {A, B},跳过。检查D → E,D ⊈ {A, B},跳过。
第二轮:A⁺ = {A, B},遍历F,BC → D和D → E仍不满足条件。闭包未变化,算法终止。
结果:A⁺ = {A, B}。

再求(BC)⁺:初始BC⁺ = {B, C}。检查A → B,跳过。检查BC → D,BC ⊆ {B, C},加入D → BC⁺ = {B, C, D}。检查D → E,D ⊆ {B, C, D},加入E → BC⁺ = {B, C, D, E}。算法终止。结果:BC⁺ = {B, C, D, E}。

属性集闭包算法是数据库设计理论中最实用的工具之一。它的直接应用包括:判定一个属性集是否为超码(X⁺ = U)、判定一个属性集是否为候选码(X⁺ = U且X的任意真子集Y满足Y⁺ ≠ U)、判定一个函数依赖X → Y是否属于F⁺(检查Y ⊆ X⁺是否成立)。这些判定是下一篇范式理论中判别关系模式属于哪一范式的基本操作。


四、函数依赖覆盖与最小化:理论的精简之道

在实际设计中,一个关系模式上的函数依赖集合F可能包含冗余——某些依赖可能可以从其他依赖推导出来,因此声明它们是多余的。从设计简化与约束维护效率的角度,我们希望找到F的一个最小覆盖——与F等价但更精简的依赖集合。

两个函数依赖集合F和G是等价的,如果F⁺ = G⁺——即它们蕴含的函数依赖完全相同。等价意味着两个集合对关系模式的约束力完全相同,只是表述不同。

函数依赖集合F的最小覆盖(或称规范覆盖)Fc是一个与F等价的函数依赖集合,满足以下条件:每条依赖的右部是单一属性(通过分解律可以实现);删除Fc中任意一条依赖,Fc不再与F等价;删除任意一条依赖左部的任意一个属性,Fc不再与F等价。

最小覆盖的求解过程是一个系统性化简的工程:首先将每条依赖的右部化为单一属性(应用分解律),然后检查每条依赖左部的每个属性是否可以删除而不改变闭包(逐步去掉冗余属性),最后检查每条依赖是否可以被剩余依赖推导出来(删除冗余依赖)。这个过程能够得到一组彼此独立、不可再简化的函数依赖,为后续的模式分解提供最精简的输入。


五、结语:迈向范式理论的桥梁

Armstrong公理体系和属性集闭包算法共同构成了关系数据库设计理论的逻辑引擎。公理体系规定了函数依赖之间的推理规则——它是关于“哪些依赖必然成立”的演绎系统。闭包算法则将这些规则编译为可执行的判定程序——它回答“从给定的属性和依赖出发,能推导出什么”。

这一整套形式化工具的最终目的,不在于公理体系本身的美学价值(尽管它确实优雅),而在于为下一个关键问题提供决策依据:这个关系模式是否设计良好?如果不是,应该如何分解?要回答这些问题,我们需要在函数依赖的形式基础上,引入范式理论——第一范式、第二范式、第三范式、BC范式——每一层范式都精确地定义了何种函数依赖结构是可接受的,何种结构会导致更新异常。下一篇,我们将沿着这一逻辑链条,正式进入范式理论的殿堂。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询