2016-12-20 3 views
0

Ich habe zwei Tabellen in DynamoDB:DynamoDB Abfrageelemente zu erhalten, basierend auf IDs von anderen Tabelle

  • Artikel
    • _id
    • Titel
    • Text
  • ArticleTag
    • articleId
    • Tag

Ein Artikel kann viele Tags wie "php", "html", "Design" und "erlang" haben.

Ich mag Abfrage meine Artikel Tisch und Paginieren nur durch denjenigen, die:

  • Habe einiger spezifische Tags

oder

  • Sie haben nicht einen bestimmten Tag

Wie würde ich das am effizientesten machen?

Antwort

1

Leider liegt die Antwort auf Ihre Frage nicht wirklich im DynamoDB Schemadesign. DynamoDB ist nicht unbedingt das richtige/beste Werkzeug für den Job, obwohl Sie es verwenden können, um Ihr Problem zu modellieren.

Denken Sie an DynamoDB als eine verteilte, skalierbare Hash-Map. Wenn Sie so darüber nachdenken, werden Sie feststellen, dass Sie das Tag-to-Articles-Mapping modellieren müssen, indem Sie Verweise auf Artikel speichern, die mit dem Tag versehen sind.

so vielleicht:

articles table: 
    id (partition key), 
    title, 
    text, 
    tags 

tags table: 
    tag (partition key), 
    article id (sort key) 

Beachten Sie, dass die articles Tabelle oben eine Liste von Tags hat, die jeden Artikel aufgebracht wurden, und die gleichen Informationen auch in der tags Tabelle gespeichert. Dies widerspricht den Best Practices für die Normalisierung Ihres Schemas, die Ihnen aus relationalen Datenbanken bekannt sind. Da es sich bei DynamoDB jedoch um eine nicht relationale Datenbank handelt, müssen Sie Ihre Daten anders strukturieren.

Es ist wichtig zu erwähnen, dass das Schema, wie oben dargestellt, sehr wahrscheinlich zu Partition Hot-Spotting führen wird, da es einige populäre Tags gibt, die vielen Artikeln entsprechen, während die meisten Tags sehr groß sein werden geringe Kardinalität. Eine mögliche Strategie zur Behandlung dieses Problems könnte die Unterteilung des Tag-Space sein.

Sie könnten jedoch bessere Ergebnisse erzielen, wenn Sie DynamoDB mit einer anderen Technologie kombinieren, z. B. Elastic Search.

+0

Vielen Dank, das macht Sinn. Würden Sie das Feld "Tags" als Array vorschlagen? Ich bin mir nicht ganz sicher, wie ich die QueryCondition zum Abrufen bestimmter Artikel per Tag schreiben soll. – nodesto

+0

Das Tag-Attribut in der Artikeltabelle könnte ein Zeichenfolgensatz sein. Aber so fragen Sie nicht nach Artikeln in einem Tag. Dafür ist die Tag-Tabelle zuständig. Dort müssen Sie einfach das Tag abfragen, an dem Sie interessiert sind. Interessant wird es, wenn Sie nach mehr als einem Tag suchen müssen. In diesem Fall benötigen Sie einen Join und DynamoDB führt keine Joins durch. Sie müssen den Join auf dem Client durchführen oder "kreativ" werden –

Verwandte Themen