Het antwoord is dat ze geen selecties doen op een vriendentafel, ze gebruiken hoogstwaarschijnlijk een gedenormaliseerde nieuwsgebeurtenistabel. We hebben een nieuwsfeed geïmplementeerd die vergelijkbaar is met Facebooks op DoInk.com, hier is hoe we het hebben gedaan:
Er is het idee van een "NewsEvent", het heeft een type, een initiator (een gebruikers-ID) en een doelgebruiker (ook een gebruikers-ID). (U kunt ook extra kolom(men) hebben voor andere eigenschappen die relevant zijn voor het evenement, of u kunt hieraan deelnemen)
Wanneer een gebruiker iets op het prikbord van een andere gebruiker plaatst, genereren we een evenement als dit:
INSERT INTO events VALUES (wall_post_event, user1, user1)
Wanneer u het profiel van gebruiker1 bekijkt, selecteert u voor alle gebeurtenissen waarbij gebruiker1 de initiatiefnemer of het doelwit is. Zo geef je de profielfeed weer. (Je kunt leuke dingen bedenken en gebeurtenissen eruit filteren, afhankelijk van je privacymodel. Je kunt overwegen dit in het geheugen te doen om prestatieredenen)
Voorbeeld:
SELECT * FROM events WHERE initiator = user1 or target = user1 //to see their profile feed
SELECT * FROM events WHERE initiator IN (your set of friend ids) //to see your newsfeed
Als je de nieuwsfeed wilt zien voor alle evenementen die betrekking hebben op je vrienden, kun je een zoekopdracht uitvoeren om alle evenementen te selecteren waarbij de initiatiefnemer zich in je vriendengroep bevindt.
Vermijd implementaties met subselecties, afhankelijk van de complexiteit zullen ze niet schalen.