powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Расчет цены и сортировка
2 сообщений из 52, страница 3 из 3
Расчет цены и сортировка
    #39019259
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Все это фактически один запрос. Если есть индексы - все должно летать.
Где же тут предрассчитанные итоги?

Не зная структуру метаданных базы - это гадание на кофейной гуще получается.
...
Рейтинг: 0 / 0
Расчет цены и сортировка
    #39142927
Artemeey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

Попробую описать проблему более подробно:

Параметры тура (строка в БД) - таблица `tours`
- Максимальное число Взрослых
- Максимальное число детских мест
- максимальное число дополнительных взрослых мест (например в 2-х местном номере добавляется 1 спальное место)
- максимальное число дополнительных детских мест (например в 2-х местном номере добавляется 1 детское спальное место)
- Возраст ребенка, до которого тур бесплатный и место не считается (например дети до 2 лет)
- Детский возраст (возраст с которого человек должен платить как за взрослого, например 16 лет)

Стоимость тура за сутки (строка в БД) - таблица `prices`
- стоимость детского места
- стоимость взрослого места
- стоимость дополнительного взрослого места
- стоимость дополнительного детского места

Делается выборка по таблице туров на основе входных данных:
- Число взрослых
- [+ возраст ребенка]{может не указываться или указываться несолкьо}
- Период (две даты)

Предполагаемое решение:
Сначала фильтруем по таблице туров.
Для каждого тура отдельно высчитывается НЕОБХОДИМОЕ количество взрослых и детских мест (у каждого тура возраст детей может отличаться (до 1, 2, 3, ..., 17 или 18 лет), не во всех турах дети до 2 лет размещаются бесплатно). В условии учитываются дополнительные места и их тип (взрослый или детский).

По полученном списку туров начинаем получать стоимость этого тура
- просчитываем фактическое число взрослых мест (N1), детских мест (N2), дополнительных взрослых мест (N3) и дополнительных детских мест (N4)
- по этим числам делаем выборку SUM(`price`) по периоду из табилцы `prices`. Так как у каждого типа размещения своя стоимость - то и запрос будет состоять из нескольких частей:
-- SUM(стоимость взрослого места * N1) за период
-- SUM(стоимость детского места * N2) за период
-- SUM(стоимость взрослого дополнительного места * N3) за период
-- SUM(стоимость детского дополнительного места * N4) за период
Итоговая стоимость - это и есть сумма тура.

Каждый отель имеет свои требования и ограничения, по этому уйти от таких условий не представляется возможным.
- Например посчитать стоимость для Взрослого и 16 ребенка НЕЛЬЗЯ как стоимость для двух взрослых (если у отеля детский возраст считается до 18 лет и детские места имеют отличную цену, чем взрослые)
- Например посчитать стоимость для Взрослого и 16 ребенка НЕОБХОДИМО как стоимость для двух взрослых (если у отеля детский возраст считается до 15 лет)

Сложность запросов
И так, допустим мы делаем вывод по 10 туров (далее подгружаются по мере скролла страницы или прохождению по страницам):
Тогда поиск туров займет = ВРЕМЯ_НА_ПОИСК_10_ТУРОВ_ПО_УСЛОВИЯМ_ВМЕСТИМОСТИ + ВРЕМЯ_НА_ФОРМИРОВАНИЕ_ЦЕН_ПО_ВХОДНЫМ_ДАННЫМ_ДЛЯ_ПЕРВЫХ_10_НАЙДЕННЫХ_ТУРОВ

А теперь представим ситуацию, что нам надо сделать сортировку по цене:
Тогда поиск туров займет = ВРЕМЯ_НА_ПОИСК_ВСЕХ_ТУРОВ_ПО_УСЛОВИЯМ_ВМЕСТИМОСТИ + ВРЕМЯ_НА_ФОРМИРОВАНИЕ_ЦЕН_ПО_ВХОДНЫМ_ДАННЫМ_ДЛЯ_ВСЕХ_НАЙДЕННЫХ_ТУРОВ

Если у нас на сайте 100-200 туров, разница почти не заметна.
Если же у нас их несколько десятков тысяч - то поиск будет занимать много времени.

Индекса стоят на колонках, участвующих в условиях.
Но проиндексировать цену не получится, так как число возможных вариантов цен очень велико (число взрослых может меняться от 1 до 20, число детей может меняться от 1 до 20, вдобавок у каждого тура детский возраст разный, число доп. мест для каждой выборки разный и зависит от настроек каждого тура, период может быть разный от 2 до 30 суток).
...
Рейтинг: 0 / 0
2 сообщений из 52, страница 3 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Расчет цены и сортировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]