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