Отговорът е, че те не правят избор на таблица за приятели, а най-вероятно използват денормализирана таблица за новини. Внедрихме емисия за новини, подобна на Facebook на DoInk.com, ето как го направихме:
Има понятието "NewsEvent", то има тип, инициатор (идентификатор на потребител) и целеви потребител (също потребителски идентификатор). (Можете също да имате допълнителни колони за други свойства, свързани със събитието, или да се присъедините към тях)
Когато потребител публикува нещо на стената на друг потребител, ние генерираме събитие като това:
INSERT INTO events VALUES (wall_post_event, user1, user1)
Когато преглеждате профила на user1, ще изберете за всички събития, при които user1 е или инициатор, или цел. Така показвате емисията на профила. (Можете да получите фантастични и да филтрирате събития в зависимост от вашия модел на поверителност. Може да помислите да направите това в паметта от съображения за производителност)
Пример:
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
Когато искате да видите канала с новини за всички събития, свързани с вашите приятели, можете да направите заявка, като изберете за всички събития, при които инициаторът е във вашия набор от приятели.
Избягвайте реализации с подселекции, в зависимост от сложността, те няма да се мащабират.