Database 何时应将社会保险号码用作数据库主键?

Database 何时应将社会保险号码用作数据库主键?,database,database-design,relational-database,Database,Database Design,Relational Database,我们的DBA说,因为社会保险号(SSN)是唯一的,所以我们应该将其用作表中的主键 虽然我不同意DBA(并且已经提到了中的一些好的部分),但在任何情况下,他都可能是正确的吗?永远不会 在美国,无论是联邦政府还是几个州,都有关于社会保险号码的处理和使用的严格法律。随着身份盗窃问题越来越成为人们关注的焦点,这种担忧只会变得更加规范。因此,我强烈建议您不要将其用作数据库密钥。SS#应该是记录中的一个(非常机密)栏 此外,它是客户提供的价值。有时,提供的值不正确、丢失或无意中重复。决不能将客户提供的任何类

我们的DBA说,因为社会保险号(SSN)是唯一的,所以我们应该将其用作表中的主键


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

永远不会

在美国,无论是联邦政府还是几个州,都有关于社会保险号码的处理和使用的严格法律。随着身份盗窃问题越来越成为人们关注的焦点,这种担忧只会变得更加规范。因此,我强烈建议您不要将其用作数据库密钥。SS#应该是记录中的一个(非常机密)栏

此外,它是客户提供的价值。有时,提供的值不正确、丢失或无意中重复。决不能将客户提供的任何类型的值用作数据库主键。您不应该将“供人使用”的标识符用作数据库主键。(人类可以容忍歧义……计算机不能!)相反,让所有这样的标识符都是存储在数据库某处的列值,可能(或者,不…)由
UNIQUE
键索引,以防止重复


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

只能根据业务规则确定键。重要的是,根据您的业务需求,强制实施SSN的唯一性是否有意义。这不是DBA可以单独决定的问题。这是咨询人力资源部或其他使用这些数据的人的事情


假设您的表将至少有一个键(可能不止一个),那么我建议DBA最适合就主键的策略提供建议。如果主键的选择非常重要,那么DBA应该这么说。

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

6.1%的美国人的名字至少有两个SSN。超过100000名美国人有五个或更多与其姓名相关的SSN。[…]超过15%的SSN与两个或两个以上的人相关。超过140000个SSN与五个或更多人相关。值得注意的是,超过27000个SSN与10个或更多人相关。
--


另见维基百科

正如您所提到的,有时提供的值不正确。我第一次想到这个问题是因为,在我生命的早期,一家银行错误地输入了我的SSN。。。然后他们说,如果不关闭并重新打开帐户,他们就无法更改。这个答案是不符合逻辑的。唯一的、不可为空的密钥与主键是一样的。重要的是如何使用这些钥匙。这个问题没有说明如何使用密钥,因此没有充分的理由质疑DBA的建议。在这里说“决不”完全是武断的。保密当然很重要。无论SSN是主键还是非主键,机密性问题都是相同的。无论SSN是否为主键,保护SSN不被滥用的责任是相同的。我在为一家健康保险公司(CIGNA Arizona)做项目时,不得不处理一个类似的问题。他们的“提供者ID”包含嵌入的信息,并且是人工发布的,并且有许多重复项,提供者必须知道使用他们的许多号码中的哪一个。非常可怕。我通过创建随机唯一主键来明确标识“提供者”,并与“提供者ID”建立1:M关系,从而解决了这个问题。这使他们能够获得所需的报告,并随着时间的推移清理映射表。当一个全新的计划推出时,我的软件仍在运行。。。。而且,顺便说一句,这些“随机PK”从未公开,只是为了防止一些人试图使用它们!UUID还没有被发明出来。主键正是一个好的主键所应该具备的——任意的、唯一的、无意义的,并且隐藏在用户的视线之外。这个问题的目的是寻找其他视图,您当然已经提供了一个。我正在寻找一种技术情况下,这种事情可能是正确的。你能详述你的一些观点吗?人力资源部什么样的业务决策可能需要将此作为
PK
而不是
UNIQUE
?我认为您不理解我的答案。强制唯一性(即键)的要求取决于业务规则和表在其业务上下文中的预期含义。PK只是一个键——可能是表中几个键中的一个。您调用的主键(如果有的话)的选择通常由以下三个因素中的任意一个决定:A)任意偏好,B)您使用的软件的技术限制,C)本地约定。您的DBA最适合就B和C提供建议,因为我们对您环境中使用的软件和标准一无所知。