В приложении, над которым я работаю, есть лента активности, где каждый пользователь может видеть активность своих друзей (так же, как Facebook). Я ищу умеренно масштабируемый способ показа потока активности данного пользователя на лету. Я говорю «умеренно», потому что я пытаюсь сделать это только с базой данных (Postgresql) и возможно memcached. Например, я хочу, чтобы это решение масштабировалось до 200 тысяч пользователей, каждый из которых имеет 100 друзей.
В настоящее время существует основная таблица действий, в которой хранится визуализированный html для данного действия (Джим добавил друга, Джордж установил приложение и т. Д.). В этой основной таблице действий содержатся исходный пользователь, html и отметка времени.
Кроме того, есть отдельная (объединяющая) таблица, в которой просто хранится указатель на человека, который должен видеть это действие в своем фиде друзей, и указатель на объект в основной таблице действий.
Итак, если у меня есть 100 друзей, и я выполняю 3 действия, тогда таблица объединения увеличится до 300 единиц.
Очевидно, что эта таблица будет расти очень быстро. Однако у него есть приятное свойство: выборочная операция, отображаемая для пользователя, требует одного (относительно) недорогого запроса.
Другой вариант - просто сохранить основную таблицу активности и запросить ее, сказав что-то вроде:
select * from activity where source_user in (1, 2, 44, 2423, ... my friend list)
Это имеет тот недостаток, что вы запрашиваете пользователей, которые могут никогда не быть активными, и по мере роста вашего списка друзей этот запрос может становиться все медленнее и медленнее.
Я вижу плюсы и минусы обеих сторон, но мне интересно, могут ли некоторые ТАК люди помочь мне взвесить варианты и предложить один или другой вариант. Я также открыт для других решений, хотя я хотел бы сделать это простым и не устанавливать что-то вроде CouchDB и т. Д.
Большое спасибо!