Wann sollten mehrere Tabellen in DynamoDB verwendet werden?

11

Die Best Practices von DyanmoDB machen deutlich, dass:

Sie sollten in einer DynamoDB-Anwendung so wenige Tabellen wie möglich verwalten. Die meisten gut gestalteten Anwendungen erfordern nur eine Tabelle.

Ich finde es dann amüsant, dass fast jedes einzelne Tutorial, das ich mit DyanmoDB gesehen habe, ein Multi-Table-Design hat.

Aber was bedeutet das in der Praxis?

Betrachten wir eine einfache Anwendung mit drei Hauptentitäten: Benutzer, Projekte und Dokumente. Ein Benutzer besitzt mehrere Projekte, und ein Projekt kann mehrere Dokumente haben. In der Regel müssen wir die Projekte für einen Benutzer und die Dokumente für ein Projekt abfragen. Liest die Anzahl der Schreibvorgänge mit deutlichem Abstand.

Das Tabellendesign eines naiven Tutorials würde drei Tabellen verwenden:

Users
Hash key
user-id

Projects
Hash key       Global Index
project-id     user-id

Documents
Hash key       Global Index
document-id    project-id

Wir könnten ziemlich leicht zusammenbrechen Projectund Documentin einen DocumentsTisch fallen:

Documents
Hash key    Sort key        Global Index
project-id  document-id     user-id

Aber warum dort aufhören? Warum nicht eine Tabelle, um sie alle zu regieren? Da Userist die Wurzel von allem ...

Users
Hash key    Sort key
user-id     aspect
---------   ---------
foo         user                   email: foo@bar.com ...
foo         project:1              title: "The Foo Project"
foo         project:1:document:2   document-id: 2     ...

Dann hätten wir einen globalen Index beispielsweise für das emailFeld für die Suche nach Benutzerdatensätzen und einen weiteren für die document-idSuche nach direkten Dokumenten.

Soll es so funktionieren? Ist es legitim, solche sehr unterschiedlichen Arten von Daten in dieselbe Tabelle zu werfen? Oder ist das zweite Design mit zwei Tischen ein besserer Ansatz?

Ab wann wäre es richtig, eine zweite Tabelle hinzuzufügen?

David Eyk
quelle

Antworten:

7

Ja, es ist legitim zu tun, was Sie sagen. Beides ist es tatsächlich. Es gibt einige Variablen, die Sie hier nicht haben und die Ihnen dabei helfen können, wie das Datenmodell erstellt werden soll.

  1. Welche Art von Skalierung möchten Sie mit dieser Anwendung und diesem Datenmodell erreichen?
  2. Wie hoch ist das Leseverhältnis zwischen den Zugriffsmustern der Anwendung zwischen diesen Mustern? Das heißt, welches am meisten über die anderen geschlagen wird.
  3. Wie oft werden von den von Ihnen aufgelisteten Zugriffsmustern pro Sekunde ausgeführt?

Wenn beispielsweise 80% aller Lesevorgänge die Benutzer in einem Projekt finden sollen und dies 30.000 / s dauern muss, aber in Ihrer Anwendung nicht so viele Personen diesen Schritt weiter gehen und die Dokumente für die Projekte herausfinden, dann ist dies der Fall beträgt 20% der gesamten Lesevorgänge und darf nur 2000 Lesevorgänge / Sek. betragen. Dieser erste ist der "Hot Path" Ihrer Anwendung und sollte für optimiert werden.

Stellen Sie sich das auch so vor: Mit einer nicht relationalen Datenbank wie DynamoDB können Sie optimieren, wie Ihre Anwendung die Daten verwendet und darauf zugreift, und nicht wie mit einer relationalen Datenbank, bei der Sie sich große Gedanken darüber machen müssen, wie sie in der Datenbank gespeichert wird.

Kirche
quelle
Bei einem der erneuten Gespräche erklärte ein leitender Ingenieur ungefähr Folgendes: In der Vergangenheit war die Speicherung relativ teurer als die Berechnung; Also haben wir für die Speicherung optimiert (Relational DB), aber jetzt ist die Speicherung spottbillig! Rechnen ist relativ teuer;
Also
Ich bin damit einverstanden, dass ich mit NoSql meine Daten gemäß meinen Anwendungsanforderungen verwalten kann. Es geht um das Verhältnis zwischen gelesenen und geänderten Daten.
Anurag Pareek