用于数据库管理的**关系模型**（英語：）是基于谓词逻辑和集合论的一种数据模型，廣泛被使用於資料庫之中。最早於1970年由埃德加·科德提出。

模型
--

关系模型的基本假定是所有数据都表示为数学上的关系，就是说*n*个集合的笛卡儿积的一个子集，有关这种数据的推理通过二值（就是说没有NULL[需要消歧义]）的谓词逻辑来进行，这意味着对每个命题都有两种可能的賦值：要么是真要么是假。数据通过关系演算和关系代数的一种方式来操作。关系模型是採用二維表格結構表達實體類型及實體間聯繫的數據模型.

关系模型允许设计者通过数据库规范化的提炼，去建立一个信息的一致性的模型。访问计划和其他实现与操作细节由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*上的*投影*是*t*[*A*] = { (*a*, *v*) : (*a*, *v*) ∈ *t*, *a* ∈ *A* }。
下一个定义定义了*关系*，它是关系模型中对表格内容的形式化。

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

**定义**在表头*H*上的*关系全集'**U*****是有表头*H*的关系的非空集合。**
**定义***关系模式*（*H*, *C*）由表头*H*和对有表头*H*的所有关系*R*定义的谓词*C*(*R*)构成。
**定义** 如果关系有表头*H*并满足*C*则它满足关系模式（*H*, *C*）。
### 键（码）约束和函数依赖

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

**定义** *超键（码）*被写为属性名字的有限集合。
**定义**超键（码）*K*在关系（*H*, *B*）中保持，条件是*K* ⊆ *H*并且在*B*中没有两个不同的元组*t1*和*t2*使*t1*[*K*] = *t2*[*K*]。
**定义**超键（码）在表头*H*之上的关系全集*U*中保持，条件是它在*U*中的所有关系中保持。
**定义**超键（码）*K*保持为在*H*之上的关系全集*U*的一个*候选键 (码)*，条件是它保持为*U*的超键（码）并且没有*K*的真子集也保持为*U*的超键（码）。
**定义** *函数依赖*（简写为FD）被写为*X*->*Y*，*X*和*Y*是属性名字的有限集合。
**定义**函数依赖 *X*->*Y*在关系（*H*, *B*）中保持，条件是*X*和*Y*是*H*的子集并且对于在*B*中所有的元组*t1*和*t2*使得如果*t1*[*X*] = *t2*[*X*]则't1*[*Y*] =* t2*[*Y*]。*
**定义**函数依赖*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*
1. *S*+ = *T*+
2. 没有*T*的真子集*U*使*S*+ = *U*+，
3. 如果*X*->*Y*在*T*中则*Y*是单元素（singleton）集合并且
4. 如果*X*->*Y*在*T*中并且*Z*是*X*的真子集则*Z*->*Y*不在*S*+中。

引用
--

* Codd, E. F. (1970). "A relational model of data for large shared data banks". *Communications of the ACM*, Vol. 13, No. 6, pp. 377-387. Retrieved from  Sept. 4, 2004.
* 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.

外部链接
----

* 關聯式模型
* A Relational Model of Data for Large Shared Data Banks
* DMoz category
* Relational Model （页面存档备份，存于）

参见
--

* 关系的不同历史版本的元组式控制（英语：）


|  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数据库模型（英语：） |
| --- |
|  |
| 常见模型 | 
* 平面
* 层次
* 空间建模（英语：）
* 网状
* 关系
* ER模型
	+ 增强实体关系模型（英语：）
* 图
* 面向对象
* 实体-属性-值（英语：）

 |
|  |
| 其他模型 | 
* 关联（英语：）
* 多维
* 数组（英语：）
* 语义数据模型（英语：）
* 星模式（英语：）
* XML数据库（英语：）

 |
|  |
| 实现 | 
* 平坦檔案
* 列式
* 面向文档
* 对象关系（英语：）
* 演绎（英语：）
* 时间
* XML数据存储（英语：）
* 键-值存储
* 三元存储（英语：）

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数据库管理系统（DBMS） |
| --- |
|  |
| 概念 | 
* 数据库
	+ 理論
* 数据模型
* 数据库存储结构（英语：）
* 关系 (数据库)
* 关系模型
* 分布式数据库
* ACID
	+ 原子性（英语：）
	+ 一致性
	+ 隔離性
	+ 持久性
* Null值
* 数据库规范化
* 數據庫完整性
* 實體完整性
* 參照完整性
* 关系数据库管理系统
* 主键
* 外键
* 代理键
* 超键
* 候选键
* 事务处理
* 增刪查改

 |
|  |
| 数据库组件 | 
* 触发器
* 视图
* 数据库表
	+ 
	+
* 指标
* 事务日志（英语：）
* 数据库事务
* Savepoint
* 并发控制
* 乐观锁
* 悲观锁
* 数据库索引
* 存储程序
* 資料庫分割（英语：）

 |
|  |
| SQL | 

|  |  |
| --- | --- |
| 分类 | 
* 数据查询语言（DQL）
* 資料定義語言（DDL）
* 資料操縱語言（DML）
* 資料控制語言（DCL）

 |
|  |
| 指令 | 
* SELECT
* INSERT
* UPDATE
* MERGE
* DELETE
* JOIN
* UNION
* CREATE
* DROP
* Begin work
* COMMIT
* ROLLBACK
* TRUNCATE
* ALTER

 |
|  |
| 安全 | 
* 
* 參數化查詢

 |

 |
|  |
| 实现 | 

|  |  |
| --- | --- |
| 类型 | 
* 关系数据库
* 面向文檔的數據庫
* 平面文件数据库
* Deductive（英语：）
* 維度化資料庫
* 階層式
* 图数据库
* NoSQL
* NewSQL
* 对象数据库
* 物件關聯式資料庫（英语：）
* Temporal
* XML資料庫（英语：）

 |
|  |
| 数据库产品 | 
* 对象型
	+ 对比
* 关系型
	+ 对比

 |
|  |
| 数据库组件 | 
* 数据查询语言
* 查詢最佳化器（英语：）
* 查詢計畫（英语：）
* 嵌入式SQL
* ORM
* LINQ
* 数据访问层
* ODBC
* OLE DB
* ADO
* ADO.NET
* JDBC
* PDO

 |

 |

 |