Wie strukturiere ich ein Feed-and-Follow-System?

Lesezeit: 6 Minuten

Benutzeravatar von Zicsus
Zikus

Ich habe die Firebase-Echtzeitdatenbank für meine App für soziale Netzwerke verwendet, in der Sie folgen und Beiträge von Personen erhalten können, denen Sie folgen.

Meine Datenbank:

Users
--USER_ID_1
----name
----email
--USER_ID_2
----name
----email

Posts
--POST_ID_1
----image
----userid
----date
--POST_ID_2
----image
----userid
----date

Timeline
--User_ID_1
----POST_ID_2
------date
----POST_ID_1
------date

Ein weiterer Knoten „Content“ enthielt die ID aller Benutzerbeiträge. Wenn “A” auf “B” folgte, wurden alle Post-IDs von B zur Chronik von A hinzugefügt. Und wenn B etwas gepostet hat, wird es auch zu allen Timelines seiner Follower hinzugefügt.

Es hat Skalierbarkeitsprobleme:

  • Wenn jemand 10.000 Follower hat, wurde ein neuer Beitrag zu den Timelines aller 10.000 Follower hinzugefügt.
  • Wenn jemand viele Beiträge hat, erhält jeder neue Follower alle in seiner Chronik.

Ich möchte zu Firestore wechseln, da angeblich skalierbar ist. Wie sollte ich meine Datenbank strukturieren, damit diese Probleme in Echtzeitdatenbanken in Firestore eliminiert werden?

  • Haftungsausschluss: Ich habe nur die Firestore-Dokumente gelesen. Da Firestore viel bessere Abfragen hat als Firebase-realtime-db, müssen Sie keine Daten mehr kopieren. Was ich also tun würde, ist: Wenn ein Benutzer auf seine Zeitachse schaut, erstelle eine Firestore-Abfrage, die besagt give me all posts which are from the people i follow. So etwas wie: posts.where(user== john OR mark OR katy OR …). Ich gehe davon aus, dass so etwas funktioniert. Falls ich Zeit habe, es zu versuchen, lasse ich es dich wissen.

    – Jürgen Brandstetter

    16. November 2017 um 11:21 Uhr


  • @jurgenBrandstetter Firestore unterstützt derzeit kein ‘ODER’ und wenn dies der Fall wäre, würde auch Ihre Methode nicht funktionieren. Angenommen, jemand hat 1000 Follower, dann muss ich 1000 ODER-Aussagen machen.

    – Zikus

    18. November 2017 um 4:35 Uhr

  • Ich dachte, vielleicht geben Sie in Ihrem Dokument die ID der Person ein, die Ihnen folgt. Zum Beispiel folgt UserA auf UserB, dann setzen Sie im Postdokument von UserB UserAID = true. Wenn Sie also die Abfrage durchführen, lautet sie so etwas wie == postDocRef.where(UserAID=true), aber ich weiß nicht, ob ein Dokument in Firestore bis zu einer Million Follower unterstützen kann

    – Giovanny Pineros

    18. Mai 2018 um 19:14 Uhr


  • @Zicsus Nehmen wir dieses Beispiel an. Ich habe 10 000 Beiträge geschrieben. Jetzt folgst du mir. Sie können die Posts nach Zeitstempel ordnen und dann auf eine bestimmte Anzahl beschränken, z. B. 15 Posts, und die .childAdded-Methode verwenden. Um mehr Daten in der gleichen chronologischen Reihenfolge zu laden, könnten Sie eine Methode mit einem Beobachter des Typs: ObserveSingleEvent(ofType:Value) mit einem Limit von 10 Posts erstellen. Implementieren Sie dann eine Pull-to-Refresh-Funktion in Ihrer Tabellenansicht oder verwenden Sie den Scroll-View-Offset, und wenn Sie das Ende der Tabelle erreichen, rufen Sie einfach Ihre an ObserveSingleEvent Methode und erhalten Sie mehr Artikel und so weiter.

    – Lätzchen

    29. August 2018 um 18:07 Uhr

  • Bei der @bibscy-Frage geht es nicht darum, einen Feed vorzubereiten, wenn Sie nur einer Person folgen, sondern wie Sie einen chronologischen Feed wie Twitter erstellen, in dem Sie die Aktivitäten aller Benutzer sehen, denen Sie folgen.

    – Zikus

    29. August 2018 um 18:20 Uhr

  • Benutzer auf andere halbrelevante Posts von Ihnen zu leiten, ist keine Antwort. Mir gefällt auch Ihr Ansatz zum Abrufen eines Feeds nicht. Ein typischer Feed würde nicht nur die Posts von 15 Benutzern zurückgeben. Stattdessen sehen sie sich alle Beiträge chronologisch an. Ich denke also nicht, dass es eine gute Antwort ist, selbst mit seiner Länge / seinem Detail verfehlt es meiner Meinung nach das Ziel.

    – Thingamajig

    7. Juni 2019 um 15:21 Uhr

  • @Soorya Es kostet immer genau die Anzahl der Operationen, die Sie durchführen. Nichts mehr.

    – Alex Mamo

    6. Mai 2020 um 8:18 Uhr

  • @Soorya Sie überprüfen auch Dies aus.

    – Alex Mamo

    7. Mai 2020 um 7:22 Uhr

  • @ernewston Danke. Ja, es kann eine Lösung sein, solange es Ihr Problem löst. Aber denken Sie daran, dass es immer ein Tauschgeschäft ist, wenn es um doppelte Daten geht. Sie sollten einige Tests durchführen und prüfen, ob es sich lohnt oder nicht.

    – Alex Mamo

    26. Mai 2020 um 9:13 Uhr

  • @AlexMamo danke für die Antwort. Bisher ist das die beste Lösung. Aber ich habe die Kosten für das Schreiben in die Timeline jedes Benutzers berechnet, es wird enorm. Betrachten Sie 2.000 DAU und jeder aktive Benutzer hat im Durchschnitt 1.000 Follower, sie folgen 10 neuen Personen / Tag und posten 10 neue / Tag. Jede neue Person, der sie folgen, hat durchschnittlich ~500 Beiträge. Und jede DAU hat durchschnittlich 1.000 Follower. Wenn sie also einer neuen Person folgen: 2.000*10.500/Tag an Schreibvorgängen, wenn sie posten: 2.000*10*1.000/Tag. Dann alle x30 Tage. Abzüglich des kostenlosen Kontingents müssen wir dann immer noch 1.618 $ bezahlen. Nur für die Anzahl der Schreibvorgänge. es dauerte 80% der Abrechnung. Gibt es einen besseren Weg?

    – Zenko

    2. Juli 2020 um 20:50 Uhr


  • @Niyas Mit dieser Lösung, wenn Benutzer A Benutzer B folgt, der B_r-Bewertungen hat, werden wir B_r-Schreibvorgänge für jede Verfolgung ausführen, richtig?

    – thedeg123

    30. April 2020 um 15:34 Uhr

  • Du sagtest you must add the list of followers in post document. aber hier ist das große Problem bei dieser Lösung: Wenn ein Benutzer einen neuen Follower bekommt und 10.000 Beiträge hat, müssen Sie jeden dieser 10.000 Beiträge aktualisieren, um diesen neuen Follower in das Follower-Array aufzunehmen. 10.000 Schreibvorgänge für 1 Follow. Das klingt nicht nach guter Architektur.

    – Antoine Weber

    11. Oktober 2020 um 2:30 Uhr


  • Ich muss jedoch sagen, dass dies die beste Antwort zu sein scheint, obwohl es nicht ideal ist

    – Antoine Weber

    11. Oktober 2020 um 15:52 Uhr

  • Ich habe Ihre Antwort als Grundlage für meine Bewerbung verwendet und es hat wunderbar funktioniert. Ich habe das Array-Limit mit Ihrem Vorschlag des ‘hasNext’-Flags umgangen und dann den Beitrag für jedes zusätzliche Dokument dupliziert, das ein Array von folgenden Benutzern enthält. @Antoine Ich würde den Grenzfall des Duplizierens von 10.000 Posts gegenüber dem Duplizieren eines Posts für 1 Million Follower nehmen

    – cpboyce

    21. April 2021 um 18:54 Uhr

  • Dies ist bisher der effizienteste Weg, um eine chronologische Zeitleiste der Posts verschiedener Benutzer zu erstellen. Ich wünschte, ich könnte 10 Mal positiv abstimmen, damit die Leute wissen, dass dies eine gute Antwort ist.

    – Tadreik

    5. Dezember 2021 um 17:18 Uhr


  • @Tadreik Danke! Wir hatten Skalierungsprobleme und ich habe mir das ausgedacht. Wir haben es jetzt seit über einem Jahr ohne Probleme in der Produktion verwendet.

    – Albert Renshaw

    7. Dezember 2021 um 2:41 Uhr

  • Ich mag recentPostsLastUpdatedAt Außerdem ist es sehr sinnvoll, den Suchraum für Benutzerabfragen zu verringern.

    – LordParsley

    7. Januar um 12:22 Uhr

  • Scheint hier die beste Option in Bezug auf die Kostenoptimierung zu sein. Ich werde das versuchen, aber ich werde mit dem Caching experimentieren recentPosts Array an die Browser localStorage. Aktualisieren Sie dann den Cache mit einer Abfrage, die nur Benutzerdokumente abruft recentPosts wo recentPostLastUpdated ist neuer als der letzte “neueste” Beitrag im Cache. Eine andere Sache, mit der man experimentieren kann, ist, wie oft nach neuen Posts abgefragt werden soll, während der Benutzer auf der Seite ist. Außerdem könnte es hilfreich sein, den Feed nicht zu aktualisieren, während die Registerkarte / Seite nicht aktiv ist, denke ich …

    – Spiralis

    17. September um 0:37 Uhr

  • Sehr gute Lösung, werde ich auf jeden Fall ausprobieren. Allerdings habe ich eine Frage. Sie sagten: “Beim Laden der userDocuments können Sie sie 10 gleichzeitig stapeln, indem Sie die in-Abfrage verwenden … normalerweise würde dies keinen Unterschied machen, da es immer noch 10 Lesevorgänge sind, obwohl es stapelweise ist … “. Können Sie das näher erläutern? Ich bin mir nicht sicher, was du damit meinst? Vielen Dank 🙂

    – George

    4. November um 10:55 Uhr


1432180cookie-checkWie strukturiere ich ein Feed-and-Follow-System?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy