Redjik
Джедай-мастер
Алгоритм необходим для нескольких проектов.
Уже несколько недель ломаем голову =).
Задача:
Имеется несколько "очередей", для вывода сущностей (+ пагинатор), вывод в таком порядке
1) Вип места - несколько сущностей могут принадлежать одному месту, выводится только одна в зависимости от seed, остальные, относящиейся к этому месту выводятся в других очередях.
2) Оплаченные с фотографиями - выводятся рандомно в зависимсти от seed
3) Оплаченные без фото.
4) Бесплатные c фото, вывод по дате, update_date DESC
5) Бесплатные без фото, вывод по дате, update_date DESC
Проблема в том, что есть фильтр и пагинатор - порядок не должен меняться.
Рассмотренные варианты:
1) Таблица-помощник: id сущности, timestamp (seed), order (порядок вывода).
Берем эту таблиу, джойним таблицу сущностей и делаем выборку по значениям фильтра.
Минус: синхронизация данных и добавление.удаление записей сразу из двух таблиц - денормализация
2) Таблица-помощник берется из кеша запроса или создается на лету.
Проблема: mysql не поддерживает кеш для subquery, не очень хочется переходить на mariaDb + не известно будет ли кешироваться запрос если будет order by rand(seed), в mysql точно не кешируется.
3) Сортировка id на php - результат вставляем в ORDER BY FIELD()
Один из самых медленных вариантов, чем больше записей - тем хуже рабоатет.
ЗЫ. postgreSQL не предлагать, я его не знаю, слишком дорого будет для компании, если я буду на проекте еще и postgreSQL учить, резибрать, дебажить...
Уже несколько недель ломаем голову =).
Задача:
Имеется несколько "очередей", для вывода сущностей (+ пагинатор), вывод в таком порядке
1) Вип места - несколько сущностей могут принадлежать одному месту, выводится только одна в зависимости от seed, остальные, относящиейся к этому месту выводятся в других очередях.
2) Оплаченные с фотографиями - выводятся рандомно в зависимсти от seed
3) Оплаченные без фото.
4) Бесплатные c фото, вывод по дате, update_date DESC
5) Бесплатные без фото, вывод по дате, update_date DESC
Проблема в том, что есть фильтр и пагинатор - порядок не должен меняться.
Рассмотренные варианты:
1) Таблица-помощник: id сущности, timestamp (seed), order (порядок вывода).
Берем эту таблиу, джойним таблицу сущностей и делаем выборку по значениям фильтра.
Минус: синхронизация данных и добавление.удаление записей сразу из двух таблиц - денормализация
2) Таблица-помощник берется из кеша запроса или создается на лету.
Код:
SELECT * FROM (SELECT id as entity_id FROM entity ORDER BY RAND(seed)) as helper
INNER JOIN entity as e ON (entity_id=e.id)
WHERE ...
3) Сортировка id на php - результат вставляем в ORDER BY FIELD()
Один из самых медленных вариантов, чем больше записей - тем хуже рабоатет.
ЗЫ. postgreSQL не предлагать, я его не знаю, слишком дорого будет для компании, если я буду на проекте еще и postgreSQL учить, резибрать, дебажить...