关系数据库设计问题 - 代理键还是自然键?

ary*_*axt 13 sql database-design data-modeling surrogate-key natural-key

哪一个是最佳实践,为什么

a)类型表,代理/人工密钥

外键是user.typetype.id: 替代文字

b)类型表,自然键

外键是user.typetype.typeName: 替代文字

Dan*_*llo 17

我相信在实践中,使用自然键很少是最好的选择.我可能会像你的第一个例子那样采用代理键方法.

以下是自然键方法的主要缺点:

  • 您的类型名称可能不正确,或者您可能只想重命名该类型.要编辑它,您必须更新将其用作外键的所有表.

  • int字段上的索引将比字段上的索引更紧凑varchar.

  • 在某些情况下,可能很难拥有唯一的自然键,这是必要的,因为它将用作主键.这可能不适用于您的情况.

  • 通常,最好的解决方案是 - 具有参照完整性的代理键,以及强制元组唯一性的自然键(通常是它的复合).因此,在上面的示例中,type.typename和用户的某些列组合中将存在唯一约束/索引. (4认同)

Ada*_*tek 9

第一个是未来证明,因为它允许您更改表示类型的字符串而不更新整个用户表.换句话说,您使用代理键,为了灵活性而引入了一个额外的不可变标识符.