2017-02-28 84 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数据类型