У меня есть база данных с пользовательскими подписками на темы. В настоящее время около 20 000 тем, 20 миллионов пользователей и 200 миллионов подписчиков, хранящихся в базе данных SQL. Из-за своего размера база данных разделена по темам, поэтому я не могу получить информацию в одном запросе базы данных. Есть несколько тем с 10 миллионами подписчиков, пара с 100 000, а у других - сотни или меньше.
Когда происходит событие, оно обычно совпадает с несколькими темами, поэтому для информирования пользователей мне нужно выполнить запрос типа "дать мне всем пользователям, подписавшимся на темы x, y, z и выполнить объединение наборов", чтобы один пользователь получает новость один раз, даже если он подписался на обе темы x и z.
Ограничения:
- В объединении не должно быть дубликатов. (пользователи не могут получить контент дважды)
- В объединенном наборе может быть ограниченное количество пользователей. (если иногда пользователь не получает контент, это не так уж плохо, но он не может быть всегда одним и тем же пользователем для той же темы)
- Можно подписаться на новую тему без восстановления всего.
Я думал об использовании набора цветных фильтров для каждой темы, но они ограничивают друг друга: "пользователь либо не подписался наверняка, либо, вероятно, подписан". Мне нужно что-то вроде "пользователь подписался наверняка или, возможно, нет".
Lossy хэш-таблицы могут быть хорошей идеей, но я не уверен, если они могут быть эффективными как память, так как фильтры цветка, и я боюсь, что это будет всегда один и тот же пользователь, который пропускает контент в своей теме.
Знаете ли вы какие-либо другие структуры данных, которые могут быть полезны для решения этой проблемы?