Прошу помощи в определении правильной структуры хранения записей в MySQL

Имеется единая форма, некоторые части формы отключаемые, в зависимости от надобности.

Схему в более качественном размере/масштабе можно увидеть по ссылке

Основная проблема в том что, поездка может быть как в аэропорт, так и из аэропорта. А так же поездка может быть типа точка-точка, то есть из определенного места до определенного места. Может быть например одна остановка по пути следования, но не более одной.

Мне не понятно как организовать связи между таблицами. Как должен хранится маршрут поездки, в одной таблице или же в разных таблицах.

Единственное что мне понятно, есть несколько справочных таблиц, они обозначены на схеме, а так же понятно что есть точки (адреса/location).

Есть так же мысль добавить в таблицу location метку типа точки, начальная, конечная, промежуточная.

P.S. Схему начертил как смог, прошу не кидать помидорами.

введите сюда описание изображения


Ответы (1 шт):

Автор решения: RomanMitasov

Я так понимаю, итогом работы формы должен быть сохранённая в БД запись о заказе, плюс информация о маршруте.

В таком случае я предлагаю следующую базу данных для такого:

  1. Таблица order (заказ, поездка, это основной домен):

    • id - INT или UUID - суррогатный ключ, идентификатор заказа
    • route_id - INT или UUID - ссылка на маршрут
    • auto_id - INT или UUID - ссылка на авто из справочника
    • ... ещё какие-нибудь поля из вашей формы
  2. Таблица address - таблица с информацией о ваших адресах, в неё можно сохранять введённые пользователями адреса

    • id - INT или UUID - тоже суррогатный айди
    • city
    • zip
    • и так далее
  3. Таблица point - таблица с точками маршрута

    • order_id - ссылка на таблицу order
    • address_id - ссылка на таблицу address
    • position - INT - порядковый номер точки на маршруте, типа 1, 2, 3 - 1 это точка отправления, 3 это точка прибытия, 2 это промежуточная

Связи между таблицами:

Один заказ - много точек Один адрес - много точек

order <- point -> address

Таблицу address я выделил в отдельную, потому что скорее всего в будущем заказчик захочет выводить подсказки по адресам на форме. Данные адресов можно также скачать, например использовать официальную базу адресов КЛАДР или ту что новее, не помню её названия.

Поле формы "аэропорт" вы можете также брать из справочника, в котором будут значения "airport_name, address_id", связывающий аэропорт из формы с реальным адресом для создания из этого адреса запись в point.

Если же вы не хотиите, чтобы аэропорт был частью маршрута, можно добавить в таблицу order два поля:

airport_id - ссылка на справочник аэропортов direction - направление следования, например 1 или 0 для "в аэропорт" или "из аэропорта", можно создать справочник direction в котором будут записи с описанием направления, и тогда уже сделать поле order.direction_id со ссылкой на справочник.

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

→ Ссылка