2013-11-01 5 views
2

Я создаю простую таблицу с именем Photo для хранения фотографий для людей/групп, определенных в таблице User. Я использую функцию Microsoft SQL Server FILESTREAM, так как все остальные пользовательские данные уже хранятся в SQL Server, и для меня это имеет большее значение, чем программирование отдельного способа вручную извлекать объекты с диска, когда они напрямую связаны с записями в базы данных.Использование SQL Server FILESTREAM GUID в качестве первичного ключа

У каждого пользователя может быть только одна связанная с ними фотография (на данный момент это может измениться в будущем), а FILESTREAM требует, чтобы столбец GUID ссылался на файлы, хранящиеся на диске, так что это модель Я придумал для Photo:

UserID int NOT NULL UNIQUE 
PhotoID uniqueidentifier ROWGUIDCOL NOT NULL 
PhotoBitmap varbinary(MAX) FILESTREAM NULL 

Мой вопрос (если эта модель верна для моего приложения), я должен использовать PhotoID в качестве первичного ключа, видя, как это уже уникален и необходим? Мне кажется, что это было бы проще, чем создание отдельного столбца INT только для первичного ключа, но я не знаю, является ли он «правильным».

ответ

3

Я лично использую INT IDENTITY для большинства моих основных и кластеризационных ключей.

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

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

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

, а также увидеть Джимми Нильссон The Cost of GUIDs as Primary Key

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

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

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