**关系键**是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性，用来标识该表的每一行或与另一个表产生联系。

主键
--

資料庫理論中, 超鍵、候選鍵與主鍵之間的關係:  

• 候選鍵是超鍵的一種：不含有多餘屬性的超鍵  

• 某個候選鍵被選為主鍵
**主键**，又称**主码**（英語：）。数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的鍵。一个数据表只能有一个主键，且主键的取值不能缺失，即不能为空值（Null）。

从技术的角度来看，primary key和unique key有很多相似之处。但还是有以下区别：

1. 作为primary key的域／域组不能为Null。而unique key可以。
2. 一个表只能有一个primary key，但可有多个unique key。
3. 更大的区别在逻辑设计。primary key一般在逻辑设计中用作记录标识，这也是设置primary key的本意；而unique key只是为了保证域／域组的唯一性。

超键
--

超键（英語：），有的文献称"超码"，是在数据库关系模式设计中能够唯一标示多元組（即"行"）的属性集。

包含**所有**屬性的集叫做**明顯（平凡）超鍵**。

候选键
---

在关系模型中，**候选键**或**候选码**（英語：）是某个关系变量的一组属性所组成的集合，它需要同时满足下列两个条件：

1. 这个属性集合始终能够确保在关系中能唯一标识元组
2. 在这个属性集合中找不出真子集能够满足条件(1)

满足第一个条件的属性集合称为**超键**，因此我们也可以把候选键定义为"最小超键"，也就是不含有多余属性的超键。

候选键的重要性是它们能够在关系中唯一标识出不同的元组，因此超键也是在设计数据库模式时需要指定的最重要的约束之一。由于在关系模型中，每个关系都是一个集合（没有重复的元素），所以每个关系都至少有一个候选键（因为所有属性组合必然是个超键）。但是在某些关系型数据库中表也能代表多重集，所以在每个关系中都显式地定义至少一个候选键是一条很重要的设计原则。数据库管理系统通常都需要将每个关系中的某个候选键定义为主键，亦即这个候选键是区分不同元组时首选的识别方式，例如外键通常就是引用主键而非其他候选键。

外键
--

。其实在關聯式資料庫中，每個資料表都是由關聯來連繫彼此的關係，父資料表（）的主鍵（）會放在另一個資料表，當做屬性以建立彼此的關聯，而這個屬性就是外來鍵。

比如，學生跟老師之間是教學的關聯，學生資料表會有個屬性叫指導老師（FK），而這個值就是對應到老師資料表的老師代號（PK），學生的指導老師就是外來鍵。

代理鍵
---

在关系型数据库设计中，**代理鍵**（英語：surrogate key）是在當資料表中的候選鍵都不適合當主鍵時，例如資料太長，或是意義層面太多，就會请一個无意义的但唯一的字段來代为作主鍵。

代理键是：

Surrogate (1) – Hall, Owlett and Codd (1976)一个代理键值确定了外部世界的一个实体。代理键值是数据库生成的，从来不显示给用户或应用程序看。
Surrogate (2) – Wieringa and De Jonge (1991)一个代理键值确定了数据库中的一个对象。代理键值是数据库生成的，用户或应用程序看不到它。
在实践中，代理键值通常是个自动递增的数字。在Sybase或SQL Server，用identity column标识代理键，PostgreSQL用serial，Oracle用SEQUENCE，在MySQL用标记有AUTO\_INCREMENT的字段。

### 何时使用代理键

以中華人民共和國的十八位身份证号为例，从左往右为六位数字地址码，八位数字出生日期码，三位数字顺序码和一位数字校验码。

一家公司想要将它的客户记入数据库，以客户的身份证号作为主键当然是可以的；但是这18位身份证号是用于标识大陆13多亿人口的，一家公司的客户显然没有这么多，所以用18位的数字作为主键有点浪费空间。

另外，身份证号中包含了地区、生日信息，若以身份证号为主键，要不要另开字段记录客户的地区、生日也是个问题。如果不另开字段，从主键（身份证号）中提取地区、生日有点麻烦；如果开字段，主键和地区、生日字段的数据存在冗余。

所以，一般的做法是，根本不记录客户的身份证号（除非有其他需求），用一个代理键作为主键，另开字段记录客户的地区、生日等信息。

自然键
---

自然键（英語：natural key）与代理键相反，是在自然（真實）生活中唯一确定一个事物的标识。身份证号（理论上，假设没有因技术原因造成的重复）就是一个自然键，用于确定一个人。

参考文献
----

外部链接
----

* 一個詳細介紹外鍵的網站
* 資料庫系統理論[永久]


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

| * 
* 论
* 编
数据库管理系统（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

 |

 |

 |