2012-07-03 8 views
2

У меня есть требование хранить список услуг для нескольких компьютеров. Я думал, что создам одну таблицу для хранения списка всех возможных таблиц, таблицы для всех возможных компьютеров, а затем таблицы для привязки службы к компьютеру.Использование хеша в качестве первичного ключа?

Я думал, чтобы список полного сервиса был уникальным, я мог бы использовать хэш исполняемого файла в качестве первичного ключа для службы, но я не уверен, будут ли какие-либо недостатки (см. хеширование - только для идентификации. Не для каких-либо целей безопасности). Я думал, а не использовал двоичное поле в качестве основного/внешнего ключа, чтобы сохранить значение в качестве базового 64-кодированного sha512 и использовать nvarchar(88). Нечто похожее на это:

CREATE TABLE Services 
(
    ServiceHash nvarchar(88) NOT NULL, 
    ServiceName nvarchar(256) NOT NULL, 
    ServiceDescription nvarchar(256), 
    PRIMARY KEY (ServiceHash) 
) 

Есть ли неотъемлемые проблемы с этим решением? (Я буду использовать базу данных SQL 2008 и обычно получаю ее через C# .Net).

+2

Хеши не гарантированно уникальны. Просто используйте GUID – Chris

+0

'Nvarchar (88)' - это потенциально очень широкий (и переменной длины) ключ; если вы используете это как свой ключ кластеризации в этой таблице (по умолчанию это PK), вы не будете очень довольны производительностью этой таблицы! –

+0

@marc_s становится лучше. Поскольку theat является кодированным в base64 номером в хэше, N-часть varchar никогда не используется по определению, поэтому вы вдвое хранилище полностью бесполезны. Хороший момент, я забыл об этом. – TomTom

ответ

4

Проблема в том, что хеш для определения НЕ УНИКАЛЬНЫЙ. Вряд ли вы столкнетесь, но это возможно. В результате вы не можете использовать хэш только, что означает, что весь хэш-идентификатор является тупиком.

Используйте обычное поле идентификатора, используйте уникальное ограничение с индексом в ServiceName.

0

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

Я рекомендую либо:

  1. Используйте INT или BIGINT суррогатной PK, с автоматическим приращением.
  2. Используйте sequential GUID в качестве ПК. Не так быстро для индексации, как INT, но инкрементный, поэтому низкая фрагментация во времени.

Затем вы можете играть с некластеризованными индексами в других столбцах, в том числе с сохранением хэшей. Будучи VARCHAR, вы можете также полнотекстовым индексом, а затем выполнить точное сопоставление при поиске определенного хеша.

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

И, конечно, рассмотрите, что @TomTom, упомянутое ниже.

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