Должен ли я использовать столбец индекса в таблице ссылок "многие ко многим"?

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

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


person Matteo Riva    schedule 03.12.2009    source источник


Ответы (6)


Это зависит.

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

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

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

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

person Tomek Szpakowicz    schedule 03.12.2009
comment
Я чувствую, что многие люди столкнутся с вашим последним сценарием, и им следует подумать о потенциально бесполезном идентификаторе с самого начала. - person Kevin Danikowski; 18.09.2019

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

person Thomas Padron-McCarthy    schedule 03.12.2009
comment
Не используйте функцию автонумерации для наложения строк в естественном хронологическом порядке. Разработчики автонумерации могут реализовать алгоритм, который нарушает эту корреляцию. - person Walter Mitty; 13.07.2013

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

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

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

person Kico Lobo    schedule 03.12.2009

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

person Randy Minder    schedule 03.12.2009

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

person Adriaan Stander    schedule 03.12.2009

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

person SergeyKazachenko    schedule 10.12.2009