Теория баз данных - взаимосвязь между двумя таблицами
-
20-09-2019 - |
Вопрос
У меня есть база данных с двумя таблицами - давайте назовем их Foo и Bar.Каждый foo может быть связан с любым количеством баров, и каждый бар может быть связан с любым количеством foo.Я хочу иметь возможность извлекать с помощью одного запроса foo, которые связаны с определенным баром, и bars, которые связаны с определенным foo.
Мой вопрос в том, каков наилучший способ записи этих отношений?Должен ли я иметь отдельную таблицу с записями о каждом отношении (напримердве колонки, foo и bar)?Должна ли в таблице foo быть колонка для списка баров, и наоборот?Есть ли еще один вариант, который я упускаю из виду?
Решение
Это называется отношением "многие ко многим"."Стандартное" решение заключается в создании третьей таблицы с первичным ключом из каждой таблицы в каждой строке, где существует связь.
Третья таблица называется таблицей соединений."Таблица соединений" из Википедии: http://en.wikipedia.org/wiki/Junction_table
В качестве примера:
Foo
UID
Col1
Col2
Bar
UID
Col1
Col2
Foo_Bar
UID
Foo_UID
Bar_UID
Итак, в приведенном выше примере может быть много foo и много баров.Каждый foo, который относится к bar, и каждый bar, который относится к foo, будут существовать в таблице Foo_Bar.Чтобы получить все foo, относящиеся к данному бару, вы могли бы использовать следующий SQL:
select *
from foo
where uid in (
select foo_uid
from foo_bar
where bar_uid=<some bar uid>)
(Не нашел никаких точных ответов на этот вопрос, но следующие вопросы расширяют тему.)
Вопрос о дизайне таблицы "Много ко многим"
Дизайн отношений "Многие ко многим" - Дизайн таблицы пересечений
Другие советы
Это действительно отношения "многие ко многим".В дополнение к ответу Майкла, я хотел бы предоставить следующее в качестве дополнительного ресурса.Я видел слишком много плохих реализаций баз данных, чтобы не поднимать этот вопрос (не только для вас, но и для других, кто может просмотреть это в будущем)