DynamoDB:如何存储项目列表

时间:2017-02-28 09:38:37

标签: database amazon-web-services amazon-dynamodb nosql

我想存储一些属于某个父对象的项目列表。

父对象如下:

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

listC 是一个对象列表(如JSON),其中每个对象都可以包含几个字段:

attrX - number
attrY - string
attrZ - string

列表的大小可以变化,从少数元素到hundreads。

我应该如何存储它们?

由于DynamoDB的限制,我担心我不能将此列表保留为父对象的属性。我想将这些列表移到另一个表中。但是,我不确定我是否应该:

  1. 将每个列表的项目保存为单独的记录,
  2. 将列表的项目拆分为多个单独的记录,其中每个数据库记录的项目很少。
  3. 方法(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 个答案:

答案 0 :(得分:7)

实际上,该方法取决于查询访问模式(QAP)

方法1: -

  1. 典型的标准化方法,类似于RDBMS设计。但是,我们需要从NoSQL角度考虑这个问题。 DynamoDB中有无联接。可能您可能需要读取两个表来获取所需的数据。请注意,费用是根据读取容量单位计算的。因此,两个不同的读取将花费你。

  2. 如果项目大小超过,则可以接受此方法 DynamoDB项目大小为400 KB

  3. 您可以编写查询表达式,按属性attrX,attrY和attrZ过滤数据,因为它们存储为普通的标量数据类型属性

  4. 方法2: -

    1. 首选的NoSQL方法,将所有必需的数据保存在一个表中。 不需要加入或额外阅读

    2. 需要考虑项目大小是否超过400 KB

    3. 是否需要编写查询以按属性过滤数据 attrX,attrY和attrZ。请注意,这种方法是ListC 数据存储为Map DynamoDB数据类型的列表。在大多数情况下,DynamoDB不具备查询这样的复杂数据结构的灵活性(即列表数据类型中的映射)

    4.   

      对象列表 - 表示DynamoDB数据库上的Map列表

           

      {X:" 2.8",Y:" nop" } - 是对象。这转换为MAP数据   在DynamoDB数据库上键入。

           

      外部方括号转换为DynamoDB上的LIST数据类型