SQL 中的代理键是分配给数据库记录的人工标识符,用于在表中唯一区分它。与从现有数据属性(如电子邮件或社会安全号码)派生唯一性的自然键不同,代理键在数据库之外没有固有的含义。它通常是一个自增整数,但也使用其他格式,如 UUID 或 GUID。例如,对于每个新用户自动递增 1 的 user_id
列是一个代理键。它的唯一目的是为数据关系提供一个稳定、简单的参考点,独立于外部因素或业务逻辑更改。
代理键被广泛使用,因为它们解决了数据库设计中的实际挑战。自然键可能会更改(例如,用户的电子邮件可能会被更新),或者当需要多个列来保证唯一性(复合键)时会引入复杂性。代理键通过提供单列统一标识符来简化连接和查询。例如,在 orders 表中,order_id
代理键允许通过紧凑的整数列 (customer_id
) 将订单链接到客户,而不是依赖于容易出错的名称和地址组合。它们还可以提高性能:基于整数的键比基于字符串的自然键索引和比较速度更快。此外,代理键将数据库的内部结构与外部系统分离,从而减少了模式更改的破坏性。
当使用代理键时,开发人员仍然应该在适当的地方对自然键强制执行唯一性(例如,在 email
上添加唯一约束以防止重复)。代理键不会取代数据完整性检查,它们只是对它们的补充。例如,product
表可能有一个用于内部连接的代理 product_id
和一个用于业务操作的自然 sku
列。一个缺点是代理键需要连接才能检索有意义的属性(例如,使用用户的 user_id
获取用户的电子邮件)。在分布式系统中,UUID 可以避免跨数据库的冲突,但会增加存储大小。选择自增整数和 UUID 取决于可伸缩性需求和查询效率。总的来说,代理键是平衡数据库设计中简单性、性能和可维护性的基础工具。