DynamoDB:如何存储项目列表

nic*_*icq 12 database amazon-web-services nosql amazon-dynamodb

我想存储一些与某些父对象相关的项目列表.

父对象如下:

user_id - hash key
timestamp - range key
attributeA - String
attributeB - Number
listC - List of objects
Run Code Online (Sandbox Code Playgroud)

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

attrX - number
attrY - string
attrZ - string
Run Code Online (Sandbox Code Playgroud)

列表的大小可以变化,从几个元素到hundreads.

我应该如何存放它们?

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

  1. 将每个列表的项目保存为单独的记录,
  2. 将列表的项拆分为多个单独的记录,其中每个数据库记录的项目很少.

方法(1):

-------------------------------------
| parent_id | attrX | attrY | attrZ |
-------------------------------------
|  178      |  2    | "abc" | "xyz" |
-------------------------------------
|  178      | 2.4   | "klm" | "qwe" |
------------------------------------- 
Run Code Online (Sandbox Code Playgroud)

方法(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" } ] |
------------------------------------------------------------------------ 
Run Code Online (Sandbox Code Playgroud)

你会推荐我什么?

not*_*est 9

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

方法1: -

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

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

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

方法2: -

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

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

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

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

{X:"2.8",Y:"nop"} - 是对象.这转换为DynamoDB数据库上的MAP数据类型.

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