2017-02-28 70 views
2

我想存儲項目列表到一些父對象。DynamoDB:如何存儲項目列表

父對象將會像如下:

user_id - hash key 
timestamp - range key 
attributeA - String 
attributeB - Number 
listC - List of objects 

listC是對象(如JSON),其中,每個對象可以有幾個字段的列表:

attrX - number 
attrY - string 
attrZ - string 

的大小該列表可以變化,從少數元素到追蹤。

我應該如何儲存它們?

由於DynamoDB的限制,恐怕我無法將此列表作爲父對象的屬性。我想把這些清單移到另一張桌子上。不過,我不知道我應該:

  1. 保持每個列表的項目作爲一個單獨的記錄,
  2. 分割清單的項目很多單獨的記錄,其中每個數據庫記錄有幾個項目。

方法(1):

------------------------------------- 
| parent_id | attrX | attrY | attrZ | 
------------------------------------- 
| 178  | 2 | "abc" | "xyz" | 
------------------------------------- 
| 178  | 2.4 | "klm" | "qwe" | 
------------------------------------- 

方法(2):

------------------------------------------------------------------------ 
| parent_id | Chunk | ListC           | 
------------------------------------------------------------------------ 
| 178  | 1 | [{ X: "2", Y: "abc" }, { X: "2.4", Y: "klm" } ] | 
------------------------------------------------------------------------- 
| 178  | 2 | [{ X: "2.8", Y: "nop" }, { X: "3.2", Y: "qrs" } ] | 
------------------------------------------------------------------------ 

你有什麼建議嗎?

回答

1

實際上,該方法取決於查詢訪問模式(QAP)

方法1: -

  1. 典型的,規範化的方法類似於RDBMS設計。但是,我們需要從NoSQL的角度來思考。 DynamoDB中有沒有加入。可能,您可能需要閱讀兩個表才能獲取所需的數據。請注意,成本是根據讀取容量單位計算的。所以,這兩個不同的讀取會花費你。

  2. ,如果該項目的大小超過了 DynamoDB項大小400 KB

    這種方法可能是可接受的
  3. 可以編寫查詢表達式進行過濾屬性attrX,attrY和attrZ數據,因爲它們被存儲爲正常標數據類型屬性

方法2: -

  • 首選的NoSQL方法可將所有必需的數據保存在一張表中。 加入或額外的讀取不需要

  • 需要考慮是否需要編寫查詢的屬性 attrX,attrY和attrZ過濾數據的項目大小是否可以超過400 KB

  • 。請注意,在這種方法中,ListC 數據存儲爲Map DynamoDB數據類型列表。在大多數情況下,DynamoDB不具備的靈活性,查詢複雜的數據結構是這樣的(即地圖列表數據類型中)對象的

  • 列表 - 是指地圖列表上DynamoDB數據庫

    {X:「2.8」,Y:「nop」} - 是對象。這轉換爲DynamoDB數據庫上的MAP數據 類型。

    外部方括號轉換爲DynamoDB上的LIST數據類型

    相關問題