Должен ли я использовать индексный столбец в таблице «многие» ссылки? - PullRequest
5 голосов
/ 03 декабря 2009

У меня есть две таблицы, products и categories, которые имеют отношение многие ко многим, поэтому я добавляю таблицу products_categories, которая будет содержать category_id и product_id.

Стоит ли добавить еще один (автоинкрементный) индексный столбец или использовать два существующих в качестве первичного ключа?

Ответы [ 6 ]

10 голосов
/ 03 декабря 2009

Это зависит.

  • Видите ли вы ваши данные больше как набор объектов (а реляционная база данных просто носитель информации) или как совокупность фактов, представленных и проанализированных изначально по реляционной алгебре.

  • Некоторые ORM / Frameworks / Tools не имеют хорошей поддержки многоколоночных первичных ключей. Если вы используете один из них, вам понадобится дополнительный столбец идентификатора.

  • Если это просто отношение «многие ко многим» без дополнительных данных, связанных с ним, лучше избегать дополнительного столбца id и иметь оба столбца в качестве первичного ключа.

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

5 голосов
/ 03 декабря 2009

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

3 голосов
/ 03 декабря 2009

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

В этом третьем столбце будет просто больше места на вашей таблице.

Но ... Вы можете использовать это, возможно, чтобы увидеть порядок, в котором ваши записи были добавлены в вашу таблицу. Это единственная функция, которую я вижу в этом столбце.

2 голосов
/ 03 декабря 2009

Вам не нужно добавлять автоинкрементный столбец индекса. Стандартная практика - использовать только два существующих столбца в качестве первичного ключа для таблиц ассоциации M: M, как вы описали.

1 голос
/ 03 декабря 2009

Я бы сделал первичный ключ category_id и product_id. Добавляйте автоинкремент только в том случае, если ордер будет восстановлен при последующих использованиях.

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

Есть концептуальный вопрос - является ли products_categories сущностью или просто таблицей, которая представляет отношения между двумя сущностями? Если это сущность, то даже если нет никаких дополнительных атрибутов, я бы рекомендовал отдельный столбец идентификатора для сущности. Если это связь, если есть дополнительные атрибуты (скажем, begin_date, end_date или что-то в этом роде), я бы рекомендовал иметь первичный ключ из нескольких столбцов.

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