2009-05-06 5 views
26

Можно создать дубликат:
How do you like your primary keys?GUID против INT IDENTITY

Я знаю о преимуществах использования GUID, а также преимущества использования и INT в качестве ПК в базы данных. Учитывая, что GUID по существу является 128-битным INT, а нормальный INT - 32 бит, INT - это экономия пространства (хотя этот момент в большинстве современных систем вообще спорен).

В конце концов, в каких обстоятельствах вы увидите, что используете INT как ПК против GUID?

+1

Обратите внимание: этот вопрос задан в 2009 году. См. Http://softwareengineering.stackexchange.com/a/337560/156440 и http://stackoverflow.com/questions/11938044/what-are-the-best- практики для использования-a-guid-as-a-primary-key-specific-rega для получения более актуальных ответов, включая ссылки на обновленные рекомендации от Kimberley Tripp. – HockeyJ

ответ

18

Kimberley Tripp (SQLSkills.com) имеет an article при использовании GUID в качестве первичных ключей. Она советует против этого из-за ненужных накладных расходов.

+0

Все еще не читал [эта серия] (http://sqlblogcasts.com/blogs/tonyrogerson/archive/2011/07.aspx), но я думаю, что Тони Роджерсон утверждает, что с SSD значительно сокращается проблема фрагментации. –

1

INT, безусловно, гораздо легче читать при отладке и намного меньше.

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

7

При сравнении значений, таких как отношение первичного к внешнему ключу, INT будет быстрее. Если таблицы проиндексированы правильно, а таблицы небольшие, вы можете не заметить большую часть замедления, но вам придется попробовать это, чтобы быть уверенным. INT также легче читать и общаться с другими людьми. Гораздо проще сказать: «Можете ли вы посмотреть на запись 1234?» вместо «Можете ли вы посмотреть на запись 031E9502-E283-4F87-9049-CE0E5C76B658?»

+0

Вы можете всегда используйте hashids для смягчения этой проблемы. http://hashids.org/ – Korayem

3

Некоторые ОС не генерируют GUID больше на основе уникальных аппаратных функций (CPUID, MAC), поскольку они упрощают задачу отслеживания пользователей (проблемы конфиденциальности). Это означает, что уникальность GUID часто уже не столь универсальна, как многие думают.

Если вы используете некоторую функцию auto-id вашей базы данных, база данных может теоретически убедиться, что дублирования нет.

+0

GUID в наши дни обычно генерируются случайным образом. –

+0

@Marco. Можете ли вы предоставить некоторую ссылку на документацию, которая поддерживает это? Я никогда не слышал об этом. –

+0

Это уже давние новости. См. Среди прочего просто википедию http://en.wikipedia.org/wiki/Globally_unique_identifier, в первую очередь раздел алгоритма –

2

Я всегда думаю, что ПК должно быть числовым, где можно. Не забывайте, что GUID в качестве PK, вероятно, означают, что они также используются в других таблицах как foriegn-ключи, поэтому пейджинг и индекс и т. Д. Будут больше.

+0

Что делать, если натуральный ключ записи не является числовым; например (host, timestamp) для записи журнала сообщений или (product_code) для записи продукта? Вы настаивали бы на добавлении числового поля, не имеющего никакой цели, кроме наличия избыточного ключа? – bignose

+0

Нет, я бы этого не сделал, но для поля timestamp вы можете рассмотреть возможность добавления поля Identity в таблицу и использовать его как ключ вместо метки времени. Поскольку они оба генерируются БД. Если это код продукта, я всегда буду использовать его для идентификатора, поскольку это зависит от продукта, основанного на вашем бизнесе, поэтому не имеет смысла изменять его на идентификатор. Все зависит от типа данных, которые вы будете хранить, и того, как вы планируете создавать свою базу данных. – kevchadders

1

Я думаю, что база данных также имеет значение. С точки зрения MySQL - как правило, чем меньше тип данных, тем быстрее производительность.

кажется, справедливо и для межд против GUID тоже - http://kccoder.com/mysql/uuid-vs-int-insert-performance/

1

Я хотел бы использовать GUID в качестве PK только если этот ключ пределы аналогичного значения. Например, идентификатор пользователя (пользователи в WinNT описываются с GUID) или идентификатор группы пользователей. Еще один пример. Если вы разрабатываете распределенную систему для управления документами и разные части системы в разных местах по всему миру, можете создать некоторые документы. В таком случае я бы использовал GUID, потому что он гарантирует, что у двух документов, созданных в разных частях распределенной системы, не будет одинакового идентификатора.

12

Чтобы ответить на ваш вопрос: В конце концов, в каких обстоятельствах вы увидите, что используете INT как ПК против GUID?

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

2

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

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

11

ИНТ пространство заставки (хотя это точка, как правило, спорным в большинстве современных систем).

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

Кроме того, помните, что современные процессоры очень, очень быстрые, но скорости RAM не поддерживаются. Поэтому поведение кэша становится все более важным. И лучший способ получить хорошее поведение кэша - иметь меньшие наборы данных. Таким образом, кажущаяся несоответствующая разница между 4 и 16 байтами вполне может привести к заметной разнице в скорости. Не обязательно всегда, но это то, что нужно учитывать.

2

Если вы планируете слияние базы данных на каком-то этапе, то есть для настройки типа множественной репликации на нескольких сайтах, Guid's сэкономит много боли. Но кроме этого я считаю, что Int легче.

14

Помимо небольшого выбора, когда вам нужно синхронизировать несколько экземпляров базы данных, INT имеет один недостаток, о котором я не упоминал: вставки всегда встречаются на одном конце дерева индексов. Это увеличивает конфликт блокировок, когда у вас есть таблица с большим количеством движения (поскольку одни и те же страницы индекса должны быть изменены с помощью параллельных вставок, тогда как GUID будет вставлен по всему индексу). Индекс также может быть перебалансирован чаще, если используется дерево B * или аналогичная структура данных.

Разумеется, при выполнении ручных запросов и построении отчетов, на самом деле, интуитивно понятны, а потребление пространства может складываться через использование FK.

Мне было бы интересно увидеть любые измерения того, насколько хорошо, например. SQL Server фактически обрабатывает вставные таблицы с идентификационными номерами.

8

У нас есть Гиды в нашем очень сложном программном обеспечении для предприятий во всем мире. Работает гладко.

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

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

+1

Что можно сказать о кластеризации направляющих в вашем корпоративном программном обеспечении? – Koste

Смежные вопросы