Теория баз данных - взаимосвязь между двумя таблицами

StackOverflow https://stackoverflow.com/questions/2457703

Вопрос

У меня есть база данных с двумя таблицами - давайте назовем их 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>)

(Не нашел никаких точных ответов на этот вопрос, но следующие вопросы расширяют тему.)

Вопрос о дизайне таблицы "Много ко многим"
Дизайн отношений "Многие ко многим" - Дизайн таблицы пересечений

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top