Я ломаю себе голову над тем, как смоделировать простую систему городов и дорог в базе данных и ORM (Doctrine, в моем случае).
В моей упрощенной системе каждая дорога соединяет ровно два города.
Я хотел бы, чтобы у каждого города было свойство «дороги», но я не могу понять, как моделировать обратную сторону, объект дороги. Я мог бы, вероятно, смоделировать это с помощью отношения «многие ко многим», но разве это не чушь, когда я знаю, что на дороге всегда будет ровно два города? Но если я использую два отношения «многие к одному» (города могут иметь много дорог), у меня также есть два свойства в городах (например, входящие и исходящие дороги).
Я не смог найти решение в поиске, поэтому сейчас спрашиваю здесь.
Если я не свяжу их, я не смогу перемещаться по городам с запросом «города-> дороги», или могу? А на уровне БД я должен удвоить все запросы с помощью (A или B)
Определите, какие запросы вам нужны. Бывший. сколько дорог на 1 город? select count(roadid) where city1 = 'Boston' or city2 = 'Boston' Если вы можете удовлетворить все ваши требования к запросу (а я думаю, что вы сможете с помощью того, что я предложил), то вы знаете, что модель соответствует вашим потребностям. Если вам нужно знать, из какого города проходит дорога, вы можете связать города с дорогами с такими названиями, как StartCity, EndCity.
как написано выше: ровно два города. Сейчас я моделирую это с помощью отношения «многие ко многим», потому что ваше решение может лучше работать с прямым SQL, но это решение лучше работает в Doctrine.

Как сказал Ник: «Таблица 1: города. Таблица 2: дороги. В таблице дорог у вас есть 2 FK, которые являются двумя конечными точками дороги. Не связывайте дороги с городами, сделайте это наоборот» .
В качестве альтернативы подумайте, как вы собираетесь к принуждать, чтобы на каждой дороге действительно были «города по обе стороны» ??? Внешние ключи от вашего типа m-n гарантируют, что это будет только город если это было предоставлено, а не то, что будет предоставлен один должен (не говоря уже о том, что должен быть предоставлен два).
ORM известны тем, что лишают пользователя значительной выразительной силы, которую SQL предлагает им (например, удачи в выполнении транзитивных замыканий над таблицей ROADS в ORM). Если вы в таком случае, это причина оставить путь ORM и перейти на SQL. Выберите подходящий инструмент для работы.
Если вы смотрите на то, как облегчить себе жизнь («это решение лучше работает в Doctrine»), то вы смотрите не с той точки зрения.
Таблица 1: города. Таблица 2: дороги. В таблице дорог у вас есть 2 FK, которые являются двумя конечными точками дороги. Не связывайте дороги с городами, сделайте наоборот.