La réponse est qu'ils ne font pas de sélections sur une table d'amis, ils utilisent très probablement une table d'événements d'actualité dénormalisée. Nous avons mis en place un fil d'actualité similaire à Facebook sur DoInk.com, voici comment nous l'avons fait :
Il y a la notion d'un "NewsEvent" il a un type, un initiateur (un identifiant utilisateur) et un utilisateur cible (également un identifiant utilisateur). (Vous pouvez également avoir des colonnes supplémentaires pour d'autres propriétés pertinentes pour l'événement, ou les rejoindre)
Lorsqu'un utilisateur publie quelque chose sur le mur d'un autre utilisateur, nous générons un événement comme celui-ci :
INSERT INTO events VALUES (wall_post_event, user1, user1)
Lors de l'affichage du profil de l'utilisateur1, vous devez sélectionner pour tous les événements où l'utilisateur1 est soit l'initiateur, soit la cible. C'est ainsi que vous affichez le flux de profil. (Vous pouvez faire preuve de fantaisie et filtrer les événements en fonction de votre modèle de confidentialité. Vous pouvez envisager de le faire en mémoire pour des raisons de performances)
Exemple :
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
Lorsque vous souhaitez voir le fil d'actualité de tous les événements relatifs à vos amis, vous pouvez effectuer une requête en sélectionnant tous les événements où l'initiateur se trouve dans votre groupe d'amis.
Évitez les implémentations avec des sous-sélections, selon la complexité, elles ne seront pas mises à l'échelle.