Преимущества и недостатки ключей базы данных GUID/UUID

StackOverflow https://stackoverflow.com/questions/45399

  •  09-06-2019
  •  | 
  •  

Вопрос

В прошлом я работал над несколькими системами баз данных, где перемещение записей между базами данных было бы намного проще, если бы все ключи базы данных были ГУИД/УУИД ценности.Я рассматривал возможность пойти по этому пути несколько раз, но всегда есть некоторая неопределенность, особенно в отношении производительности и URL-адресов, которые невозможно прочитать по телефону.

Кто-нибудь много работал с GUID в базе данных?Какие преимущества я получу, если пойду по этому пути, и каковы возможные подводные камни?

Это было полезно?

Решение

Преимущества:

  • Может генерировать их в автономном режиме.
  • Делает репликацию тривиальной (в отличие от int, что делает ее ДЕЙСТВИТЕЛЬНО сложной)
  • ORM они обычно нравятся
  • Уникальный для всех приложений.Таким образом, мы можем использовать ПК из нашей CMS (руководство) в нашем приложении (также руководство) и знать, что у нас НИКОГДА не возникнет конфликт.

Недостатки:

  • Большее использование пространства, но пространство дешевле (э-э)
  • Невозможно заказать по идентификатору, чтобы получить заказ на вставку.
  • URL-адрес может выглядеть некрасиво, но на самом деле, какого черта вы помещаете НАСТОЯЩИЙ ключ БД в URL-адрес!?
  • Сложнее выполнять отладку вручную, но не так уж и сложно.

Лично я использую их для большинства ПК в любой системе приличного размера, но я «обучился» на системе, которая была реплицирована повсюду, поэтому мы ДОЛЖНЫ были иметь их.ЮММВ.

Я думаю, что дублирование данных — это чушь: вы можете получить дубликаты данных, как бы вы это ни делали.Где бы я ни работал, к суррогатным ключам обычно неодобрительно относятся.Однако мы ДЕЙСТВИТЕЛЬНО используем систему, подобную WordPress:

  • уникальный идентификатор строки (GUID или что-то еще).Никогда не виден пользователю.
  • публичный идентификатор генерируется ОДИН РАЗ из некоторого поля (например,заголовок - сделайте его названием-статьи)

ОБНОВЛЯТЬ:Итак, этот вариант часто получает +1, и я подумал, что должен указать на большой недостаток GUID PK:Кластеризованные индексы.

Если у вас много записей и кластеризованный индекс по GUID, ваша производительность вставки будет ОТСУТСТВУЮЩЕЙ, поскольку вы получаете вставки в случайных местах списка элементов (в этом суть), а не в конце (что быстро).

Поэтому, если вам нужна производительность вставки, возможно, используйте auto-inc INT и сгенерируйте GUID, если вы хотите поделиться им с кем-то еще (т. е. показать его пользователю в URL-адресе).

Другие советы

@Мэтт Шеппард:

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

Итак, у вас есть идентификатор клиента, который однозначно идентифицирует клиента, и вы убедитесь, что этот идентификатор известен клиенту (в счетах-фактурах), чтобы у клиента и специалистов по обслуживанию клиентов была общая ссылка на случай, если им понадобится общаться.Чтобы гарантировать отсутствие дублированных записей о клиентах, вы добавляете в таблицу ограничение уникальности либо через первичный ключ идентификатора клиента, либо через ограничение NOT NULL + UNIQUE в столбце идентификатора клиента.

Затем по какой-то причине (о которой я не могу вспомнить) вас просят добавить столбец GUID в таблицу клиентов и сделать его первичным ключом.Если столбец идентификатора клиента теперь останется без гарантии уникальности, вы напрашиваетесь на будущие проблемы во всей организации, поскольку идентификаторы GUID всегда будут уникальными.

