【问题标题】:Unique Id Generation唯一标识生成
【发布时间】:2009-11-18 16:57:58
【问题描述】:

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

提前致谢:)

【问题讨论】:

  • 任何特定的数据库系统? MySQL?甲骨文? SQL Server?
  • 如果一对双胞胎都叫 George Foreman,那么这把钥匙可能有问题。
  • 是的,但这是最罕见的情况。没想到
  • 声望低于100,何乐而不为?

标签: database oracle unique-key


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但是每次相同的用户输入时我都需要生成相同的数字。
    • 您可以为相同的输入生成一个相同的数字(即使是简单的校验和也可以做到这一点) - 这不是问题 - 避免冲突是问题 - 即使是 CRC 也可能有冲突。如果您要在世界上所有的生活人口中运行 32 位 CRC 将不足以不发生冲突(因为它只有超过 40 亿的空间)。
    • @Database:不,你不需要生成数字;您需要一个返回与该人关联的数字的数据库查找,或者如果没有找到值则创建一个新的(并且您确定没有拼写错误、空格等)。请参阅我的答案以了解更多详细信息。
    【解决方案3】:

    这不是您描述的键,而是您要用来代替键的一小段结构化数据。也许更有帮助:

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

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

    【讨论】:

    • 不,我不想恢复这些属性。但是我不想每次用户输入他的名字,父亲的名字时都匹配。我想匹配生成的密钥。
    【解决方案4】:

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

    这不能保证是唯一的,但 50% 哈希冲突的概率将是 3.3E+14 值,这已经足够了。

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

    【讨论】:

      【解决方案5】:

      嗯.. 哪个 DBMS?

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

      然后,减去前 12 个字符。

      【讨论】:

      • 甲骨文。我想在插入数据库之前制作这个密钥。我会在前端使用c#。
      • 如果你想在它接触数据库之前制作这个键,那么它就不再是一个数据库问题了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      相关资源
      最近更新 更多