我想存储一些属于某个父对象的项目列表。
父对象如下:
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):
-------------------------------------
| 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" } ] |
------------------------------------------------------------------------
你会推荐我什么?
答案 0 :(得分:7)
实际上,该方法取决于查询访问模式(QAP)。
方法1: -
典型的标准化方法,类似于RDBMS设计。但是,我们需要从NoSQL角度考虑这个问题。 DynamoDB中有无联接。可能您可能需要读取两个表来获取所需的数据。请注意,费用是根据读取容量单位计算的。因此,两个不同的读取将花费你。
如果项目大小超过,则可以接受此方法 DynamoDB项目大小为400 KB
您可以编写查询表达式,按属性attrX,attrY和attrZ过滤数据,因为它们存储为普通的标量数据类型属性
方法2: -
首选的NoSQL方法,将所有必需的数据保存在一个表中。 不需要加入或额外阅读
需要考虑项目大小是否超过400 KB
是否需要编写查询以按属性过滤数据 attrX,attrY和attrZ。请注意,这种方法是ListC 数据存储为Map DynamoDB数据类型的列表。在大多数情况下,DynamoDB不具备查询这样的复杂数据结构的灵活性(即列表数据类型中的映射)
对象列表 - 表示DynamoDB数据库上的Map列表
{X:" 2.8",Y:" nop" } - 是对象。这转换为MAP数据 在DynamoDB数据库上键入。
外部方括号转换为DynamoDB上的LIST数据类型