Есть первая сущность —
статьи. Пока не важно как они хранятся в БД.
Есть вторая сущность —
журналы. То же нет никаких ограничений, как их хранить.
Одна и та же статья может одновременно публиковаться в нескольких журналах (например, в двух).
Есть третья сущность —
подписчики. Один подписчик может читать сразу несколько журналов.
Как для подписчика выбрать все опубликованные в этих журналах (которые подписчик читает) статьи упорядоченные по дате публикации и без повторов.
Самый простой способ, как я вижу:
1. Сделать таблицу со статьями:
posts
p_id, j1_id, j2_id, text, date
2. Сделать таблицу с подписками:
follows
f_id, u_id, j_id (u_id — это id пользователя из какой-то таблицы users)
3. Сделать выборку:
select posts.* from posts inner join follows on (j_id = j1_id or j_id = j2_id) where u_id = 1 order by date desc
Это запрос возвращает данные с дубликатами. Можно использовать всякие механизмы DISTINCT или GROUP BY, но это создает дополнительную операцию сортировки для удаления дубликатов.
Можно сделать с помощью UNION, но он тоже задействует механизм DISTINCT.
(select posts.* from posts inner join follows on j_id = j1_id where u_id = 1)
union
(select posts.* from posts inner join follows on j_id = j2_id where u_id = 1)
order by date desc
Возможно, здесь я не правильно выбрал структуру хранения.
Собственно вопрос, возможно ли как-то решить эту задачу, чтобы
минимизировать время нужной выборки на больших данных?