2017-12-26 17 views
0

Also verwende ich AWS Lambda mit node.js mit DynamoDB zu interagieren, es ist alles in Ordnung, bis jetzt kann ich einen Scan, Abfrage mit einem Primärschlüssel, usw. ausführen.Wählen Sie mit where-Anweisung in Dynamo DB

Aber jetzt muss ich eine Abfrage durchführen oder scannen, dass ich den Primärschlüssel nicht kenne, ich habe nur den Namen der Spalte, den Parameter, den ich nach dieser Spalte filtern möchte und den Tabellennamen.

wie dieser in SQL-Sprache:

SELECT * FROM user WHERE user_type = 'Moderator'; 

Ich habe bei der Dokumentation gesucht, aber ich kann immer noch nicht tun. Kann mir jemand helfen?

Antwort

2

Je nachdem, wie oft Ihre App diese Abfrage durchführt und wie viel Wert auf Leistung gelegt wird, starte ich mit wenig Aufwand, aber am wenigsten skalierbar, aber am skalierbarsten.

  1. Scan-Tabelle Filter und Projektion mit Ausdrücken - so Dynamo Scherben auf Ihre Daten-Partition Schlüssel und hält keine Indizes, es sei denn konfiguriert. Die einzige Möglichkeit, eine umfassende Liste aller Moderatoren ohne zusätzliche Tabellenkonfiguration zu erhalten, besteht darin, einen vollständigen Tabellenscan durchzuführen, der eine Menge IOPS verbraucht, aber wenn dies nur gelegentlich der Fall ist, ist dies in Ordnung. Sie können eine "filter expression" hinzufügen, um dynamo nur die Ergebnisse zurückzugeben, wo "user_type" = "Moderator", aber im Backend-Dynamo noch die gesamte DB scannt, macht es den Prozess ein bisschen schneller als die Zeit für die Übertragung der Ergebnisse ist weniger, aber es verbraucht die gleichen IOPS .. Sie können ein wenig weiter gehen und einen "Projektionsausdruck" verwenden, um nur das Feld "user_name" aus jeder Zeile zu filtern. (Dies kann hilfreich sein, wenn Sie mit großen Objekten zu tun haben. Dies verringert nicht die Menge an IOPS, reduziert aber unnötige Daten, die an Sie zurückgegeben werden. Diese Methode wird jedoch nicht gut skalieren, selbst wenn nur 2 Moderatoren vorhanden sind. ..Je mehr Benutzer in Ihrer Datenbank vorhanden sind, desto langsamer wird es.

  2. hinzufügen Globale Sekundärindex dies der Mittelweg ist, aber es kostet auch, wie Sie die Bereitstellung genug IOPS für den Index müssen mitzuhalten, aber hier sind die Dinge etwas mehr kontrollierbaren. Sie können eine andere Ansicht Ihrer Tabelle haben, mit einem anderen Partitionsschlüssel, aber beachten Sie, dass Sie auch für Ihre Indizes a partition key that hashes und im Grunde eine andere Tabelle benötigen. "user_type" hasst nicht gut, was Sie stattdessen tun können, ist ein Feld namens "moderator_name", das den gleichen Wert wie "user_name" hat, aber nur für Benutzer, die Moderatoren sind. Als nächstes erstellen Sie einen sekundären Index für dieses Feld und nur Moderatoren existieren in diesem Index. Sie können diesen Index dann scannen, um Ihre Moderatorliste zu erhalten, und er wird keine IOPS in der Haupttabelle konsumieren. Dies mag ein bisschen hacky scheinen, aber mit Dynamo ist es nicht wie SQL wo, wenn Sie eine gute Tabellenstruktur erstellen, die jede Abfrage verarbeiten kann, müssen Sie Ihre Dynamo-Tabellen speziell auf die Art von Lese-und Schreibvorgängen, die Sie erwarten, zu erfüllen Dies führt zur nächsten Option

  3. einen separaten „Moderatoren“ Create table diese mehr Arbeit zu beginnen, aber wenn Sie wollen, Moderator bestimmte Funktionen zu Ihrer Website sein vermutlich die bessere Art und Weise hinzuzufügen. Wenn Sie dies tun, empfehle ich, keinen "user_type" in Ihrer Haupttabelle zu haben und stattdessen nur diese Tabelle abzufragen und wenn der Benutzer darin existiert, sind sie ein Moderator. Der Grund dafür ist, dass ohne SQL-Transaktionen, die Schreibvorgänge kombinieren, das Feld "user_type" und die Tabelle "Moderators" wahrscheinlich inkonsistent werden.

  4. Verwenden Dynamo Streams Ihre Daten in eine SQL-Datenbank exportieren während Dynamo seiner für viele Anwendungsfälle groß ist keine SQL DB und Opfer vieler schöner und convient SQL-Funktionen für Leistung und scalabiility .. Auch hier könnte es Sinnvoll ist es, dass Ihre Website Dynamo für Geschwindigkeit verwendet und dann für die Erstellung gezielter E-Mail-Kampagnen dieselben Daten in einer SQL-Datenbank enthält. So können Sie komplexe Abfragen zum Erstellen von E-Mail-Kampagnen für eine bestimmte Untergruppe Ihrer Nutzer ausführen.

In verschiedenen Situationen, die ich alle vier Methoden verwendet haben, was betont werden muss, ist „... auf Ihren Anwendungsfall abhängig ...“

2

Sie können einen globalen sekundären Index mit user_type als Primärschlüssel erstellen. Dann Abfrage aus dem Index.

+0

das nicht tun Sie ... Wenn Sie nur ein paar "Benutzertypen" haben, bedeutet dies, dass Ihr sekundärer Index sich schrecklich teilen wird und nicht mit Ihrem Haupttisch mithalten kann. – Nath

+0

@Nath Sie haben einen Punkt. Was wäre deine Empfehlung? – Ashan

+0

Ich habe eine Antwort hinzugefügt – Nath

4

DynamoDB ist eine NoSQL-Datenbank. Der Unterschied zwischen NoSQL-Datenbanken und traditionellen relationalen Datenbanken (d. H. SQL) besteht darin, dass Sie eine viel schnellere Leistung erzielen, was jedoch zu Lasten Ihrer Flexibilität beim Ausführen komplexer Abfragen geht. Wenn Sie komplexe Abfragen für Ihre Daten ausführen müssen, sollten Sie DynamoDB nicht verwenden, da dies nicht das richtige Tool für Ihre Anforderungen ist.

In DynamoDB können Sie nur Abfragen über Ihre Schlüsselattribute ausführen. Andernfalls müssen Sie einen Scan ausführen, der die gesamte Tabelle zurückgibt, und Sie können dann mit Ihren Daten machen, was Sie wollen, z. B. das Ergebnis filtern.

Jede Tabelle in DynamoDB hat normalerweise mindestens einen Schlüssel, dh den Primärschlüssel, der auch als Hash-Schlüssel oder Partitionsschlüssel bezeichnet wird. Sie könnten aber auch einen Bereichsschlüssel haben, der auch als Sortierschlüssel bezeichnet wird. Wenn in Ihrem Beispiel UserType ein Sortierschlüssel ist, gibt DynamoDB nach dem Ausführen der Abfrage alle Zeilen von allen Partitionen zurück, in denen UserType gleich "Moderator" ist.

Sie könnten aber auch sekundäre Indizes für Ihre Tabelle definieren. Sekundäre Schlüssel können entweder globale sekundäre oder lokale sekundäre Schlüssel sein. Dies gibt Ihnen mehr Flexibilität beim Ausführen von Abfragen. Siehe DynamoDB Dokumentation für weitere Details:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html

Zusammenfassung: wenn Sie keine Kontrolle über die Gestaltung Ihrer DynamoDB Tisch haben, sind Sie wahrscheinlich mit nur läuft ein Scan fest. Andernfalls sollten Sie Ihre Tabellenindizes und Schlüssel neu entwerfen, um Ihren Anforderungen gerecht zu werden.