Нужны ли таблицы ссылок бессмысленное поле первичного ключа? - PullRequest
24 голосов
/ 04 декабря 2009

Я работаю над парой таблиц ссылок, и я подумал (Danger Will Robinson, Danger), каковы возможные структуры таблицы ссылок и каковы их плюсы и минусы.

Я придумал несколько возможных ограничений для таблицы ссылок:

Традиционная модель с тремя колоннами

  • id - ПЕРВИЧНЫЙ ПЕРВИЧНЫЙ НОМЕР
  • table1fk - внешний ключ
  • table2fk - внешний ключ

Это классика, в большинстве книг, - сказал Нуфф.

Индексированная модель с 3 столбцами

  • id - ПЕРВИЧНЫЙ ПЕРВИЧНЫЙ НОМЕР
  • table1fk - внешний ключ INDEX ('table1fk')
  • table2fk - внешний ключ INDEX ('table2fk')

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

Композитный ключ 2 столбца ADD PRIMARY KEY ('table1fk' , 'table2fk')

  • table1fk - внешний ключ
  • table2fk - внешний ключ

При этом я использую составной ключ, чтобы запись из таблицы1 могла быть связана только с записью в таблице2 один раз. Поскольку ключ является составным, я могу добавлять записи (1,1), (1,2), (2,2) без ошибок дублирования.

Есть ли потенциальные проблемы с опцией составного ключа 2 столбца? Есть ли проблема с индексированием, которая может вызвать это? Хит производительности? Что-нибудь, что могло бы исключить это как возможный вариант?

Ответы [ 12 ]

0 голосов
/ 04 декабря 2009

Если вы используете ORM для получения / изменения данных, для некоторых из них требуется первичный ключ из одного столбца (спасибо Тому Х за указание на это) для правильной работы (я считаю, что Subsonic 2.x был таким образом, не уверен насчет 3.x).

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

0 голосов
/ 04 декабря 2009

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

Я согласен, что не индексировать внешние ключи - это плохая идея, куда бы вы ни пошли.

...