关系模型

<image>

用于数据库管理的关系模型（Relational model）是基于谓词逻辑和集合论的一种数据模型，广泛被使用于数据库之中。最早于1969年由埃德加·科德提出。

## 模型

关系模型的基本假定是所有数据都表示为数学上的关系，就是说n个集合的笛卡儿积的一个子集，有关这种数据的推理通过二值（就是说没有NULL）的谓词逻辑来进行，这意味着对每个命题都有两种可能的赋值：要么是真要么是假。数据通过关系演算和关系代数的一种方式来操作。关系模型是采用二维表格结构表达实体类型及实体间联系的数据模型.

关系模型允许设计者通过数据库规范化的提炼，去建立一个信息的一致性的模型。访问计划和其他实现与操作细节由DBMS引擎来处理，而不应该反映在逻辑模型中。这与SQL DBMS普遍的实践是对立的，在SQL DBMS中，性能调整经常需要改变逻辑模型。

基本的关系建造块是域或者叫数据类型。元组是属性的有序多重集（multiset），属性是域和值的有序对。关系变量（relvar）是域和名字的有序对（序偶）的集合，它充当关系的标头（header）。关系是元组的集合。尽管这些关系概念是数学上的定义的，它们可以宽松的映射到传统数据库概念上。表是关系的公认的可视表示；元组类似于行的概念。

关系模型的基本原理是数据库：所有信息都表示为关系中的数据值。所以，关系变量在程式设计时期是相互无关联的；反而，设计者在多个关系变量中使用相同的域，如果一个属性依赖于另一个属性，则通过参照完整性来强制这种依赖性。

## 竞争者

其他模型还有层次模型和网状模型。使用这些旧体系的一些系统现在仍在一些数据中心中使用，那里有高数据容量需求或者现存系统复杂得使迁移到采用关系模型的系统花费巨大；还要注意新的对象数据库，尽管它们中很多都是DBMS构造工具，而不是严格的DBMS。

关系模型是第一个形式化的数据库模型。在它被定义之后，非形式化模型被用做描述层次数据库（层次模型）和网状数据库（网状模型）。层次和网状数据在关系数据库之前就存在了，但是只在关系模型被定义之后才作为模型来描述，用来建立比较的基础。

## 历史

关系模型是由埃德加·科德博士作为数据的一般模型而发明的，随后由克里斯托佛·达特和休·达温（Hugh Darwen）等人维护和开发。在第三次宣言（1995年）中他们展示了如何向关系模型扩展上面向对象特征而不用妥协它的基本原理。

## SQL标准与关系模型

SQL最初作为关系数据库的标准语言而提出，而在实际上总是违背它。所以SQL DBMS实际上不是真正的RDBMS，并且当前ISO SQL标准不提及关系模型或者使用关系术语或概念。

## 实现

已经有很多尝试去生成埃德加·科德、克里斯多佛·戴特、休·达温等人开发的关系数据库模型的真正实现。但都没有获得流行性成功。Rel 是其中最新的尝试之一。SQL使用概念“表”、“列”和“行”来替代“关系变量”、“属性”和“元组”。

## 争论

科德自己提议了关系模型的一个三值逻辑版本，而且四值逻辑版本也被提议了，用来处理缺失信息。但是这些都未被实现，大概是由于顾及到了复杂性。SQL NULL意图成为三值逻辑系统的一部分，但是由于在标准和它的实现中的逻辑上的错误而没有达到目标。

## 设计

数据库规范化通常在设计关系数据库时进行，用来增进数据库设计的逻辑上的一致性和事务处理性能。

有两种常用的图解系统来辅助关系模型的可视化：实体-联系模式图（实体关系图），和美国空军在ERD基础上建立的IDEF1X方法中所使用的关联IDEF模式图。

## 样例数据库

一些关系变量和它们的属性的一个理想化和非常简单的例子：

Customer（Customer ID, Tax ID, Name, Address, City, State, Zip, Phone）

Order（Order No, Customer ID, Invoice No, Date Placed, Date Promised, Terms, Status）

Order Line（Order No, Order Line No, Product Code, Qty）

Invoice（Invoice No, Customer ID, Order No, Date, Status）

Invoice Line（Invoice No, Line No, Product Code, Qty Shipped）

Product（Product Code, Product Description）

在这个设计中我们有六个关系变量：Customer, Product, Order, Order Line, Invoice,和Invoice Line.粗体字有下划线的属性是候选键。非粗体字有下划线的属性是外键。

通常任意选择一个候选键叫做主键并且优先于其他候选键，它们也就被叫做可选键。

候选键是强制元组不重复的唯一性标识符；否则关系就违背了集合的基本定义，而成为多重集了。键 (码)可以是复合的，就是说可以由多个属性组合而成。下面是我们的例子顾客关系变量的一个表格化描述；关系可以被认为是归结到一个关系变量的值。

## 集合理论公式

关系模型中的基本概念是关系名字和属性名字。我们通常把他们表示为如“Person”和“name”这样的字符串，并且我们通常使用变量r、s、t、......和a、b、c来涉及它们。另一个基本概念原子值的集合包含着如数值和字符串这样的值。

我们的第一个定义关注元组的概念，它是表格中行或记录的概念的形式化。

定义元组是从一组属性名字到一组原子值的偏函数。

