Что такое тип уникального идентификатора? - PullRequest
0 голосов
/ 15 января 2011

В SQL-сервере есть тип uniqueidentifier?Что это?Что оно делает?В чем разница между этим и использованием первичного ключа

Ответы [ 3 ]

4 голосов
/ 15 января 2011

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


UPDATE:

Как указал @tdammers в разделе комментариев, новые GUID не генерируются автоматически при вставке строк, но этого эффекта можно добиться, определив newid() в качестве значения по умолчанию для столбца.

2 голосов
/ 15 января 2011

A uniqueidentifier - это имя SQL Server для GUID (см. http://en.wikipedia.org/wiki/Globally_unique_identifier).). Основная идея заключается в том, что GUID достаточно велик и обладает достаточной энтропией, чтобы крайне маловероятно столкновение двух случайно сгенерированных GUID.Для дальнейшего уменьшения вероятности коллизий большинство генераторов GUID включают некоторое значение, которое однозначно идентифицирует хост в процессе хеширования, например MAC-адрес основного сетевого адаптера, и поддерживают счетчик на уровне компьютера, чтобы избежать коллизий между GUID, генерируемыми на одной машине.

В SQL Server uniqueidentifier - это просто другой тип данных, например int, varchar и т. Д., Но его характеристики делают его пригодным в качестве первичного ключа. Он намного больше типичногоавтоматическое увеличение целого числа, но это значительно упрощает репликацию и миграцию - данные из двух ранее не связанных баз данных не будут вызывать коллизии в первичных ключах, если вы используете GUID, поскольку каждый GUID (концептуально) является глобально уникальным.вы наверняка получите совпадения, потому что боЭта таблица когда-то начиналась с 1, и изменение значений первичного ключа означает, что вы также должны изменить любые значения внешнего ключа, ссылающиеся на эту запись.Это можно сделать, но это гораздо сложнее, чем просто использовать GUID.

1 голос
/ 15 января 2011

Как вы уже упоминали, и другие также указали - тип данных GUID / uniqueidentifier в SQL Server на первый взгляд кажется хорошим кандидатом на первичный ключ - позвольте мне предупредить вас о некоторых проблемах, которые возникают в будущем.позже вы можете пожалеть:

Вам нужно отделить первичный ключ , который является логической конструкцией - он уникально идентифицирует ваши строки, он должен быть уникальным и стабильным, а НЕ НЕДЕЙСТВИТЕЛЬНЫМ.GUID также хорошо работает для первичного ключа - поскольку он гарантированно будет уникальным.GUID в качестве первичного ключа является хорошим выбором, если вы используете репликацию SQL Server, поскольку в этом случае вам все равно нужен уникально идентифицирующий столбец GUID.

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

См.ее статьи об индексации здесь:

, а также см. Джимми Нильссона Стоимость GUID в качестве первичного ключа

GUID - это ужасно плохой выбор для ключа кластеризации, поскольку он широкий, абсолютно случайный и, следовательно, приводит к плохой фрагментации индексаи плохая производительность.Кроме того, строки ключей кластеризации также хранятся в каждой записи каждого некластеризованного (дополнительного) индекса, так что вы действительно хотите сохранить его небольшим - GUID равен 16 байтам, тогда как INT равен 4 байтам, ис несколькими некластеризованными индексами и несколькими миллионами строк это делает ОГРОМНОЕ различие.

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

...