2017-03-08 13 views
0

Ich bin ziemlich neu zu DynamoDB und zur Zeit denken wir ein bestehendes Projekt zu einer serverless Anwendung mit DynamoDB über die Migration, wo wir die folgende Konfiguration aus einer RDMS Datenbank anpassen möchten:DynamoDB Abfrage mit mehreren Tags

Tables:

  • Projekte (ProjectID)
  • Dateien (FileID, ProjectID, Dateiname)
  • Schlagworte (FileID, Tag)

Wir wollen eine Abfrage mit DynamoDB machen alle Dateien für ein bestimmtes Projekt (von ProjectID) mit einem oder mehrere Stichworten (von Tag zu holen). In einem RDMS diese Abfrage einfach sein würde, mit so etwas wie:

SELECT * FROM Files JOIN Tags ON Tags.FileID = Files.FileID WHERE Files.ProjectID = ?PROJECT AND Tags.Tag = ?TAG_1 OR ?TAG_2 ...

Im Moment haben wir die folgende DynamoDB Setup (aber es kann noch geändert werden):

  • Projekte (ProjectID [ HashKey], ...)
  • Dateien (ProjectID [HashKey], FileID [RangeKey], ...)

Bitte beachten Sie auch, dass die Anzahl der Projekt ent Ries ist riesig (zwischen 1000 - 30000) und auch die Anzahl der Dateien für jedes Projekt (ist zwischen 50 und 100.000) und die Abfrage sollte wirklich schnell sein.

Wie kann dies mit DynamoDB-Abfrage erreicht werden, am besten ohne Verwendung von Filterausdrücken, da sie nach der Datenauswahl angewendet werden? Es wäre perfekt, wenn die Tabelle Dateien eine StringSet Tags als Spalte haben könnte, aber ich denke, dass dies nicht für eine effiziente DynamoDB-Abfrage verwendet werden kann (also ohne DynamoDB-Scan), da DynamoDB-Indizes nur vom Typ String sein können. Binary und Number und nicht vom Typ StringSet? Ist dies möglicherweise ein anwendbarer Anwendungsfall für die Global Secondary Index (GSI)?

Antwort

1

Ein bisschen spät, sah gerade diese Frage von einem anderen verwiesen.

Ich denke, du bist gegangen und es so etwas gelöst?

DynamoDB Tabellen

  • Projekte (ProjectID [HashKey], ...)
  • Dateien (ProjectID [HashKey], FileID [RangeKey], ...)
  • -Tags (Tag [HashKey ], FileID [RangeKey], ProjectID [LSI Sort Key])

auf den FileTags, müssen Sie die FileID der Primärschlüssel einzigartig zu machen, aber Sie können die ProjectID als Sortierschlüssel für einen lokalen Sekundärindex hinzufügen , so können Sie nach Tag + ProjectID suchen.

Es ist eine Art von Daten Denormalisierung, aber das ist, was NoSQL :-(.Wenn Ihre Datei zu einem anderen Projekt wechseln würde, müssen Sie die ProjectID nicht nur für die Datei, sondern auch für alle Tags aktualisieren.