2012-02-29 5 views
0

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

  • Должен ли я оставить свой естественный ключ также в качестве первичного ключа? или это должно быть точно так же, как любая другая колонка?

большинства доступа к этой таблице поиска по естественному ключу

  • для выполнения времени, если естественный ключ быть удален или определен в качестве альтернативного ключа?
  • Я не хочу иметь 2 идентичных натуральных ключа, как это следует применять, используя естественный ключ как первичный ключ?
  • Что это значит, если я использую натуральный ключ в качестве первичного ключа, а также добавляю еще один суррогатный ключ и определяю его также как первичный ключ? Я попытался найти примеры, которые действительно могли бы найти хороший, ссылки и примеры действительно помогут.
+0

«Предполагая, что мой естественный ключ слишком велик» - возможно, ваши предположения неверны, поэтому, пожалуйста, дайте более подробную информацию. «может измениться в будущем» - стабильность - это свойство хорошего ключа; неизменность является идеальным, но не обязательным условием. Но ** может измениться? [YAGNI] (http://en.wikipedia.org/wiki/You_ain't_gonna_need_it). – onedaywhen

ответ

2

Мое предложение заключается в создании простого INT типа данных первичного ключа и сделать его AUTO_INCREMENT, если вы используете MySQL, IDENTITY, если вы используете MS SQL Server или SEQUENCE, если вы используете Oracle. Тип данных INT для первичного ключа очень хорош, если вам нужна производительность.

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

+0

Как сделать некоторый столбец для индексации? и как это повлияет на то, что у меня нет моего естественного ключа для дублирования? – shd

+0

Например, если вы используете MySQL, вы можете создать простой индекс: 'CREATE INDEX index_name ON имя_таблицы (имя_столбца)' –

+0

Я предлагаю, чтобы индекс на натуральном ключе был уникальным индексом, а не повторяющимся индексом. –

0

Лучший способ сделать это - использовать уникальный ключ базы данных (такой как AUTO_INCREMENT в MySQL и его братьев и сестер в других СУБД) и создать объединенный первичный ключ, состоящий из этого и вашего естественного ключа.

Позвольте мне объяснить, почему:

естественный ключ в качестве вторичного уникального ключа имеет большой недостаток, создавая очень плохой ключ локализации: Последовательные значения ключей, как правило, распространяется по всему диску, что делает очень неэффективное использование вашего ключевой кеш (независимо от того, как он реализован, концепция стоит). Клавиши Auto-Increment обычно почти идеально локализованы, то есть одна страница на диске, которая переводится в один поиск диска, скорее всего, будет содержать большую часть пространства ключей.

Соединив ключ «база данных-естественный» с ключом «приложение-естественный» (в этой последовательности!) До комбинированного первичного ключа, вы получите лучшее из обоих миров. Это особенно верно, если естественный ключ состоит из некоторого случайного фактора, такого как GUID.

+0

, когда я объединю их как в качестве первичного ключа, будет ли это гарантировать, что у меня нет дублирующего натурального ключа? , и что вы подразумеваете под этим порядком? – shd

+0

Противоположность - если вы соедините свой суррогатный ключ с вашим естественным ключом в качестве основного ключа, вы сможете иметь дубликаты естественного ключа, если суррогатные ключи имеют разные значения. Подход Мухаммеда намного лучше, если вы используете * уникальный * индекс для естественного ключа. –

+0

1.) Нет, это не будет, но ничто не мешает вам создать свой вторичный уникальный ключ на вашем естественном ключе 2.) Чтобы сохранить ключевую локальность, вам нужно создать ОСНОВНЫЙ КЛЮЧ (dbkey, naturalkey), а не UNIQUE KEY (naturalkey, dbkey) –