Appengine Datastore-Modell für Twitter wie zeigen Beiträge von Benutzern gefolgt - Python, Google-App-Engine, Google-Cloud-Datenspeicher, Datenspeicher, Nosql

Ich arbeite an einem Web-System, bei dem eine Funktion dem Twitter-Konzept ähnelt, eine Liste von Benutzern zu verfolgen und ihre Beiträge als Liste zu sehen.

Das einfache Modell, das ich mir ausgedacht habe, erfordert es join Operation, die in nicht verfügbar ist datastore.

class Post(Model):
author = reference to user id
content = text content

class Following(Model):
author = reference to user id
followed_by = reference to user id

Die häufige Operation besteht darin, eine Liste von Posts (zeitlich sortiert) von Benutzern anzuzeigen, gefolgt von dem aktuellen Benutzer.

Mit dem obigen Modell kann es nur in zwei Schritten getan werden:

authors = Following.author when Following.followed_by == current_user
posts = Posts with Posts.author in authors

Gibt es einen Weg, dies effizienter zu erreichen?

Antworten:

0 für die Antwort № 1

Sie können ein Struktur Eigenschaft um alle Posts im Author-Objekt zu speichern.

Dort ist ein interessante Diskussion Hier könnte es für Sie interessant sein zu entscheiden, welcher Ansatz für Ihren Anwendungsfall am besten geeignet ist.


0 für die Antwort № 2

Sie können eine einzige Abfrage zum Anzeigen von Beiträgen verwenden, wenn Sie den Algorithmus etwas ändern. Sie könnten verfolgen, welche Beiträge für einen bestimmten Benutzer mit Entitäten wie diesen angezeigt werden müssten:

class DisplayPost(Model):
#parent entity = user for which the post should be displayed
#key ID matches the Post"s key ID
posted = datetime  # if you want timed ordering in display
expiry = datetime  # optional for periodic cleanup jobs

Immer wenn ein Autor einen neuen Beitrag erstellt, startet man einfach Aufgaben, um solche Entitäten für jeden Follower des Autors zu erstellen.

Wann immer Sie Posts für einen Benutzer anzeigen müssen, erstellen Sie einen einzelnen Vorfahren keys_only Abfrage, um die Liste zu erhalten DisplayPost Schlüssel:

keys = DisplayPost.query(ancestor=user_key, ...).fetch(keys_only=True)

Daraus erhalten Sie eine entsprechende Liste von Post Schlüssel und bekomme den Post mit a get_multi() Op, etwas in dieser Richtung:

post_keys = [ndb.Key(Post, key.id()) for key in keys]
posts = ndb.get_multi(post_keys)

Dies ermöglicht Ihnen eine viel schnellere Reaktionszeit beim Anzeigen von Posts, mit Nein join und nein IN (auch problematisch) ops. Bessere Skalierbarkeit. Der zu zahlende Preis bereitet immer den DisplayPost, auch wenn einige von ihnen nie benutzt werden (wenn sich die jeweiligen Benutzer nicht einmal anmelden).


Verwandte Fragen