定义表头是属性名字的有限集合。

定义元组t在属性的有限集合A上的投影是tA = { (a, v) : (a, v) ∈ t, a ∈ A }。

下一个定义定义了关系，它是关系模型中对表格内容的形式化。

定义关系是带有表头H和表体B的一个元组（H, B），表体是都有域H的元组的集合。

这种关系紧密的对应于在一阶逻辑中通常叫做谓词外延的东西，除了我们这里用属性名字标识在谓词中的位置之外。在关系模型中数据库模式是由一组关系名字，与这些名字相关联的表头，和在数据库模式的每个实例上保持的约束（Constraints）构成的。

定义在表头H上的关系全集U是有表头H的关系的非空集合。

定义关系模式（H, C）由表头H和对有表头H的所有关系R定义的谓词C(R)构成。

定义 如果关系有表头H并满足C则它满足关系模式（H, C）。

### 键（码）约束和函数依赖

最简单和最重要的一类关系约束是键（码）约束。它告诉我们在特定关系模式的所有实例中元组可以通过它特定属性的值来标识。

定义 超键（码）被写为属性名字的有限集合。

定义超键（码）K在关系（H, B）中保持，条件是K ⊆ H并且在B中没有两个不同的元组t1和t2使t1K = t2K。

定义超键（码）在表头H之上的关系全集U中保持，条件是它在U中的所有关系中保持。

定义超键（码）K保持为在H之上的关系全集U的一个候选键，条件是它保持为U的超键（码）并且没有K的真子集也保持为U的超键（码）。

定义 函数依赖（简写为FD）被写为X->Y，X和Y是属性名字的有限集合。

定义函数依赖 X->Y在关系（H, B）中保持，条件是X和Y是H的子集并且对于在B中所有的元组t1和t2使得如果t1X = t2X则't1Y = t2Y。

定义函数依赖X->Y在表头H之上的关系全集U中保持，条件是它在U中的所有关系中保持。

定义函数依赖在表头H下是不证自明的，条件是它在H下的所有关系全集中保持。

定理FD X->Y在表头H下是不证自明的，当且仅当Y ⊆ X ⊆ H。

定理超键（码）K在H之上的关系全集U中保持，当且仅当K ⊆ H并且K->H在U中保持。

定义（Armstrong规则）设S是FD的集合，则S在表头H下的闭包写为S+，它是S的符合如下规律的最小超集:

(自反律)如果Y ⊆ X ⊆ H，则X->Y在S+中。

(传递律)如果X->Y在S+中并且Y->Z在S+中，则X->Z在S+中。

(增广律)如果X->Y在S+中并且Z ⊆ H，则X∪Z -> Y∪Z在S+中。

定理Armstrong规则是可靠的和完备的，就是说给定一个表头H和只包含H的子集的FD集合S，则FD X->Y在S+中，当且仅当在它在H之上的其中所有的S中的FD都保持的所有的关系全集中保持。

定义如果X是属性的有限集合并且S是FD的有限集合，则X在S下的补集写为X+，它是符合如下规律的X的最小超集：

如果Y->Z在S中并且Y ⊆ X+则Z ⊆ X+。

属性集合的补集可以用来计算特定的依赖是否在FD集合的闭包中。

定理给定表头H和只包含H的子集的 FD的集合S，X->Y保持在S+中，当且仅当Y ⊆ X+。

算法（从FD推导候选键（码）)

```
      '''INPUT:'''只包含表头''H''的子集的FD的集合''S''
      '''OUTPUT:'''在''H''之上的其中所有的''S''中的FD都保持的所有的关系全集中
                保持为候选键（码）的超键（码）的集合''C''
      '''begin'''
        ''C'' := ∅;          // 找到的候选键（码）
        ''Q'' := { ''H'' };      // 包含候选键的超键（码）
        '''while''' ''Q'' <> ∅ '''do'''
          设''K''是来自''Q''的某个元素;
          ''Q'' := ''Q'' - { ''K'' };  
          ''minimal'' := '''true''';
          '''for each''' ''X->Y'' '''in''' ''S'' '''do''' 
            ''K' '':= (''K'' - ''Y'') ∪ ''X'';   // 推导新超键（码）
            '''if''' ''K' ''⊂ ''K''
            '''then'''
              ''minimal'' := '''false''';
              ''Q'' := ''Q'' ∪ { ''K' ''};
            '''fi'''
          '''od'''
          '''if''' ''minimal'' '''and'''没有''K''的子集在''C''中
          '''then'''
            从''C''中去除''K''的所有超集;
            ''C'' := ''C'' ∪ { ''K'' };
          '''fi'''
        '''od'''
      '''end'''
```

定义给定表头H和只包含H的子集的FD的集合S，S的不可简约覆盖是符合如下规律的FD的集合T

- S+ = T+
- 没有T的真子集U使S+ = U+。
- 如果X->Y在T中则Y是单元素（singleton）集合并且
- 如果X->Y在T中并且Z是X的真子集则Z->Y不在S+中。

## 延伸阅读

- Date, C. J., Darwen, H. (2000). "Foundation for Future Database Systems: The Third Manifesto", 2nd Edn. Addison-Wesley.
- Date, Christopher J. (2003). "Introduction to Database Systems". 8th ed.