1

如何使用以下属性生成最多 12 个字符的唯一键:姓名、父亲姓名、母亲姓名、出生日期、出生地点。

提前致谢 :)

4

5 回答 5

8

唯一标识符的主要且实际上唯一的属性是它是唯一的(在考虑的范围内,可以是表、模式或全局)。将任何“现实世界”值纳入这样的 id 是没有意义的。

如果您确定这些属性唯一地描述了一个人,您应该对您提到的属性创建一个唯一约束。这种属性组合形成了表的“自然键”。

唯一 ID 是一个“代理键”,它是一个方便的句柄,它使您不必在与该表的连接中指定自然键的所有列。如何获得唯一 ID 取决于数据库。例如,在 Oracle 中,您可以将序列与插入触发器结合使用。

自然键上的唯一约束将阻止您两次插入同一个人,但您应该首先检查表以查看该人是否已经存在。如果是这样,请使用从那时起已经分配的 ID。当然,您可以将其组合到一个过程中,在其中给它您的字段,它会返回 ID,隐藏查找它的行为,或者如果它是新的,则创建它,然后返回新的 ID。

于 2009-11-18T17:21:20.277 回答
6

即使这些列也可能不足以成为唯一的,并且由于一个人的名字可以改变(婚姻,选择等),我通常不会使用它来生成唯一的密钥。

我通常使用代理,如自动编号/身份/序列或 UUID/GUID,具体取决于要求。

于 2009-11-18T17:06:44.550 回答
4

这不是您描述的密钥,而是您要使用的一小段结构化数据,而不是密钥。也许更有帮助:

-- 您是否希望能够从给定的 12 个字符的密钥中恢复这些属性?

或者

- 你会乐意只在给定这些属性的情况下生成一个密钥吗?

于 2009-11-18T17:03:08.170 回答
2

如果您需要相同的属性来生成相同的密钥,请将所有属性连接到一个字符串,计算SHA1哈希并修剪第一位96

这不能保证是唯一的,但50%哈希冲突的概率将是3.3E+14绰绰有余的值。

如果您不需要这个,只需使用 surrogate ID

于 2009-11-18T17:20:32.457 回答
1

嗯..哪个DBMS?

无论如何,将上述字符串与 UUID MySQL 函数的结果连接起来,并对结果执行 CRC32 函数。

然后,减去前 12 个字符。

于 2009-11-18T17:02:08.693 回答