【发布时间】:2014-07-10 15:34:12
【问题描述】:
如果一个表有两列充当复合候选键(唯一标识每一行),创建代理键并将其用作主键是否是一种好习惯?
原因是:引用它的外键更容易阅读(引用一列而不是两列)。
另外,如果使用代理键,我应该在前面提到的两列上创建唯一约束吗?
【问题讨论】:
-
你的意思是在美国只有 1 个
John Doe? SS应该是PK,句号。假设传统方面,人们可以更改名字,并且可能两个人有相同的名字——但没有两个人共享一个 SS(除非他们在 Target 进行圣诞购物......) -
我强烈反对 SS 应该是主键。这是敏感数据,绝不能以纯文本形式存储在任何系统中。它应该始终被加密。帮您自己和您的公司一个忙,立即加密该数据。
-
您应该考虑的几件事。社会安全号码不是唯一的。有些人共享相同的社会安全号码。如果你不相信我查一下,你会发现很多文章。我有一个涉及这种情况的真实世界情况。
-
主键应该是唯一的,不为空且稳定。 SSN 可能错误或缺失,并且:它不受您的控制,控制机构可以随时更改其定义/格式。由于 PK 可以作为另一个表中的 FK 的目标,因此您不应该使用任何不稳定的东西作为 PK(此外:它会导致可怕的级联)。而是:使用代理作为 PK。
标签: sql database primary-key composite-primary-key rdbms