Преимущества и недостатки ключей базы данных GUID / UUID
в прошлом я работал над несколькими системами баз данных, где перемещение записей между базами данных было бы намного проще, если бы все ключи базы данных были GUID / UUID значения. Я рассматривал возможность пойти по этому пути несколько раз, но всегда есть некоторая неопределенность, особенно вокруг производительности и нечитаемых по телефону URL-адресов.
кто-нибудь работал с GUID в базе данных? Какие преимущества я получу, идя этим путем, и каковы вероятные подводные камни?
8 ответов:
плюсы:
- может генерировать их в автономном режиме.
- делает репликацию тривиальной (в отличие от int, что делает ее очень сложной)
- ОРМ обычно как они
- уникальный во всех приложениях. Таким образом, мы можем использовать ПК из нашей CMS (guid) в нашем приложении (также guid) и знать, что мы никогда не получим столкновение.
недостатки:
- большая польза космоса, но космос дешев (Эр)
- не могу заказать по ID, чтобы получить заказ на вставку.
- может выглядеть некрасиво в URL, но на самом деле, WTF вы делаете положить реальный ключ БД в URL!?
- труднее сделать ручную отладку, но не так сложно.
лично я использую их для большинства ПК в любой системе приличного размера, но я получил "обучение" на системе, которая была реплицирована повсюду, поэтому мы должны были их иметь. МММ.
Я думаю, что дубликаты данных-это мусор - вы можете получить дубликаты данных, однако ты сделаешь это. Суррогатные ключи обычно хмурятся там, где я когда-либо работал. Мы используем WordPress-подобную систему, хотя:
- уникальный идентификатор для строки (GUID / whatever). Никогда не отображается для пользователя.
- public ID генерируется один раз из некоторого поля (например, название - сделать его-название-статьи)
обновление: Так что это один получает +1 большое объед, и я думал, что я должен отметить большой минус это идентификатор ПК: кластерный Индексы.
Если у вас много записей и кластеризованный индекс на GUID, ваша производительность вставки будет сосать, так как вы получаете вставки в случайных местах в списке элементов (это точка), а не в конце (что быстро)
поэтому, если вам нужна производительность вставки, возможно, используйте auto-inc INT и создайте GUID, если вы хотите поделиться им с кем-то другим (т. е. показать его пользователю в URL)
@Matt Sheppard:
скажем, у вас есть таблица клиентов. Конечно, вы не хотите, чтобы клиент существовал в таблице более одного раза, или много путаницы произойдет во всех ваших отделах продаж и логистики (особенно если несколько строк о клиенте содержат различную информацию).
таким образом, у вас есть идентификатор клиента, который однозначно идентифицирует клиента, и вы убедитесь, что идентификатор известен клиенту (в счетах-фактурах), так что клиент и люди обслуживания клиентов имеют общую ссылку в случае, если им нужно общаться. Чтобы гарантировать отсутствие повторяющихся записей клиентов, вы добавляете ограничение уникальности в таблицу либо через первичный ключ идентификатора клиента, либо через ограничение NOT NULL + UNIQUE в столбце идентификатора клиента.
далее, по какой-то причине (о которой я не могу думать), вам предлагается добавить столбец GUID в таблицу customer и сделать его первичным ключом. Если идентификатор клиента столбец теперь остается без гарантии уникальности, вы просите о будущих проблемах во всей организации, потому что GUID всегда будут уникальными.
какой-то" архитектор "может сказать вам, что" о, но мы справляемся с реальные ограничение уникальности клиента в нашем приложении уровня!". Право. Мода на то, что языки программирования общего назначения и (особенно) фреймворки среднего уровня все время меняются, и, как правило, никогда не будет жить в вашей базе данных. И есть очень велика вероятность того, что вам в какой-то момент понадобится получить доступ к базе данных, не проходя через настоящее приложение. == Тревога. (Но, к счастью, вы и "архитектор" давно ушли, так что вы не будете там, чтобы очистить беспорядок.) Другими словами: поддерживайте очевидные ограничения в базе данных (и на других уровнях, а также, если у вас есть время).
другими словами: могут быть веские причины для добавления столбцов GUID в таблицы, но, пожалуйста, не поддавайтесь искушению сделать это понизьте свои амбиции на согласованность внутри реальные (==не GUID) информация.
основные преимущества заключаются в том, что вы можете создавать уникальные идентификаторы без подключения к базе данных. И id являются глобально уникальными, так что вы можете легко объединить данные из разных баз данных. Они кажутся небольшими преимуществами, но в прошлом спасли мне много работы.
основные недостатки - это немного больше памяти (не проблема в современных системах), и идентификаторы на самом деле не читаются человеком. Это может быть проблемой при отладке.
есть какая-то производительность такие проблемы, как фрагментация индекса. Но они легко разрешимы (comb guids by jimmy nillson:http://www.informit.com/articles/article.aspx?p=25862)
Edit объединил два моих ответа на этот вопрос
@Matt Sheppard я думаю, что он имеет в виду, что вы можете дублировать строки с разными идентификаторами GUID в качестве первичных ключей. Это проблема с любым видом суррогатного ключа, а не только GUID. И, как он сказал, это легко решить, добавив осмысленный уникальный ограничения для неключевых столбцов. Альтернативой является использование естественного ключа, и у них есть реальные проблемы..
идентификаторы GUID могут вызвать у вас много проблем в будущем, если они используются в качестве "uniqifiers", позволяя дублированным данным попасть в ваши таблицы. Если вы хотите использовать GUID, пожалуйста, рассмотрите возможность сохранения уникальных ограничений для других столбцов.
Почему никто не упоминает производительность? Когда у вас есть несколько соединений, все на основе этих неприятных GUID производительность будет проходить через пол, был там : (
еще одна небольшая проблема, которую следует рассмотреть с использованием GUID в качестве первичных ключей, если вы также используете этот столбец в качестве кластеризованного индекса (относительно распространенная практика). Вы собираетесь взять удар по insert из-за природы guid не начинайте последовательный в любом случае, таким образом, их будут разбивать страницы и т. д. при вставке. Просто что-то рассмотреть, если система будет иметь высокий IO...
основная-ключи-идентификаторы и идентификаторы GUID
стоимость GUID в качестве первичных ключей (SQL Server 2000)
мифы, GUID против Autoincrement (MySQL 5)
Это действительно то, что вы хотите.
UID Pros
- уникальный для каждой таблицы, каждой базы данных, каждого сервера
- позволяет легко объединять записи из разных баз данных
- позволяет легко распределение баз данных по нескольким серверам
- вы можете генерировать идентификаторы в любом месте, вместо того, чтобы туда и обратно в базу данных
- большинство сценариев требуют репликация столбцов идентификаторов GUID в любом случае
GUID минусы
- это колоссальные 4 раза больше, чем традиционное значение индекса 4 байта; это может иметь серьезные последствия для производительности и хранения, Если вы не будете осторожны
- громоздкий для отладки (где userid= ' {BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
- созданные GUID должны быть частично последовательными для лучшей производительности (например, newsequentialid () на SQL 2005) и для включения использования кластеризованных индексов
есть одна вещь, которая на самом деле не решены, а именно с помощью random (UUIDv4) идентификаторы в качестве первичных ключей повредит производительности индекс первичного ключа. Это произойдет независимо от того, сгруппирована ли ваша таблица вокруг ключа.
СУБД обычно обеспечивают уникальность первичных ключей и обеспечивают поиск по ключу в структуре под названием BTree, которая является деревом поиска с большим коэффициентом ветвления (двоичное дерево поиска имеет коэффициент ветвления 2). Теперь последовательный целочисленный идентификатор приведет к тому, что вставки будут происходить только один сторона дерева, оставляя большинство листовых узлов нетронутыми. Добавление случайных UUID приведет к тому, что вставки разделят конечные узлы по всему индексу.
аналогично, если данные, хранящиеся в основном временные, часто бывает так, что самые последние данные должны быть доступны и объединил самых. Со случайными UUIDs шаблоны не выиграют от этого, и попадут больше строк индекса, тем самым требуется больше страниц индекса в памяти. С последовательными идентификаторами, если самые последние данные необходимы больше всего, горячие страницы индекса потребуют меньше ОЗУ.
Comments