Как грамотно спроектировать структуру базы данных?
Использую MS SQL 2014
Есть тема - Продажа ж/д билетов
Продажа билетов производится таким образом. Клиент запрашивает наличие билетов на конкретную дату и направление, от начальной до конечной станции, дополнительно указывая желаемый тип вагона (купе, плацкарт и так далее). Кассир производит поиск в базе по указанным атрибутам и сообщает клиенту возможные варианты, которые блокируются до окончания операции. Клиент выбирает из возможных вариантов билет, после чего кассир вносит данные в базу и получает деньги за билет.
Данные, введенные кассиром, попадают в базу данных в центральном аппарате, который делает невозможным продажу одного и того же билеты разным пассажирам.
В случае сдачи билета кассир возвращает клиенту деньги (с вычислением некоторой суммы), и забирает оформленный билет, после чего отмечает данный билет как незанятый.
Вопрос состоит в том, что предполагается, что каждому поезду (в таблице поездов) соответсвует маршрут. Если запрошенное клиентом направление (начальная и конечная станция) находятся в маршруте определенного поезда, но не являются первой и последней станцией этого маршрута, этот поезд все равно должен быть предложен клиенту и надо учитывать, что в маршруте другого поезда могут так же быть эти же станции, но поезд идет наоборот от конечной к начальной запрошенной клиентом, в таком случае, этот поезд не должен быть предложен. Кроме того, необходимо просчитывать стоимость билета, в зависимости от количество станций, которые клиент проезжает.
Подскажите, пожалуйста, как правильно записывать разные маршруты для поездов и как считать сумму.
ну в лоб все выглядит несложно - для каждого поезда храните маршрут (как минимум из узловых точек), поиск поезда будет заключаться в выборке всех поездов, у которых старт ранее или равен и финиш далее или равен заказанному маршруту. Я же правильно понимаю, что поезд "туда" и "обратно" - это 2 разных поезда? и разные маршруты ( хотя и зеркальные)?
точки маршрута между узловыми можно хранить отдельно и джойнить на ходу
стоимость билета - как вариант это сумма стоимостей за каждый из "перегонов". хотя вроде бы шкала обычно не линейная.
Логически я это понимаю, я просто не очень понимаю, как мне это физически организовать. То есть у каждого поезда атрибут - маршрут, что это такое? Мне ведь нужно для одного поезда хранить какое-то количество названий станций, для каждого поезда оно разное и станции разные. Массив вроде нельзя в MS Sql, или я ошибаюсь?
zrazhevska: многие-к-многим традиционно через промежуточную таблицу ("остановки"), где id_поезда, id_станции. тогда ее джойним с поездами и станциями - получаем маршрут поезда.
строишь граф с аналитиками: станция , станция с которой можно попасть на эту(родительская), стоимость проезда от родительской , номер поезда, и аналитика кон/не кон....и просто рекурсивно джойнишься ..сумируешь стоимость и получаешь путь +стоимость