Odpowiedź jest taka, że nie dokonują wyborów w tabeli znajomych, najprawdopodobniej używają zdenormalizowanej tabeli zdarzeń wiadomości. Wdrożyliśmy kanał informacyjny podobny do Facebooka na DoInk.com, oto jak to zrobiliśmy:
Istnieje pojęcie „NewsEvent”, które ma typ, inicjator (identyfikator użytkownika) i użytkownika docelowego (również identyfikator użytkownika). (Możesz również mieć dodatkowe kolumny dla innych właściwości związanych z wydarzeniem lub dołączyć do nich)
Gdy użytkownik publikuje coś na tablicy innego użytkownika, generujemy takie zdarzenie:
INSERT INTO events VALUES (wall_post_event, user1, user1)
Przeglądając profil użytkownika 1, należy wybrać dla wszystkich zdarzeń, w których użytkownik 1 jest inicjatorem lub celem. W ten sposób wyświetlasz kanał profilu. (Możesz wymyślić i odfiltrować zdarzenia w zależności od modelu prywatności. Możesz rozważyć zrobienie tego w pamięci ze względu na wydajność)
Przykład:
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
Jeśli chcesz zobaczyć kanał wiadomości dla wszystkich wydarzeń w odniesieniu do Twoich znajomych, możesz wykonać zapytanie, wybierając dla wszystkich wydarzeń, w których inicjator znajduje się w Twoim zestawie znajomych.
Unikaj implementacji z podwyborami, w zależności od złożoności nie będą się skalować.