Odpověď je, že nevybírají na přátelském stole, s největší pravděpodobností používají denormalizovanou tabulku událostí. Implementovali jsme zpravodajský kanál podobný Facebooku na DoInk.com, takto jsme to udělali:
Existuje pojem "NewsEvent", který má typ, iniciátora (ID uživatele) a cílového uživatele (také ID uživatele). (Můžete mít také další sloupce pro další vlastnosti relevantní pro událost nebo se k nim připojit)
Když uživatel něco zveřejní na jiné uživatelské zdi, vygenerujeme událost jako je tato:
INSERT INTO events VALUES (wall_post_event, user1, user1)
Při prohlížení profilu uživatele1 byste vybrali pro všechny události, kde je uživatel1 iniciátorem nebo cílem. Takto zobrazíte profilový kanál. (V závislosti na modelu ochrany osobních údajů si můžete události vyzdobit a odfiltrovat je. Z důvodu výkonu to můžete zvážit v paměti.)
Příklad:
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
Když chcete vidět informační kanál pro všechny události související s vašimi přáteli, můžete provést dotaz a vybrat všechny události, kde je iniciátor ve vaší skupině přátel.
Vyhněte se implementacím s dílčími výběry, v závislosti na složitosti se nebudou škálovat.