Какой-нибудь «архитектор» может сказать вам: «О, но мы занимаемся настоящий Ограничение уникальности клиента на нашем уровне приложений!».Верно.Мода на эти языки программирования общего назначения и (особенно) среды среднего уровня постоянно меняется и, как правило, никогда не переживет вашу базу данных.И очень велика вероятность того, что в какой-то момент вам понадобится доступ к базе данных без использования текущего приложения.== Проблема.(Но, к счастью, вас с «архитектором» давно нет, поэтому вас не будет, чтобы наводить порядок.) Другими словами:Поддерживайте очевидные ограничения в базе данных (и на других уровнях, если у вас есть время).

Другими словами:Могут быть веские причины для добавления столбцов GUID в таблицы, но, пожалуйста, не поддавайтесь искушению снизить ваши амбиции по обеспечению согласованности внутри таблицы. настоящий (==не-GUID) информация.

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

Основными недостатками являются необходимость немного большего объема памяти (это не проблема для современных систем), а идентификаторы не совсем читабельны для человека.Это может быть проблемой при отладке.

Есть некоторые проблемы с производительностью, такие как фрагментация индекса.Но эти проблемы легко решить (направляющие для расчесок Джимми Ниллсона: http://www.informit.com/articles/article.aspx?p=25862 )

Редактировать объединил два моих ответа на этот вопрос

@Мэтт Шеппард Я думаю, он имеет в виду, что вы можете дублировать строки с разными GUID в качестве первичных ключей.Это проблема любого суррогатного ключа, а не только GUID.И, как он сказал, эту проблему легко решить, добавив значимые уникальные ограничения к неключевым столбцам.Альтернативой является использование естественного ключа, и с этим возникают реальные проблемы.

GUID могут вызвать у вас много проблем в будущем, если они будут использоваться в качестве «уникификаторов», позволяя дублированным данным попасть в ваши таблицы.Если вы хотите использовать GUID, рассмотрите возможность сохранения ограничений UNIQUE для других столбцов.

Почему никто не упоминает производительность?Когда у вас есть несколько объединений, и все они основаны на этих отвратительных GUID, производительность упадет до минимума, вот там :(

Еще одна небольшая проблема, которую следует учитывать при использовании GUIDS в качестве первичных ключей, если вы также используете этот столбец в качестве кластерного индекса (относительно распространенная практика).Вы собираетесь выполнить вставку, потому что характер направляющих в любом случае не начинается последовательно, поэтому при вставке они будут разделены на страницы и т. Д.Просто стоит учитывать, будет ли система иметь высокий уровень ввода-вывода...

первичные ключи-идентификаторы-по сравнению с-руководствами

Стоимость GUID в качестве первичных ключей (Сервер SQL 2000)

Мифы, GUID vs.Автоматическое приращение (MySQL 5)

Это действительно то, чего вы хотите.

Плюсы UID

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

Минусы ГУИДа

  • Это в четыре раза больше, чем традиционное 4-байтовое значение индекса;это может иметь серьезные последствия для производительности и памяти, если вы не будете осторожны.
  • Громоздкая отладка (где userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • Сгенерированные идентификаторы GUID должны быть частично последовательными для лучшей производительности (например, newsequentialid() в SQL 2005) и для возможности использования кластеризованных индексов.

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

RDBM обычно обеспечивают уникальность первичных ключей и поиск по ключу в структуре под названием BTree, которая представляет собой дерево поиска с большим коэффициентом ветвления (двоичное дерево поиска имеет коэффициент ветвления 2).Теперь последовательный целочисленный идентификатор приведет к тому, что вставки будут происходить просто один сторону дерева, оставляя большую часть узлов листьев нетронутыми.Добавление случайных UUID приведет к тому, что вставки будут разделять конечные узлы по всему индексу.

Аналогично, если хранящиеся данные в основном временные, часто бывает так, что необходимо получить доступ к самым последним данным и объединить их с большинством.При использовании случайных UUID шаблоны от этого не выиграют и будут затрагивать больше строк индекса, поэтому потребуется больше страниц индекса в памяти.При использовании последовательных идентификаторов, если самые последние данные необходимы больше всего, страницам горячего индекса потребуется меньше оперативной памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top