|
|
|
Расчет цены и сортировка
|
|||
|---|---|---|---|
|
#18+
Arm79Все это фактически один запрос. Если есть индексы - все должно летать. Где же тут предрассчитанные итоги? Не зная структуру метаданных базы - это гадание на кофейной гуще получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2015, 09:43 |
|
||
|
Расчет цены и сортировка
|
|||
|---|---|---|---|
|
#18+
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 суток). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2016, 04:03 |
|
||
|
|

start [/forum/topic.php?fid=32&gotonew=1&tid=1540409]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 410ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...