Структура БД покупки билетов

372
28 сентября 2017, 13:11

Дайте совет в проектировании системы бронирования-покупки билета на автобусы. Моя структура выглядит следующим образом:

  • Таблица flight хранится информация о рейсах.
  • buses - информация о автобусах и количеством мест в нем.
  • tickets - сам билет, в нем есть два внешних ключа на одну таблицу stations. stationStart_id - станция отправления пасажира, stationEnd_id - станция прибытия пасажира.

Меня интересуют такие моменты:

  1. как лучше хранить начальную и конечную станцию в самом рейсе(flight). Добавлять туда два внешних ключа на одну таблицу по анлогии с таблицей tickets ?
  2. Как формировать цены на билет между станциями.
  3. Хранения мест автобуса. Добавить возможность выбора номера места, при покупке билета.
Answer 1
  1. Как лучше хранить начальную и конечную станцию в самом рейсе(flight).

Лучше никак не хранить. По-хорошему, у вас должны быть следующие сущности:

  • STATION - станция (есть). Это справочник точек маршрутов.
  • FLIGHT - рейс (есть). Это абстрактый рейс как "вещь в себе".
  • FLIGHT_ROUTE - состав маршрута, то есть список станций, посещаемых автобусом. Он должен содержать FLIGHT_ID - ссылку на маршрут, STATION_ID - ссылка на станцию, ARRIVAL_TIME, DEPARTURE_TIME - время прибытия и отправления. Ну можно еще порядковый номер добавить, но это в принципе лишнее. Выбирая первую и последнюю по времени станцию для данного FLIGHT_ID, вы получите пункт отправления и назначения.
  • FLIGHT_RUN - конкретный выезд в рейс. К нему вы будете привязывать билеты, автобусы, плановую и фактическую дату/время отправления.
  • Еще нужно добавить FLIGHT_TICKET - фактически продаваемые билеты на конкретный рейс и дату. Там будет ссылка на рейс (FLIGHT_RUN) и на покупателя (CLIENT).
  • Еще возможет вариант, когда автобус идет из пункта А в пункт Б, а потом в пункт В. Один пассажир может купить билет от А до Б, а другой - от Б до В. Их можно посадить на одно место, и даже с замечаниями выше вы это не сделаете. Тут можно добавить пункты "от станции" и "до станции" в таблицу FLIGHT_TICKET.
  1. Как формировать цены на билет между станциями.

Как уже сказали в комментариях, это не задача программирования, это бизнес-задача. Но если это учебный проект и вопрос отдали на ваше усмотрение, можно взять часто используемый вариант разбивания на зоны. Делите станции по зонам, цена билета равна (некоторая фиксированная сумма) * (N зоны А - N зоны Б).

  1. Хранения мест автобуса. Добавить возможность выбора номера места, при покупке билета.

В принципе, ответил выше. Остается только добавить номер места в таблицу FLIGHT_TICKET.

  1. И еще вопрос, два внешних ключа на одну таблицу, хорошо или плохо?

Не важно. Хорошо - это когда все работает быстро, удобно и без косяков. Плохо - когда наоборот. Сколько вам нужно внешних ключей, чтобы заработало хорошо, столько и делайте.

И еще. У вас часть сущностей названа во множественном числе, а часть - в единственном. Выработайте какой-то один стиль и работайте в нем - проще будет запоминать.

READ ALSO
Ошибка при установке MySQL через консоль

Ошибка при установке MySQL через консоль

Использую команду для установки:

272
Цикл в node.js для записи в бд mysql

Цикл в node.js для записи в бд mysql

Добрый день! Имеется массив данныхНеобходимо каждый элемент поочередно записать в бд(mysql), естественно при запуске цикла столкнулся с асинхронностью...

275
Часовые пояса java

Часовые пояса java

Добрый день! Мне нужно сделать программу, которая по названию города определяет его часовой пояс, используя стандартные библиотеки javaМожет...

294
Как сортировать HashMap по значениям?

Как сортировать HashMap по значениям?

Как сортировать HashMap по значениям?

414