2012-12-30 3 views
8

Neu in DynamoDB.DynamoDB + Werte als Elemente oder JSON speichern

Ich erstelle eine Tabelle mit Primärschlüssel 'UserID', Composite Key 'DateTime' und dann habe ich folgendes als Wert (Hinweis: Ich brauche keine Details in den unten stehenden Daten abzufragen - einfach schreiben und lesen sie es):

UserID1 
UserID2 
Message 
DateTime 

Fragen:

  1. gibt es keinen Vorteil in diese vier Werte als separate Elemente speichern oder als ein JSON-String?
  2. UserID1 und Datetime im gespeicherten Wert bilden auch den Primary/Composite Key - gehe ich davon aus, dass es keinen Sinn hat, diese in den Daten/Werten zu speichern, da ich auf diese von den zurückgegebenen Keys zugreifen kann?

Antwort

3
  1. Ich bin von „separaten Elementen“ vorausgesetzt, Sie „getrennte Attribute“ bedeuten, in diesem Fall ist es nicht wirklich wichtig. Ich würde sie wahrscheinlich als separate Attribute speichern, da es möglich ist, eine Teilmenge von Attributen abzurufen (obwohl Sie sagen, dass Sie diese Funktionalität jetzt nicht benötigen). Wenn Sie in der Zukunft sehen möchten, wie viele Nachrichten ein Benutzer gesendet hat, aber nicht auf das langsame Netzwerk warten wollte, um viele KB Nachrichten zurückzugeben, wären separate Attribute hilfreich.

  2. Ja.

+0

einfach den Kontext Terminologie folgen: eine Teilmenge der Attribute abrufen = Projection – Alireza

6

So Ihre Optionen sind:

Hash Key | Range Key | Attributes 
---------------------------------- 
user id | utc time | json data 
---------------------------------- 
user123 | 1357306017 | {UserID1:0, UserID2:0, Message:"", DateTime:0} 

oder

Hash Key | Range Key | Attributes 
-------------------------------------------------------------- 
user id | utc time | UserID1 | UserID2 | Message | DateTime 
-------------------------------------------------------------- 
user123 | 1357306017 | 0  | 0  | ""  | 0 

Beide tragfähige Optionen sind, und die Wahl kommt darauf an, wie Sie die Daten zu lesen, wenn Sie eine haben Attribut für jedes Element, dann können Sie diese Attribute einzeln anfordern.

Wir neigen dazu, basierend auf unseren Nutzungsmustern einen hybriden Ansatz zu verwenden. Elemente, auf die wir individuell zugreifen müssen, erhalten ihre eigenen Attribute. Elemente, auf die wir immer nur mit einer Sammlung anderer Elemente zugreifen wollen, erhalten alle ein einzelnes Attribut und werden dann als einzelnes Blob mit JSON-String oder base64-codierten Daten gespeichert.

Für Teil zwei haben Sie zwar Recht, Sie müssen Benutzer-ID und Datum nicht erneut als Teil der Attribute speichern, da es sich um die Hash- und Bereichsschlüssel handelt, die bei einer Anforderung zurückgegeben werden.

6
  1. Sie die Einträge in der JSON Blob als separate Attributwerte speichern können. Bevor DynamoDB die JSON-Dokumentunterstützung eingeführt hat, waren Ihre Optionen auf separate Attribute oder ein "String" -Attribut beschränkt, in dem Sie die JSON-Repräsentation dieser Attribute speichern. Jetzt, da Amazon die Unterstützung für JSON-Dokumente in DynamoDB eingeführt hat, können Sie diese Art von detaillierten Attributzuordnungen direkt in Elementen speichern. Mit Hilfe der das neue Java Document SDK für DynamoDB, das Hinzufügen JSON-Werte verwendet die Item.withJSON() -Methode wie folgt aus:

    DynamoDB dynamodb = new DynamoDB(client); 
    Table messagesTable = dynamodb.getTable("MESSAGES"); 
    
    // create the item 
    Item item = new Item().withString("UserID", "user123").withString("DateTime", "1357306017") 
        .withJSON("Details", "{ \"UserID1\": 0, \"UserID2\": 0, \"Message\": \"my message\", \"DateTime\": 0}"); 
    
    // put the item 
    messagesTable.putItem(item); 
    
    // get the item 
    Item itemGet = messagesTable.getItem(new KeyAttribute("UserID", "user123"), new KeyAttribute("DateTime", "1357306017")); 
    
  2. ich mit Pooky einig, dass es keine Notwendigkeit gibt, die Hash + Bereich Schlüssel zu duplizieren in die Detailkarte.Sie benötigen beide, um GetItem zu verwenden, um das Element zu erhalten.

+1

Haben Sie Beispiel oder Codeausschnitt für Javascript, wie man JSON Dokument bekannt gibt. Außerdem kann ich auf der aws-Website kein Dokument über Javascript mit JSON finden. Ich habe von dieser neuen Funktion gehört, die vor einer Woche veröffentlicht wurde. – riseres

2

Sie können Ihre Daten immer als JSON speichern und problemlos abfragen.

{ 
    sequence: "number", 
    UserID1: "id", 
    UserID2: "id", 
    Message: "message text", 
    DateTime: "1234567890" 
} 

Ich gehe davon aus, dass Ihr Zweck eine Art Messaging-System ist. In diesem Fall kann die UserID1 & UserID2 nicht der Hash-Schlüssel sein, weil Sie offensichtlich doppelte Einträge haben (zum Beispiel UserID1 hat mehr als eine Nachricht).

Sie können einen Index haben, der eine Sitzungs-ID von sort ist.

Sie können dann einen sekundären Index für den Teil [DateTime] der Struktur erstellen, sodass Sie Nachrichten für diese Sitzung abfragen können, die älter als ein bestimmter Zeitstempel sind.

0

Mit DynamoMapper Sie in Java tun könnte:

@DynamoDBTable(tableName = "myClass") 
public class MyClass { 

    @DynamoDBHashKey(attributeName = "id") 
    private String id; 

    @DynamoDBRangeKey(attributeName = "rangeKey") 
    private long rangeKey; 

    @DynamoDBTypeConvertedJson 
    private Content content; 

} 

Und die Content-Klasse sein könnte:

public class Content { 

    @JsonProperty 
    private List<Integer> integers = new ArrayList(); 

    @JsonProperty 
    private List<String> strings = new ArrayList(); 

}