目录 / Table of Contents

本文是《数据库系统概论》的第6章以及“Database System: The Complete Book”的第三章所作的部分笔记,用以理解数据库设计过程中的关系数据理论。笔者认为,在这些教材中,对于关系数据理论的阐释可被归结为对于以下几个问题的回应:

预备知识

为了更好地理解下文的内容,读者首先需要掌握关系数据理论中的部分基本概念:

函数依赖(Functional Dependency)

码/键(Key)

范式(Normal Form)

对于范式的概念,特别不靠谱的理解如下:

问题的引入——数据异常及规范化理论

当我们在设计数据库时,若我们考虑不当,将过多的要素全部塞进了一张单独的表时,那么后续操作这张表时可能会引发诸多意料之外的异常情况(anomality),如:

由于笔者太懒异常操作的例子实在过于常见的缘故,笔者在此便不列举具体的例子了。我们更关心的是,这些异常背后到底意味着关系模式设计中的哪些不良性质?

在第2小节里,我们将了解如何通过函数依赖描述一个关系模式。将借助函数依赖刻画关系模式的规范化程度,根据该关系模式属性之间的依赖程度,将该关系模式区分为某一种特定范式,以甄别该关系模式中是否存在引发上述问题的糟糕性质。接着,在第3小节内,我们将了解如何根据特定的规范化程度,对于关系模式进行规范化,将具有糟糕性质的关系模式转化为更合适的形式。 一个设计不当的数据库在操作时之所以会出现那么多异常,其根源在于我们在设计关系模式时忽视了不恰当的部分/传递函数依赖(无论是有意的,还是无意的)。如果我们能事先识别出关系模式中出现的所有可能的函数依赖,那不就可以直接把那些不恰当的函数依赖挑出来,把它们扼杀在摇篮里了吗?规范化的基本思想可被归结为**“一事一地”**,即让每一个关系只描述一个概念、一个实体或者实体之间的联系。这种规范化,可以通过模式分解的手段完成,将低一级的关系模式分解为多个高一级的关系模式,从而消除关系模式中不合适的数据依赖关系。

对这个问题换一个更为具体的表述,那便成了:

给定关系模式R <U, F>以及函数依赖集F的前提下,是否存在一种方法,which能帮助我们找出该关系模式中被F逻辑蕴含的函数依赖的全体

首先,通过定义逻辑蕴含的概念,以准确的刻画出问题的定义。然而,在描述完上面这个问题以后,我们还是一筹莫展——光从这个定义本身而言,我们得不到什么有用的信息,有助于求解该问题。于是,机智的老哥们曲线救国,试着以全新的角度解读这个问题,重新构造了一个推理系统,即Armstrong公理,在逻辑上证明了“逻辑蕴含”与“根据Armstrong公理进行推导”这两个操作之间是等价的(有效性与完备性的证明)。