Несколько вопросов:
1) Теги могут дублироваться? Или они уникальные?
2) Один и тот же тег - может быть привязан к разным постам. Так ведь?
Можно попробовать сделать следующее: разбить все на три таблицы:
- posts: id / site_id / published_at
- tags: id / name [и можно поставить еще ключ уникальности на поле name]
- post_tag_binding: post_id / tag_id [и поставить уникальный составной ключ на post_id + tag_id]
3) Тогда запрос, приблизительно, будет выглядеть вот как-то так:
select
p.id
from posts as p, post_tag_binding as p_t_b
where p.site_id = 124 and
p.id != 123 and
p.id = p_t_b.post_id and
p_t_b.tag_id in (
select
p_t_b2.tag_id
from post_tag_binding as p_t_b2
where p_t_b2.post_id = 123
)
4) Один и тот же пост - может быть привязан к разным сайтам? Если да, то нужно сделать еще одну таблицу: post_site_binding, в которой будут содержаться поля - post_id / site_id. Это немного усложнит выборку, но не значительно. И так же - можно будет сделать уникальный ключ по двум этим полям.
Я бы предложил следующую структуру:
- posts: id / title / description / created_at и т.д.
- tags: id / name [и можно поставить еще ключ уникальности на поле name]
- sites: id / name [и можно поставить еще ключ уникальности на поле name]
- post_tag_binding: post_id / tag_id [и поставить уникальный составной ключ на post_id + tag_id; дополнительно - сюда можно будет добавить еще site_id, если предполагается, что на разных сайтах может быть разный набор тегов для одного и того же поста]
- post_feed: post_id / site_id / published_at [т.е. делаем еще одну таблицу, в которой будем хранить - даты, когда и на какой сайт данный пост был опубликован]