Svaret er, at de ikke foretager udvælgelser på et vennebord, de bruger højst sandsynligt en de-normaliseret nyheds-begivenhedstabel. Vi implementerede et nyhedsfeed svarende til Facebooks på DoInk.com, sådan gjorde vi det:
Der er forestillingen om en "NewsEvent", den har en type, en initiator (et bruger-id) og en målbruger (også et bruger-id). (Du kan også have yderligere kolonne(r) for andre ejendomme, der er relevante for begivenheden, eller deltage i dem)
Når en bruger poster noget på en anden brugers væg, genererer vi en begivenhed som denne:
INSERT INTO events VALUES (wall_post_event, user1, user1)
Når du ser bruger1s profil, skal du vælge for alle begivenheder, hvor bruger1 enten er initiativtageren eller målet. Det er sådan du viser profilfeedet. (Du kan blive fancy og filtrere begivenheder fra afhængigt af din privatlivsmodel. Du kan overveje at gøre dette i hukommelsen af præstationsmæssige årsager)
Eksempel:
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
Når du vil se nyhedsfeedet for alle begivenheder i forhold til dine venner, kan du lave en forespørgsel og vælge for alle begivenheder, hvor initiativtageren er i dit sæt venner.
Undgå implementeringer med undervalg, afhængigt af kompleksiteten vil de ikke skaleres.