Отношения многие ко многим в MySQL - PullRequest
5 голосов
/ 14 апреля 2010

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

`words` Table
    `word_id`
    `headword`
    `category_id`
`categories` Table
    `category_id`
    `category_name`

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

Ответы [ 3 ]

12 голосов
/ 14 апреля 2010

Обычно у вас есть отдельная таблица для обработки этих сопоставлений:

`Words_Categories` Table
    `word_id`
    `category_id`

Каждая пара в этой таблице Words_Categories представляет одно возможное отображение из любого слова в любую другую категорию.

Поле category_id в таблице Words становится ненужным в этой схеме, поскольку ни одна из этих таблиц не ссылается друг на друга напрямую.

6 голосов
/ 14 апреля 2010

Вы НЕ ДОЛЖНЫ создавать дополнительные столбцы, такие как category_2 и category_3. Так лежит безумие.

Вместо этого вы бы удалили столбец "category_id" из таблицы "words". Затем вы должны создать новую таблицу "category_words" со столбцами "category_id" и "word_id". Чтобы поместить слово в категорию, вставьте запись в эту таблицу. Чтобы поместить то же слово в другую категорию, вставьте в таблицу еще одну запись.

4 голосов
/ 14 апреля 2010

Вы бы удалили category_id из таблицы слов и получили бы таблицу word_category, содержащую word_id, category_id (обычно уникальный индекс или ограничение), которая обычно называется таблицей ссылок или таблицей мостов. Это типичная нормализованная структура для отношения «многие ко многим».

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

...