社交安全号何时应该用作数据库主键?

时间:2017-07-31 17:45:50

标签: database database-design relational-database

我们的DBA说,因为社会安全号码(SSN)是唯一的,我们应该将它用作表格中的主键。

虽然我不同意DBA(并且已经提到了this answer中找到的一些好的部分),但在任何情况下他都可能是正确的吗?

3 个答案:

答案 0 :(得分:5)

SSN不是人们的唯一标识符。是否应该是某些表中的PK取决于表中的行的含义。 (另见sqlvogel's answer。)

  

6.1%的美国人至少有两个与他们的名字相关的SSN。超过100,000名美国人拥有五个或更多与他们的名字相关的SSN。 [...]超过15%的SSN与两个或更多人有关。超过140,000个SSN与五个或更多人相关联。值得注意的是,超过27,000个SSN与10个或更多人联系在一起    - idanalytics.com

另见维基百科Social Security number

答案 1 :(得分:4)

<强>从不!

在美国,联邦政府和几个州都有严格的法律,涉及社会保障号码的处理及其用途。随着身份盗窃问题越来越多地出现在前列,这种担忧只会变得更加规范。因此,我强烈建议您永远不要将其用作数据库密钥。 SS#应该是记录中的一个(非常机密的)列。

此外,它是客户提供的值。有时,提供的值不正确,或丢失,或无意中重复。您永远不应将客户提供的任何类型的值用作数据库主键。您不应该使用预期的标识符#34;供人类使用&#34;作为数据库主键。 (人类容忍歧义......计算机不会!)相反,让所有这些标识符都是存储在数据库中某个位置的列值,可能(或不是......)由UNIQUE键索引以防止重复。

我建议所有主键都应该是完全抽象的,根本不含任何含义。例如,可以使用UUID。在数据库中,可以使用自动递增整数。

答案 2 :(得分:0)

密钥只能根据业务规则确定。重要的是,在您的业务需求的背景下是否有必要强制执行SSN的唯一性。这不是你的DBA可以决定的问题。这是咨询人力资源部门或其他人使用这些数据的事情。

假设您的表至少有一个密钥(可能不止一个),那么我建议DBA最好就主键的策略提出建议。如果主键的选择具有任何重要性,那么DBA应该这样说。