Это стандартный способ создания базы данных?

8

Недавно я узнал о том, как определяются отношения в базе данных на работе, и мне было интересно, является ли это стандартной практикой.

Допустим, у нас есть два процесса: процесс A и процесс B. Процесс B зависит от результатов процесса A, поэтому необходимо определить взаимосвязь между запуском процесса B и процессом A. Вот как определяются отношения:

TableProcessA:
Id

а также

TableProcessB:
Id
ProcessAId

Теперь, до этого момента, вещи имеют смысл для меня, но потом все становится немного странным для меня и моего понимания дизайна стола. Всякий раз, когда в TableProcessA или TableProcessB создается строка, вызывается функция, которая создает глобально уникальный идентификатор для каждого. Таким образом, в основном, все поля Id в TableProcessA и TableProcessB не будут содержать совпадений, потому что идентификаторы не только уникальны для своей таблицы, но и для всей базы данных.

У меня вопрос, насколько это стандартно? Я был воспитан на мысли, что каждая таблица должна просто иметь автоинкрементный идентификатор, который уникален только для таблицы, а не для всей базы данных.

sooprise
источник
3
может представлять интерес: dba.stackexchange.com/questions/322/…
Дерек Дауни,
У Луи Дэвидсона есть много постов о дизайне баз данных: sqlblog.com/blogs/louis_davidson/archive/tags/Database+Design/… . Будьте осторожны при хранении данных отдельно для каждого процесса, если только они не предназначены для регистрации.
Эрик Хамфри - Лотсхелп

Ответы:

7

Это не такая странная практика. Они называются GUID или глобально уникальными идентификаторами. Идея состоит в том, что, учитывая GUID, вы можете точно сказать, к какой части данных принадлежит идентификатор, потому что он будет уникальным везде . GUID лучше всего использовать, когда вы будете объединять разные источники похожих данных; например инвентарь для разных магазинов.

Я бы провел некоторое исследование и выяснил, почему это обычная практика в вашей среде. Может быть, это нужно, а может и нет.

DForck42
источник
4

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

В дополнение к вашему вопросу, я бы настоятельно рекомендовал не использовать GUID в качестве первичных или суррогатных ключей, так как он занимает в 4 раза больше пространства типа int. Сейчас, когда речь идет о многигабайтных дисках, вы можете сказать, что это не важно, но если у вас есть несколько миллионов строк данных, для чтения с диска или передачи по сети все равно требуются ресурсы, особенно если они включены в какие-либо индексы. Пока я на предметных указателях, GUID плох в первичных ключах из-за их случайного характера и обычно вызывает значительную фрагментацию.

Сейчас, вероятно, будет слишком поздно для этой базы данных, но имейте это в виду на будущее

GrumpyMonkey
источник
4

Ваши процессы могут создавать записи, которые содержат GUID в качестве ссылки на экземпляр процесса, но использование GUID в качестве ключа не обязательно является оптимальным.

Я вижу три основных недостатка использования идентификаторов GUID в качестве ключей базы данных и буду их избегать, если у вас нет веских причин для их использования. Обратите внимание, что глобально уникальное свойство не дает вам никаких преимуществ по сравнению с использованием ключа, который является локально уникальным в таблице, потому что вы уже знаете, из какой таблицы получены данные.

Неудобство. Не очень легко ввести GUID, если вы хотите выполнить специальный запрос к базе данных, например:

select *
  from Foo
 where FooID = 12345

против

select *
  from Foo
 where FooID = convert (uniqueidentifier, '5E64E653-35F0-4803-B459-F5F59C701F22')

Последнее практически означает, что вам нужен источник GUID для вырезания и вставки.

2. Естественная ординальность: автоинкрементный первичный ключ имеет побочный эффект естественного упорядочения ваших транзакций в порядке их ввода в систему. Это часто довольно полезно. Идентификаторы GUID обычно генерируются не по порядку, поэтому они бесполезны в этом отношении.

3. Размер. В наши дни это не так важно, но GUID имеет длину 16 байт. Он занимает больше места в таблице и любых индексах, которые ее включают.

ConcernedOfTunbridgeWells
источник
Глобальный уникальный идентификатор - это целое число, которое просто ++ каждый раз, когда появляется новый. Это обычная практика или длина GUID всегда 16 байтов?
сюрприз
GUID - это 128 бит (16 байтов), чтобы иметь достаточно большое пространство имен. Традиционно они включают в себя уникальные элементы, такие как MAC-адреса и временные метки, чтобы дать некоторой части значения действительно уникальную базу. Интересно, к каким типам относятся ваши идентификаторы и являются ли они действительно GUID - обычно GUID, по крайней мере, частично случайны.
ConcernedOfTunbridgeWells
Идентификаторы генерируются путем поиска всех идентификаторов, взятия максимума и добавления 1.
sooprise
0

Я не скажу, что это нормально, но это не ненормально, чтобы все так настроить.

mrdenny
источник
2
-1 в этом смысле этот ответ не дает ничего полезного.
Дерек Дауни
1
технически это действительно отвечает на вопрос
DForck42
2
Ответы да. Предоставляет что-нибудь полезное, нет.
Мэтт Хэнсон
Денни - как модератор и опытный администратор БД, я удивлен, что вы не добавили чуть-чуть больше деталей в свой ответ. Возможно, было бы неплохо сказать, почему случайное создание GUID является плохой практикой в ​​целом, или почему это не создает проблем с точки зрения уникальности. В настоящее время система хочет знать, следует ли мне рекомендовать удаление вашего поста.
Макс Вернон