Datenmodellierung ist der Prozess des Entwurfs, wie eine Anwendung Daten in einer bestimmten Datenbank speichert. Mit einer NoSQL-Datenbank wie DynamoDB unterscheidet sich die Datenmodellierung von der Modellierung mit einer relationalen Datenbank. Eine relationale Datenbank ist auf Flexibilität ausgelegt und kann sich hervorragend für analytische Anwendungen eignen. Bei der relationalen Datenmodellierung beginnen Sie zunächst mit Ihren Entitäten. Wenn Sie ein normalisiertes relationales Modell haben, können Sie jedes Abfragemuster, das Sie in Ihrer Anwendung benötigen, erfüllen.

NoSQL (nicht-relationale) Datenbanken sind auf Geschwindigkeit und Skalierbarkeit ausgelegt – nicht auf Flexibilität. Auch wenn die Leistung Ihrer relationalen Datenbank bei der Skalierung nach oben hin abnehmen kann, bietet die horizontale Skalierung von Datenbanken wie DynamoDB eine konsistente Leistung in jedem Maßstab. Einige DynamoDB-Benutzer haben Tabellen, die größer als 100 TB sind, und die Lese- und Schreibleistung ihrer Tabellen ist die gleiche, wie wenn die Tabellen kleiner als 1 GB wären.

Um mit einer NoSQL-Datenbank wie DynamoDB beste Ergebnisse zu erzielen, ist ein Umdenken gegenüber der typischen relationalen Datenbank erforderlich. Verwenden Sie die folgenden bewährten Verfahren bei der Datenmodellierung mit DynamoDB.

1. Fokussieren Sie sich auf Zugriffsmuster.

Bei jeder Art von Datenmodellierung beginnen Sie mit einem Entitäts-Beziehungsdiagramm, das die verschiedenen Objekte (oder Entitäten) in Ihrer Anwendung beschreibt und wie sie miteinander verbunden sind (oder die Beziehungen zwischen Ihren Entitäten).

In relationalen Datenbanken legen Sie Ihre Entitäten direkt in Tabellen ab und spezifizieren Beziehungen über Fremdschlüssel. Nachdem Sie Ihre Datentabellen implementiert haben, bietet eine relationale Datenbank eine flexible Abfragesprache, um Daten in der von Ihnen gewünschten Form zurückzugeben.

In DynamoDB denken Sie über Zugriffsmuster nach, bevor Sie Ihre Tabelle modellieren. Bei den NoSQL-Datenbanken geht es um Geschwindigkeit, nicht um Flexibilität. Sie fragen zunächst, wie Sie auf Ihre Daten zugreifen werden, und modellieren dann Ihre Daten in der Form, in der auf sie zugegriffen werden soll.

Bevor Sie Ihre DynamoDB-Tabelle entwerfen, dokumentieren Sie jeden Bedarf, den Sie zum Lesen und Schreiben von Daten in Ihrer Anwendung haben. Seien Sie gründlich und denken Sie über alle Abläufe in Ihrer Anwendung nach, denn Sie werden Ihre Tabelle für Ihre Zugriffsmuster optimieren.

2. Optimieren für die Anzahl der Anfragen an DynamoDB.

Nachdem Sie die Anforderungen an das Zugriffsmuster Ihrer Anwendung dokumentiert haben, sind Sie bereit, Ihre Tabelle zu entwerfen. Sie sollten Ihre Tabelle so gestalten, dass die Anzahl der Anfragen an DynamoDB für jedes Zugriffsmuster minimiert wird. Im Idealfall sollte für jedes Zugriffsmuster nur eine einzige Anfrage an DynamoDB erforderlich sein, da Netzwerkanfragen langsam sind, was die Anzahl der Netzwerkanfragen in Ihrer Anwendung begrenzt.

Um für die Anzahl der Anfragen an DynamoDB zu optimieren, müssen Sie einige zentrale Konzepte verstehen:

3. Täuschen Sie kein Beziehungsmodell vor.

