Добрый день!
Понимаю, что вопрос мало относится к указанным технологиям, но на всякий случай указал их.
Я пытаюсь сформировать ленту новостей. В эту ленту попадают новости, статьи, видео, репортажи. Каждый из этих типов данных лежит в отдельной таблице. Как минимум потому, что у них может немного различаться набор полей (основные совпадают), каждый из них имеет свою категоризацию.
Самое простое - выбрать всё через union, потом отсортировать и выбрать нужные:
select * from
(select * from news
union
select * from articles) as materials
order by time desc
limit <deisred_offset>, 10
Но в это варианте меня смущает, что таблицы довольно большие. Во-первых, выборка и сортировка будут занимать время, во-вторых offset, насколько мне известно, чем дальше от начала выборки - тем хуже
С другой стороны, мне не приходит в голову ничего более оптимального:
- так чтобы и по датам сортировалось предсказуемо (ведь новости могут публиковаться ежедневно по много раз, а статьи, например, раз в пару дней. Или вообще, одна из категорий давно не публиковалась. Это значит, что лимит на `select` до `union` повесить нельзя
- чтобы можно было сделать нормальный постраничный просмотр. Ориентироваться можно на идентификатор, но в данном случае идентификаторы пересекаются, и на них смотреть нельзя. А если по дате - то возвращаемся к предыдущему пункту - как выбирать данные, которые могут публиковаться очень часто, или не публиковаться годами
Есть ли какие-то руководства/практики построения таких конструкций?