2012-04-19 20 views
8

Ich habe eine Anwendung gebaut und hat derzeit eine ziemlich Standard-Benutzertabelle, wie so:DynamoDB und Benutzer-Login-Tabelle

int id, varchar E-Mail, varchar Passwort

Wenn ich dies zu wechseln war DynamoDB wie würde ich dann diese Tabelle erstellen?

Wenn ich einen Hash-Schlüssel mit der E-Mail-Adresse verwende, dann könnte ich nicht die Möglichkeit bieten, Ihre E-Mail zu aktualisieren. Wenn ich einen Hash zum Speichern der ID verwenden würde, müsste ich einen Scan verwenden das ist teuer und durch eine 1Mb Grenze beschränkt.

Bitte um Rat fragen? Danke, Mark

+0

Dies scheint ein Duplikat von http://stackoverflow.com/q/12920884/268898 zu sein –

Antwort

5

Sie sagen, dass es teuer wäre, ID als Hash zu verwenden, weil Sie nach dem E-Mail-Feld filtern müssen? Wenn Sie Ihre Abfragen nach einer Nicht-Schlüsselspalte filtern müssen, endet die Erstellung eines Indexes oft damit.

DynamoDB hat keine eingebaute in secundary Index, ist aber ganz einfach Ihre eigene Lösung zu implementieren.

Die Haupttabelle ID als Hash, wie Sie sagten, und eine differente Tabelle würde dienen als Index verwenden könnte, könnte es sein:

varchar email, int id 

Sein E-Mail die Raute-Taste für die Sekundärtabelle. Wenn es möglich ist, mehrere Benutzer mit der gleichen E-Mail zu verwenden, können Sie ID als Bereich verwenden, um die Dinge einfacher zu machen, ansonsten würde eine einfache Spalte passen.

+1

Es ist wahr, dass Sie auf diese Weise Ihren eigenen sekundären Index erstellen können, aber bedenken Sie, dass ** Ihr Code dafür verantwortlich ist Halten Sie es synchron mit der Haupttabelle **. Außerdem sind Operationen zum Aktualisieren der Tabelle und der Indextabelle nicht atomar. Das kann oder kann kein Problem sein, abhängig davon, wie parallel Ihre Zugriffsmuster sind. – bkirkbri

+4

DynamoDB hat jetzt globale sekundäre Indizes, die dafür verwendet werden können (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html) –

+0

@JeffWalkerCodeRanger Ich sehe nicht, wie GSIs dazu beitragen können, dies zu lösen . Können Sie erklären? – rob

1

Eine andere Tabelle für die Indexierung führt zu einer hohen Wartung. Ich stieß auf ein redundantes Modell von meinem Ex-CTO.

für Ihre Tabelle: USER

RDBMS:

id, E-Mail-Passwort

1, senthil3569 @ stack.com, fragt

DynamoDB:

K EY, id, E-Mail, Passwort

1, 1, [email protected], fragt

senthil3569 @ stack.com, 1, [email protected], fragt

Statt Zum Speichern eines Datensatzes speichern Sie redundant, um nicht indizierte Spalten abzurufen.

Hoffe die Lösung ist klar.

+2

Wie erfordert diese Lösung weniger Wartung als die mit Sekundärtisch? Sie haben wieder 2 Datensätze und können nicht in einer Transaktion aktualisiert werden, auch wenn sie sich in derselben Tabelle befinden. – ivant