2010-04-13 1 views
5

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

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

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

ответ

12

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

`Words_Categories` Table 
    `word_id` 
    `category_id` 

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

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

+0

Это всегда с множественным числом для таблицы со многими для многих? По крайней мере, это конвенция? – Thufir

4

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

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

+0

", обычно называемый таблицей ссылок или таблицей мостов", для добавления здесь терминологии. –

6

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

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

+4

+1 Для «То есть безумие!» ;) – FrustratedWithFormsDesigner