Wie strukturiert man eine DynamoDB -Datenbank, um Abfragen für Trends zuzulassen?

StackOverflow https://stackoverflow.com/questions/9338746

  •  27-10-2019
  •  | 
  •  

Frage

Ich plane die folgende Formel, um "Trend" -Posts zu berechnen:

Trending Score = (p - 1) / (t + 2)^1.5

P = Stimmen (Punkte) von Benutzern. t = Zeit seit der Einreichung in Stunden.

Ich suche Ratschläge, wie ich meine Datenbanktabellen strukturieren kann, damit ich nach dem Trend von Posts mit DynamoDB (einem NoSQL -Datenbankdienst von Amazon) abfragen kann.

DynamoDB benötigt einen Primärschlüssel für jedes Element in einer Tabelle. Der Primärschlüssel kann aus 2 Teilen bestehen: das Hash -Attribut (Zeichenfolge oder Nummer) und das Bereich des Bereichs (String oder Nummer). Das Hash -Attribut muss für jedes Element eindeutig sein und ist erforderlich. Das Bereichsattribut ist optional, aber wenn verwendetes DynamoDB einen sortierten Bereichsindex für das Reichweiteattribut erstellt.

Die Struktur, die ich im Sinn hatte, lautet wie folgt:

TableName: Benutzer

HashAttribute:  user_id
RangeAttribute: NONE
OtherFields: first_name, last_name

TableName: Beiträge

HashAttribute:  post_id
RangeAttribute: NONE
OtherFields: user_id,title, content, points, categories[ ]

TableName: Kategorien

HashAttribute:  category_name
RangeAttribute: post_id
OtherFields: title, content, points

TableName: Zähler

HashAttribute:  counter_name
RangeAttribute: NONE
OtherFields: counter_value

Hier ist also ein Beispiel für die Arten von Anfragen, die ich mit der folgenden Tabellen -Setup stellen würde (Beispiel: user_id = 100):

Benutzeraktion 1:

Der Benutzer erstellt einen neuen Beitrag und markiert den Beitrag für 2 Kategorien (Baseball, Fußball).

Abfrage (1):

Überprüfen Sie den aktuellen Wert für coter_name = 'post_id' und Increment+1 und verwenden Sie das neue post_id

Abfrage (2): Fügen Sie Folgendes in die Post -Tabelle ein:

post_id=value_from_query_1, user_id=100, title=user_generated, content=user_generated, points=0, categories=['baseball','soccer']

Abfrage (3):

Fügen Sie Folgendes in die Kategorientabelle ein:

category_name='baseball', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0

Abfrage (4):

Fügen Sie Folgendes in die Kategorientabelle ein:

category_name='soccer', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0



Das Endziel ist es, die folgenden Arten von Abfragen durchzuführen:

1. Fragen Sie nach Trendwerken ab

2. Abfragen nach Posts in einer bestimmten Kategorie

3. Abfragen nach Posts mit den höchsten Punktwerten

Hat jemand eine Ahnung, wie ich meine Tabellen strukturieren könnte, damit ich eine Anfrage für Trends durchführen kann? Oder habe ich das die Fähigkeit, durch Wechsel zu DynamoDB zu tun?

War es hilfreich?

Lösung

Ich beginne mit einer Notiz in Ihrem Kommentar mit dem Timestamp vs post_id.
Da Sie DynamoDB als Ihren Post_ID -Generator verwenden, gibt es genau dort ein Skalierbarkeitsproblem. Diese Zahlen sind von Natur aus unvergleichlich und Sie sollten besser mit einem Datumsobjekt losgehen. Wenn Sie Beiträge in einer verrückten Geschwindigkeitszeit erstellen müssen, können Sie darüber lesen, wie Twitter es machthttp://blog.twitter.com/2010/announcing-snowflake

Kommen wir nun zu Ihrem Trend -Check zurück:
Ich glaube, Ihr Szenario missbraucht Dynamodb.
Angenommen, Sie haben eine heiße Kategorie, in der die meisten Beiträge enthalten sind. Grundsätzlich müssen Sie die gesamten Beiträge scannen (da die Daten nicht gut verbreitet sind) und für jeden Start die Punkte betrachten und die Vergleiche in Ihrem Server durchführen. Dies funktioniert einfach nicht oder ist sehr teuer, da Sie jedes Mal wahrscheinlich alle Kapazitäten für reservierte Leseeinheiten verwenden.

Der DynamoDB -Ansatz für diese Art von Trendprüfungen verwendet MapReduce
Lesen Sie hier, wie Sie diese implementieren: http://aws.ttypepad.com/aws/2012/01/aws-howto-using-amazon-elastic-mapreduce-with-dynamodb.html

Ich kann keine Zeit angeben, aber ich glaube, Sie werden diesen Ansatz skalierbar finden - obwohl Sie es nicht oft verwenden können.

In einem anderen Hinweis - Sie können eine Liste der trendigen Fragen "Top 10/100" aufbewahren und sie in "Echtzeit" aktualisieren, wenn ein Beitrag aufgelöst wird. Sie erhalten die Liste. Überprüfen Sie, ob sie mit dem neu aktualisiert werden muss Fragen Sie die Frage und speichern Sie sie bei Bedarf auf die DB zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top