Witam. Jak sensownie i w miarę optymalnie zrealizować pobieranie z bazy MySQL, dla danego użytkownika, listy postów o poniższych wariantach:
- posty które użytkownik sam stworzył
- posty które stworzyli jego znajomi
- posty które użytkownik skomentował
- posty które skomentowali jego znajomi
- posty które polubili jego znajomi ?
To powinno być pobrane razem (w jednym zapytaniu), bo ta lista ma wyświetlać się na "tablicy" użytkownika (jak na Facebooku).
Mi przychodzi do głowy tylko jeden pomysł - przy każdej akcji (dodanie komentarza, polubienie postu, stworzenie postu) wykonanej przez użytkownika, zapisywać do jakiejś tabeli (np. "posts_relationships") informację o wykonaniu jakiejś akcji, przez użytkownika X, na poście Y (tylko raz byłaby ta informacja zapisywana, czyli w bazie dać unikalny klucz na pola: USER_ID, POST_ID, ACTION [bo po co zapisywać wiele razy to, skoro wystarczy jeden raz]). Jakimś workerem (np. w NodeJS) pobierać z tej tabeli "posts_relationships" jeszcze nieobsłużone rekordy, pobierać listę znajomych dla USER_ID i w kolejnej tabeli (np. "posts_displays_for") zapisywać dla każdego znajomego osobny rekord (100 znajomych = insert 100 rekordów) [pola: POST_ID, USER_ID, też unikalny klucz dać dla tych obu pól], i przy pobieraniu postów sprawdzałbym tylko czy dany użytkownik jest autorem postu lub czy w tej tabeli "posts_displays_for" istnieje rekord dla jego ID i dla ID postu.
Dobra droga?
Obawiam się tylko ilości rekordów w tej tabeli "posts_displays_for" bo zakładając, że średnio użytkownik będzie miał 50 znajomych, to na dodanych 1.000 postów, w tabeli będzie wygenerowanych 50.000 rekordów. A przy średnio 100 znajomych, na dodanych 10.000 postów będzie wygenerowanych 1.000.000 rekordów. Wydaje się niedużo, a i dodatkowe opcje, tj. "ukryj ten post na mojej tablicy" będzie bardzo łatwe do zaimplementowania przy takim rozwiązaniu :)
Jakieś inne, ciekawsze, lepsze rozwiązanie ktoś podrzuci?