База данных / ORM моделирование дорог между городами

Я ломаю себе голову над тем, как смоделировать простую систему городов и дорог в базе данных и ORM (Doctrine, в моем случае).

В моей упрощенной системе каждая дорога соединяет ровно два города.

Я хотел бы, чтобы у каждого города было свойство «дороги», но я не могу понять, как моделировать обратную сторону, объект дороги. Я мог бы, вероятно, смоделировать это с помощью отношения «многие ко многим», но разве это не чушь, когда я знаю, что на дороге всегда будет ровно два города? Но если я использую два отношения «многие к одному» (города могут иметь много дорог), у меня также есть два свойства в городах (например, входящие и исходящие дороги).

Я не смог найти решение в поиске, поэтому сейчас спрашиваю здесь.

Таблица 1: города. Таблица 2: дороги. В таблице дорог у вас есть 2 FK, которые являются двумя конечными точками дороги. Не связывайте дороги с городами, сделайте наоборот.

Nic3500 16.06.2018 04:47

Если я не свяжу их, я не смогу перемещаться по городам с запросом «города-> дороги», или могу? А на уровне БД я должен удвоить все запросы с помощью (A или B)

Tom 16.06.2018 06:46

Определите, какие запросы вам нужны. Бывший. сколько дорог на 1 город? select count(roadid) where city1 = 'Boston' or city2 = 'Boston' Если вы можете удовлетворить все ваши требования к запросу (а я думаю, что вы сможете с помощью того, что я предложил), то вы знаете, что модель соответствует вашим потребностям. Если вам нужно знать, из какого города проходит дорога, вы можете связать города с дорогами с такими названиями, как StartCity, EndCity.

Nic3500 17.06.2018 00:36

как написано выше: ровно два города. Сейчас я моделирую это с помощью отношения «многие ко многим», потому что ваше решение может лучше работать с прямым SQL, но это решение лучше работает в Doctrine.

Tom 17.06.2018 08:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
4
30
1

Ответы 1

Как сказал Ник: «Таблица 1: города. Таблица 2: дороги. В таблице дорог у вас есть 2 FK, которые являются двумя конечными точками дороги. Не связывайте дороги с городами, сделайте это наоборот» .

В качестве альтернативы подумайте, как вы собираетесь к принуждать, чтобы на каждой дороге действительно были «города по обе стороны» ??? Внешние ключи от вашего типа m-n гарантируют, что это будет только город если это было предоставлено, а не то, что будет предоставлен один должен (не говоря уже о том, что должен быть предоставлен два).

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

Если вы смотрите на то, как облегчить себе жизнь («это решение лучше работает в Doctrine»), то вы смотрите не с той точки зрения.

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