Это распространенная проблема, например, при использовании таблицы людей (называемой ЛИЧНОМ, пожалуйста) и каждый человек классифицируется, например, врачи, пациенты, сотрудники, медсестры и т. Д.
Имеет смысл создать таблицу для каждого из этих людей, которая будет содержать информацию о конкретной категории, такую как дата начала работы и зарплата, а также квалификации и количество медсестер.
Например, у Пациента может быть много медсестер и врачей, которые работают над ним, поэтому таблица «многие ко многим», которая связывает Пациента с другими людьми в таблице ЛИЦО, облегчает это. В этой таблице должно быть некоторое описание отношений между этими людьми, которое возвращает нас к категориям людей.
Поскольку врач и пациент могут создавать одинаковые идентификаторы первичного ключа в своих собственных таблицах, становится очень полезным иметь глобально уникальный идентификатор или идентификатор объекта.
Хороший способ сделать это, как предложено, состоит в том, чтобы иметь таблицу, предназначенную для автоматического увеличения первичного ключа. Сначала выполните вставку в эту таблицу, чтобы получить OID, а затем используйте ее для нового ЛИЦА.
Мне нравится идти дальше. Когда дела идут ужасно (какой-то новый разработчик получает в свои руки базу данных или, что еще хуже, действительно старый разработчик, тогда очень полезно добавить больше смысла в OID.
Обычно это делается программно, а не с ядром базы данных, но если вы используете BIG INT для всех идентификаторов первичного ключа, тогда у вас будет много места для префикса числа с визуально идентифицируемой последовательностью. Например, все идентификаторы врачей могут начинаться со 100, все пациенты - со 110, все медсестры - со 120.
К этому я добавлю, скажем, юлианскую дату или дату + время Unix, и, наконец, добавлю идентификатор автоматического увеличения.
Это приведет к таким числам, как:
110,2455892,00000001
120,2455892,00000002
100,2455892,00000003
, поскольку юлианская дата через 100 лет составляет всего 2492087, вы можете видеть, что 7 цифр будут адекватно хранить это значение.
BIGINT - это 64-разрядное (8-байтовое) целое число со знаком со значением от -9,22 × 10 ^ 18 до 9,22 × 10 ^ 18 (от -2 ^ 63 до 2 ^ 63 -1). Обратите внимание, что показатель степени равен 18. Это 18 цифр, с которыми вам нужно работать.
Используя этот дизайн, вы ограничены 100 миллионами OID, 999 категориями людей и датами до ... намного больше срока годности вашей базы данных, но я подозреваю, что этого достаточно для большинства решений.
Операции, требуемые для создания подобного OID, - это умножение и деление, которые исключают все искажения при обработке текста.
Недостатком является то, что для вставки требуется больше, чем простая инструкция TSQL, но преимущество заключается в том, что когда вы отслеживаете ошибочные данные или даже умны в своих запросах, ваш OID визуально говорит вам много больше, чем случайное число или хуже , бельмо на глазу, как GUID.