Как организовать структуру БД?

Есть таблицы "Клиенты", и "Автомобили". Тариф проката авто зависит от количества предыдущих заказов и их длительности. Больше накатал - меньше цена тарифа. Нужна подробная история каждого клиента по предыдущих заказах, тоесть нужно знать когда, какой автомобиль и сколько времени "катался" клиент. Использую базы Postresql. Очень важна производительность и наименьшее время исполнения запроса. Так как правильно организовать эту самую историю заказов? Вводить дополнительную таблицу, в которой будут айди клиента и авто, на котором катается, и при выборе клиента делать выборку по соответствующему ID? Сомневаюсь в корректности моей идеи, прошу совета. Спасибо
  • Вопрос задан
  • 3561 просмотр
Решения вопроса 1
Могу предложить такой вариант. Делаем табличку cars_usage_profile
car_id, client_id, elapsed_usage_time,
где elapsed_usage_time - допустим суммарное время наката клиентом в секундах, если тариф вычисляться будет в коде, и я уверен, что это правильно. Мало ли как завтра захотят ещё обсчитывать, что тогда делать с имеющейся базой?

История заказов car_usage_history выглядеть тогда может так:
cars_usage_profile_id, date_start, date_finish,
откуда можно вычислить легко разницу во времени.

Далее, при каждом добавлении строчки в историю проката делаем обсчёт времени пользования. Тут есть быстрый вариант, когда можно взять предыдущее значение из cars_usage_profile и прибавить новое, а есть более медленный с пробеганием по всем строчкам истории с указанным cars_usage_profile_id, который если не будет устраивать - можно зафигачить в крон для полного пересчёта времени использования. Чисто так, для спокойствия души, что всё сходится.
Поиск будет работать очень быстро.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
hell0w0rd
@hell0w0rd
Просто разработчик
Я бы ввел коэффиценты для каждой из машин. Дальше в таблицу логирования вы можете записывать какой клиент на сколько брал, какой автомобиль. Потом простым запросом с использованием агрегатных функций(сумма, подсчет) складывали по нужной вам формуле коэффиценты и время, отсюда получали коэффицент стоимости
Ответ написан
Комментировать
savostin
@savostin
Еще один программист
Заводите поле для клиента - текущий тариф.
Пишите триггер, который при insert в таблицу заказов пересчитывает "тяжелым" запросом (каким сказать сложно - Вы не указали логику подсчета) текущий тариф клиента и обновляете значение в таблице клиентов.
Можно не триггером, а по крону.
Ответ написан
Комментировать
papahoolio
@papahoolio
совмещаем решение toster.ru/q/54424#answer_198854 с toster.ru/q/54424#answer_198864 и получаем оптимальную для старта структуру

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы