Лучший дизайн БД для отношений «один ко многим ко многим»? - PullRequest
1 голос
/ 02 ноября 2011

В настоящее время я сталкиваюсь с проблемой и задаюсь вопросом, существует ли лучшее решение для этого случая.Изначально у меня есть три объекта, A, B и X. Их отношения таковы:

  • AB: 1-ко-многим
  • AX: 1-ко-многим
  • BX: 1-ко-многим

Например, одна строка в A может ассоциироваться со многими строками как в B, так и в X. Кроме того, одна строка в B может иметь много других связанных строкв X.

Некоторые из рассмотренных мною вариантов:

  1. Дубликат X

    Итак, у нас есть AB, A-X1 и B-X2в котором X1 и X2 идентичны, просто другое имя таблицы.

  2. Использовать полиморфную ассоциацию

    X теперь имеет два столбца parent и parent_id , указывающий, с какой таблицей, A или B, связана строка.

  3. Реверс полиморфной ассоциации

    Созданы две дополнительные таблицы, AX и BX,Связь проста.

    A - AX - X - BX - B

  4. Используйте дополнительный внешний ключ для X.

    X теперь имеет два столбца: A_id и B_id .Если строка связана с A, то B_id равно нулю.Если строка связана с B, то A_id = A.id и B_id = B.id.

Конечно, все они имеюткомпромиссные.Интересно, есть ли лучшие решения для этой проблемы.Пожалуйста, предложите любого, кого вы знаете.

Спасибо!

1 Ответ

1 голос
/ 02 ноября 2011

Я думаю, что # 3 - ваш лучший вариант.Общий термин моделирования дБ для такого рода отношений - Соединительные таблицы .Это очень чистый способ создания отношений «многие ко многим» между таблицами.И как вы сказали:

Соотношение простое.

С таблицами соединений вам не нужно использовать дубликаты (# 1) или создавать флаги, указывающие, какую таблицусвяжите его с (# 2), и # 4 выглядит немного по-другому # 2.

Многие моделировщики БД будут щетиниться на дополнительных соединениях, но пока ваши индексы установлены правильно, модель будет работать.А если вам надоест писать записи, создайте несколько представлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...