Personen, die neu bei DynamoDB sind, versuchen oft, ein relationales Modell auf einer nicht-relationalen DynamoDB zu implementieren. Wenn Sie versuchen, dies zu tun, verlieren Sie die meisten Vorteile von DynamoDB.

Die gängigsten Anti-Muster, die man mit DynamoDB ausprobiert, sind:

  • Normalisierung: In einer relationalen Datenbank normalisieren Sie Ihre Daten, um Redundanz und Speicherplatz zu reduzieren, und verwenden dann Joins, um mehrere verschiedene Tabellen zu kombinieren. Allerdings sind Joins in großem Maßstab langsam und teuer. DynamoDB lässt keine Joins zu, weil sie sich verlangsamen, wenn Ihre Tabelle wächst.
  • Ein Datentyp pro Tabelle: Ihre DynamoDB-Tabelle enthält oft verschiedene Datentypen in einer einzigen Tabelle. In unserem Beispiel haben wir Benutzer-, Freundes-, Foto- und Reaktionsentitäten in einer einzigen Tabelle. In einer relationalen Datenbank würde dies als vier verschiedene Tabellen modelliert werden.
  • Zu viele Sekundärindizes: Oft wird versucht, für jedes zusätzliche Zugriffsmuster, das man benötigt, einen Sekundärindex zu erstellen. DynamoDB ist schemenlos, und das gilt auch für Ihre Indizes. Nutzen Sie die Flexibilität in Ihren Attributen, um einen einzelnen Sekundärindex über mehrere Datentypen in Ihrer Tabelle wiederzuverwenden. Dies wird als Indexüberlastung bezeichnet.

In den folgenden Schritten werden wir unser Entitäts-Beziehungsdiagramm erstellen und unsere Zugriffsmuster im Vorfeld skizzieren. Dies sollten immer die ersten Schritte sein, wenn Sie DynamoDB verwenden. In den folgenden Modulen implementieren wir dann diese Zugriffsmuster in unser Tabellendesign.

