Jag skulle gå med följande struktur:
-
Använd en samling för alla åtgärder som hände,
Actions
-
Använd en annan samling för vem som följer vem,
Subscribers
-
Använd en tredje samling,
Newsfeed
för en viss användares nyhetsflöde fläktas artiklar ut frånActions
samling.
Newsfeed
samlingen kommer att fyllas i av en arbetsprocess som asynkront bearbetar nya Actions
. Därför kommer nyhetsflöden inte att fyllas i realtid. Jag håller inte med Geert-Jan i att realtid är viktigt; Jag tror att de flesta användare inte bryr sig om ens en minuts försening i de flesta (inte alla) applikationer (i realtid skulle jag välja en helt annan arkitektur).
Om du har ett mycket stort antal consumers
, fan-out kan ta ett tag, sant. Å andra sidan kommer det inte att fungera att sätta in konsumenterna direkt i objektet med särskilt stora antal följare, och det kommer att skapa alltför stora objekt som tar upp mycket indexutrymme.
Men viktigast av allt är att fan-out-designen är mycket mer flexibel och tillåter relevanspoäng, filtrering etc. Jag har nyligen skrivit ett blogginlägg om nyhetsflödesschemadesign med MongoDB där jag förklarar en del av den flexibiliteten mer i detalj.
På tal om flexibilitet, jag skulle vara försiktig med den där activitystrea.ms-specifikationen. Det verkar vara vettigt som en specifikation för interop mellan olika leverantörer, men jag skulle inte lagra all den utförliga informationen i min databas så länge du inte har för avsikt att aggregera aktiviteter från olika applikationer.