代理键也称为合成主键,当一条新记录由可以声明为该表的主键的数据库自动插入到表中时生成。它是数据库外部的序列号,可供用户和应用程序使用,或者它充当存在于数据库中但对用户或应用程序不可见的对象。
可以说,如果表中没有自然主键,那么我们需要人为地创建一个来唯一标识表中的一行,这个键称为代理键或合成主键。桌子。但是,代理键并不总是主键。假设我们在一个数据库中有多个对象连接到代理键,那么我们将在主键和代理键之间存在多对一的关联,并且代理键不能用作主键。
代理键的特点:
- 它是由系统自动生成的。
- 它保存匿名整数。
- 它包含表中所有记录的唯一值。
- 用户或应用程序永远不能修改该值。
- 代理键称为无事实键,因为添加它只是为了便于识别唯一值,并且不包含对表有用的相关事实(或信息)。
考虑一个例子:
假设我们有两个不同学校的两个表,它们具有相同的列 registration_no 、 name 和 percent ,每个表都有自己的自然主键,即 registration_no 。
学校A表 –
registration_no | name | percentage |
210101 | Harry | 90 |
210102 | Maxwell | 65 |
210103 | Lee | 87 |
210104 | Chris | 76 |
B校表——
registration_no | name | percentage |
CS107 | Taylor | 49 |
CS108 | Simon | 86 |
CS109 | Sam | 96 |
CS110 | Andy | 58 |
现在,假设我们要将两所学校的详细信息合并到一个表中。
结果表将是 –
surr_no | registration_no | name | percentage |
1 | 210101 | Harry | 90 |
2 | 210102 | Maxwell | 65 |
3 | 210103 | Lee | 87 |
4 | 210104 | Chris | 76 |
5 | CS107 | Taylor | 49 |
6 | CS108 | Simon | 86 |
7 | CS109 | Sam | 96 |
8 | CS110 | Andy | 58 |
正如我们可以观察上表看到的,registration_no 不能作为表的主键,因为它不与表的所有记录匹配,尽管它保存了表的所有唯一值。现在,在这种情况下,我们必须人为地为该表创建一个主键。我们可以通过在包含匿名整数且与其他列没有直接关系的表中添加一列 surr_no 来做到这一点。 surr_no 的这个附加列是表的代理键。
代理键的优点:
- 由于没有与表相关的直接信息,因此仅根据应用程序的要求进行更改。
- 由于密钥的值相对较小,因此性能得到增强。
- 键值保证包含唯一信息。
- 由于它拥有较小的常数值,这使得表格的整合变得容易。
- 使我们能够运行快速查询(与自然主键相比)
代理键的缺点:
- 代理键值永远不能用作搜索键。
- 由于键值与表的数据无关,因此违反了第三范式。
- 代理键的额外列将需要额外的磁盘空间。
- 当我们必须插入或更新表的数据时,我们将需要额外的 IO。
代理键的一些示例是:
- 系统日期和时间戳
- 随机字母数字字符串