Veranschlagte Zeit für das Modul: 20 Minuten


  • Schritt 1: Erstellen Sie Ihr Entitäts-Beziehungsdiagramm

    Der erste Schritt jeder Datenmodellierungsübung ist die Erstellung eines Diagramms, das die Entitäten in Ihrer Anwendung und ihre Beziehung zueinander zeigt.

    In unserer Anwendung haben wir die folgenden Entitäten:

    • Benutzer
    • Foto
    • Reaktion
    • Freundschaft

    Ein Benutzer kann viele Fotos haben, und ein Foto kann viele Reaktionen haben. Schließlich stellt die Entität Freundschaft eine Viele-zu-viele-Beziehung zwischen Benutzern dar, da ein Benutzer mehreren Benutzern folgen kann und von mehreren anderen Benutzern gefolgt werden kann.

    Mit diesen Entitäten und Beziehungen im Hinterkopf ist unser Entitäts-Beziehungsdiagramm unten dargestellt.

    Module_2_Step_1

    (zum Vergrößern klicken)

    Module_2_Step_1
  • Schritt 2: Berücksichtigen Sie die Zugriffsmuster der Benutzerprofile

    Nun, da wir unser Entitäten-Beziehungsdiagramm haben, sollten wir die Zugriffsmuster um unsere Entitäten herum betrachten. Beginnen wir mit Benutzern.

    Die Benutzer unserer mobilen Anwendung müssen Benutzerprofile erstellen. Diese Profile enthalten Informationen wie einen Benutzernamen, ein Profilbild, den Standort, den aktuellen Status und die Interessen eines bestimmten Benutzers.

    Benutzer können das Profil anderer Benutzer durchsuchen. Möglicherweise möchte ein Benutzer das Profil eines anderen Benutzers durchsuchen, um zu sehen, ob es interessant ist, dem Benutzer zu folgen, oder einfach nur, um einige Hintergrundinformationen über einen bestehenden Freund zu lesen.

    Mit der Zeit wird ein Benutzer sein Profil aktualisieren wollen, um einen neuen Status anzuzeigen oder seine Interessen zu aktualisieren, wenn sich diese ändern.

    Auf der Grundlage dieser Informationen haben wir drei Zugriffsmuster:

    • Benutzerprofil erstellen (Schreibvorgang)
    • Benutzerprofil aktualisieren (Schreibvorgang)
    • Benutzerprofil abrufen (Lesevorgang)
       
  • Schritt 3: Berücksichtigen Sie die Zugriffsmuster vor dem Spiel.

    Sehen wir uns nun die Zugriffsmuster um die Fotos herum an.

    Unsere mobile Anwendung ermöglicht es den Benutzern, Fotos hochzuladen und mit ihren Freunden zu teilen, ähnlich wie bei Instagram oder Snapchat. Wenn Benutzer ein Foto hochladen, müssen Sie Informationen wie den Zeitpunkt des Hochladens des Fotos und den Speicherort der Datei in Ihrem Content-Delivery-Netzwerk (CDN) speichern.

    Wenn Benutzer keine Fotos hochladen, werden sie die Fotos ihrer Freunde durchsuchen wollen. Wenn sie das Profil eines Freundes besuchen, sollten sie die Fotos für einen Benutzer sehen, wobei die neuesten Fotos zuerst angezeigt werden. Wenn ihnen ein Foto wirklich gefällt, können sie mit einer von vier vordefinierten Reaktionen auf das Foto „reagieren“ – mit einem Herz, einem Smiley, einem Daumen hoch oder einer Sonnenbrille. Beim Betrachten eines Fotos sollten die aktuellen Reaktionen auf das Foto angezeigt werden.

    In diesem Abschnitt haben wir die folgenden Zugriffsmuster:

    • Foto für Benutzer hochaden (Schreibvorgang)
    • Neuere Fotos für Benutzer anzeigen (Lesevorgang)
    • Auf ein Foto reagieren (Schreibvorgang)
    • Foto und Reaktionen anzeigen (Lesevorgang)
       
  • Schritt 4: Zugriffsmuster im Spiel und nach dem Spiel

    Lassen Sie uns schließlich die Zugriffsmuster rund um die Freundschaft betrachten.

    Viele beliebte mobile Anwendungen haben einen sozialen Netzwerkaspekt. Benutzer können Freunden folgen, Aktualisierungen zu den Aktivitäten Ihrer Freunde einsehen und Empfehlungen für andere Freunde erhalten, denen sie vielleicht folgen möchten.

    In Ihrer Anwendung ist eine Freundschaft eine Einwegbeziehung, wie Twitter. Ein Benutzer kann sich dafür entscheiden, einem anderen Benutzer zu folgen, und dieser Benutzer kann sich dafür entscheiden, dem Benutzer zurück zu folgen. Für unsere Anwendung werden wir die Benutzer, die einem Benutzer folgen, „Follower“ nennen, und wir werden die Benutzer, denen ein Benutzer folgt, „gefolgte Benutzer“ nennen.

    Auf der Grundlage dieser Informationen haben wir die folgenden Zugriffsmuster:

    • Benutzer folgen (Schreibvorgang)
    • Follower für Benutzer anzeigen (Lesevorgang)
    • Gefolgte Benutzer für Benutzer anzeigen (Lesevorgang)

    Wir haben jetzt alle unsere Zugriffsmuster für unsere mobile Anwendung festgelegt. In den folgenden Modulen implementieren wir diese Zugriffsmuster mit Hilfe von DynamoDB.

    Beachten Sie, dass die Planungsphase einige Iterationen dauern kann. Beginnen Sie mit einer allgemeinen Vorstellung von den Zugriffsmustern, die Ihre Anwendung benötigt. Bilden Sie den Primärschlüssel, Sekundärindizes und Attribute in Ihrer Tabelle ab. Gehen Sie zurück zum Anfang und stellen Sie sicher, dass alle Ihre Zugriffsmuster zufriedenstellend sind. Wenn Sie sicher sind, dass die Planungsphase abgeschlossen ist, fahren Sie mit der Umsetzung fort.