2012-12-30 20 views
8

DynamoDB的新功能。DynamoDB +將值作爲項目或JSON存儲

我使用主鍵「UserID」,複合鍵'DateTime'創建一個表,然後我將下面的值作爲值(注意:我不需要查詢以下數據中的任何細節 - 只需寫入和讀它):

UserID1 
UserID2 
Message 
DateTime 

問題:

  1. 是在有存儲這些4個值作爲單獨項目或作爲一個JSON字符串任何優勢?
  2. 存儲值中的用戶ID1和日期時間也組成主/複合鍵 - 我是對的,假設沒有意義將它們存儲在數據/值中,因爲我可以在查詢時通過返回的鍵訪問它?

回答

3
  1. 我被「單獨項目」假設你的意思是「獨立的屬性」,在這種情況下,它並不重要。我可能會將它們作爲單獨的屬性存儲,因爲它可以檢索屬性的子集(儘管您說現在不需要此功能)。在將來,如果您想查看用戶發送了多少條消息,但不想等待緩慢的網絡返回許多KB消息,則擁有單獨的屬性將非常有用。

  2. 是的。

+0

只是跟隨上下文術語:檢索屬性的子集=投影 – Alireza

6

那麼你的選擇是:

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

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

兩者都是可行的選擇,而選擇歸結爲您想如何讀取數據,如果你有一個屬性爲每個項目,那麼你可以單獨請求這些屬性。

我們傾向於使用基於我們的使用模式的混合方法。我們需要單獨訪問的元素都有自己的屬性。我們只想訪問的元素以及其他元素的集合都被賦予單個屬性,然後作爲JSON字符串或base64編碼數據的單個塊存儲。

對於第二部分的確,您是對的,您不需要再次存儲用戶標識和日期時間作爲屬性的一部分,因爲它們是散列和範圍鍵,在您發出請求時會返回。

6
  1. 您可以在條目存儲在JSON BLOB作爲單獨AttributeValues。在DynamoDB引入JSON文檔支持之前,您的選項將被限制爲單獨的屬性,或者存儲這些屬性的JSON表示的一個「String」屬性。現在亞馬遜向DynamoDB引入了JSON文檔支持,您可以直接在項目中存儲這種詳細的屬性映射。使用新的Java SDK文檔爲DynamoDB,將JSON值使用Item.withJSON()方法,像這樣:

    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. 我同意Pooky認爲就沒有必要重複哈希+範圍鍵在細節圖。您需要使用這兩種方法才能使用GetItem來獲取項目。

+1

您是否有JavaScript樣例或代碼片段如何發佈JSON文檔。此外,我無法使用JSON在aws網站中查找有關Javascript的文檔。我聽說一週前剛發佈的這個新功能。 – riseres

2

您可以將您的數據存儲始終作爲JSON和方便地查詢它。

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

我假設你的目的是某種消息系統。 在這種情況下,UserID1 & UserID2不能是哈希鍵,因爲您顯然會有重複的條目(例如UserID1有多條消息)。

你可以有一個索引,它是一個排序的會話ID。

然後,您可以在結構的[DateTime]部分創建二級索引,以便您可以查詢比某個給定時間戳更早的該會話的消息。

0

隨着DynamoMapper你可以在Java中做到這一點:

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

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

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

    @DynamoDBTypeConvertedJson 
    private Content content; 

} 

和內容類可能是:

public class Content { 

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

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

}