Уникальный Id Generation - PullRequest
       36

Уникальный Id Generation

1 голос
/ 18 ноября 2009

Как я могу сгенерировать уникальный ключ длиной не более 12 символов с этими атрибутами: Имя, Имя отца, Имя матери, Дата рождения, Место рождения.

Заранее спасибо:)

Ответы [ 5 ]

8 голосов
/ 18 ноября 2009

Основным и фактически единственным атрибутом уникального идентификатора является его уникальность (в пределах области рассмотрения, будь то таблица, схема или глобальная). Включение любых значений «реального мира» в такой идентификатор не имеет смысла.

Вам следует создать уникальное ограничение для указанных вами атрибутов, если вы уверены, что эти атрибуты однозначно описывают человека. Эта комбинация атрибутов образует «естественный ключ» таблицы.

Уникальный идентификатор - это «суррогатный ключ», удобный дескриптор, который избавляет вас от необходимости указывать все столбцы вашего естественного ключа в соединениях с этой таблицей. Способ получения уникального идентификатора зависит от базы данных. Например, в Oracle вы можете использовать последовательность в сочетании с триггером вставки.

Уникальное ограничение на естественный ключ не позволит вам дважды ввести одного и того же человека, но вам следует сначала проверить таблицу, чтобы убедиться, что этот человек уже существует. Если это так, используйте идентификатор, который уже был назначен с этого момента. Конечно, вы можете объединить это в процедуру, в которой вы дадите ей свои поля, и она вернет идентификатор, скрывая процесс поиска или создания, если он новый, и затем возвращая новый идентификатор.

6 голосов
/ 18 ноября 2009

Даже этих столбцов, вероятно, недостаточно для того, чтобы быть уникальным, и, поскольку имя человека может измениться (в зависимости от брака, выбора и т. Д.), Я, как правило, не использовал бы его для генерации уникального ключа.

В зависимости от требований я обычно использую суррогат, например, автономный номер / идентификатор / последовательность или UUID / GUID.

4 голосов
/ 18 ноября 2009

Это не ключ, который вы описываете, а короткий фрагмент структурированных данных, которые вы хотите использовать вместо ключа. Возможно, более услужливо:

- хотите ли вы восстановить эти атрибуты из заданного 12-символьного ключа?

или

- будете ли вы счастливы генерировать ключ только с учетом этих атрибутов?

2 голосов
/ 18 ноября 2009

Если вам нужны одинаковые атрибуты для создания одного и того же ключа, объедините все атрибуты в строку, вычислите хеш SHA1 и обрежьте сначала 96 бит.

Не гарантируется, что он будет уникальным, но 50% вероятность коллизии хеша будет при 3.3E+14 значениях, что более чем достаточно.

Если вам это не нужно, просто используйте суррогат ID.

1 голос
/ 18 ноября 2009

хм .. какая СУБД?

В любом случае, объединить вышеупомянутые строки с результатом функции MySQL UUID, и выполнить функцию CRC32 для результата.

Затем вычтите первые 12 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...