Теория базы данных - связь между двумя таблицами - PullRequest
3 голосов
/ 16 марта 2010

У меня есть база данных с двумя таблицами - назовем их Foo и Bar. Каждый foo может быть связан с любым количеством баров, и каждый бар может быть связан с любым количеством foo. Я хочу, чтобы с помощью одного запроса можно было получить фусы, связанные с определенной строкой, и бары, связанные с определенной строкой.

Мой вопрос: как лучше записать эти отношения? Должен ли я иметь отдельную таблицу с записями каждого отношения (например, два столбца, foo и bar)? Должна ли таблица foo иметь столбец для списка баров, и наоборот? Есть ли другой вариант, который я пропускаю?

Ответы [ 2 ]

11 голосов
/ 16 марта 2010

Это называется отношением многих ко многим. «Стандартное» решение состоит в том, чтобы создать третью таблицу с первичным ключом от каждой таблицы в каждой строке, где есть связь.

Третья таблица называется соединительной таблицей. "Соединительный стол" из Википедии: http://en.wikipedia.org/wiki/Junction_table

Как пример:

Foo
UID
Col1
Col2

Bar
UID
Col1
Col2

Foo_Bar
UID
Foo_UID
Bar_UID

Итак, в приведенном выше тексте может быть много foos и много баров. Каждый foo, относящийся к бару, и каждый бар, относящийся к foo, будут существовать в таблице Foo_Bar. Чтобы получить все foos, которые относятся к данному столбцу, вы можете использовать следующий SQL:

select *
from foo
where uid in (
    select foo_uid
    from foo_bar
    where bar_uid=<some bar uid>)

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

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

1 голос
/ 16 марта 2010

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

...