Person表主键的最佳选择

Dan*_*Dan 5 database database-design primary-key

在代表一个人的表(如客户,用户,客户,员工等)中,您对主键的选择是什么?我的第一选择是SSN号码.但是,由于隐私问题和不同的法规,不鼓励使用SSN.SSN可以在人的一生中改变,因此这是另一个原因.

我想精心挑选的自然主键的功能之一就是避免重复.我不希望一个人在数据库中注册两次.某些代理或生成的主键无助于避免重复条目.解决这个问题的最佳方法是什么?

编辑:

保证人员实体应用程序唯一性的最佳方法是什么?这可以在数据库级别使用主键或唯一性约束来处理吗?

Pas*_*TIN 7

我不知道您使用的是哪个数据库引擎,但(至少使用MySQL - 请参阅7.4.1.尽可能减小数据),使用尽可能短的整数通常被认为是性能和内存的最佳选择要求.

auto_increment对于那个主键,我会使用一个整数.
这个想法是:

  • 如果PK很短,它有助于识别每一行(比较两个整数比两个长串更快更容易)
  • 如果外键中使用的列很短,则外键需要的内存较少,因为该列的值可能存储在多个位置.

然后,UNIQUE在其他列上设置索引 - 确定单一性的列 - 如果可能和/或必要的话.


编辑:以下是您可能感兴趣的其他一些问题/答案:

  • 让一个人与众不同的是一个更复杂的问题:不是名字,不是地址,不是生日,不是...... ;; 也许是其中一些的组合?喜欢名字+中间名(不确定那些用英语怎么称)+姓氏+出生日期+出生地+性别;; 那些通常是"行政"形式上使用的,在这里,我想应该不会太糟糕? (3认同)

Lar*_*abe 3

如上所述,使用自动增量作为主键。但我不认为这是你真正的问题。

您真正的问题是如何避免重复条目。从理论上讲,这是不可能的——两个人可以在同一天出生、同名、住在同一个家庭,而且其中一方没有社会保险号码。(其中一个可能是访问该国的外国人)。

然而,全名、出生日期、地址和电话号码的组合通常足以避免重复。请注意,输入的地址可能会有所不同,人们可能有多个电话号码,并且人们可能会选择省略中间名或使用首字母缩写。这取决于避免重复条目的重要性以及您的用户群有多大(以及冲突的可能性)。

当然,如果您可以获得 SSN/SIN,则可以使用它来确定唯一性。