тип первичного ключа в базе данных сервера sql - PullRequest
2 голосов
/ 22 мая 2010

я вижу после установки таблиц членства asp.net, они используют тип данных "uniqueidentifier" для всех полей первичного ключа.

Я использовал тип данных "int" и увеличивал на единицуна вставках и объявлении столбца как IDENTITY.

Есть ли какие-то особые преимущества в использовании типа данных uniqueIdentifier по сравнению с моей текущей моделью использования int и автоматического увеличения на новых вставках?

Ответы [ 3 ]

2 голосов
/ 23 мая 2010

Я лично использую INT IDENTITY для большинства моих первичных ключей и ключей кластеризации. Я думаю, что весьма прискорбно, что Microsoft решила использовать Uniqueidentifier в своих таблицах членства ASP.NET - многие люди воспринимают эту базу данных как «шаблон» для других .....

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

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

Смотрите ее статьи по индексации здесь:

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

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

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

2 голосов
/ 22 мая 2010

uniqueidenfitier решает проблемы с репликацией.Две реплицированные версии таблицы могут вставлять строки с одинаковыми целочисленными значениями для ключа, но они не могут вставлять обе, используя один и тот же uniqueidentifier, при условии, что для столбца установлено значение newid.

1 голос
/ 22 мая 2010

Я использовал тип данных "int" и увеличивал единицу на вставках.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...