2009-12-03 3 views
5

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

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

ответ

9

Это зависит.

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

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

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

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

+0

+1 Обложка всех оснований. – APC

1

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

2

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

Эта третья колонка, которая просто добавит больше места в ваш стол.

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

2

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

5

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

+0

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

0

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