DynamoDB记录大小随时间增加

时间:2018-10-16 20:32:21

标签: amazon-web-services database-design amazon-dynamodb schema

我在DynamoDB中有一个customer表,其基本属性为namedobzipcodeemail等。我想添加另一个属性随着时间的推移,它会不断增加。例如,每次用户单击产品(项目)时,我都希望将其添加到记录中,以便在由customerId索引的单个值中具有客户配置文件的完整快照。因此,我的新属性将称为viewedItems,并将是已查看的itemId列表(以及时间戳)。

但是,鉴于DynamoDB值的大小限制为4KB,随着我不断将点击的产品添加到客户资料中,它会随着时间的推移而超过。

如何最好地定义我的对象以便执行以下操作?

  1. 通过customerId访问客户的完整个人资料,包括视图。

  2. 访问者的访问时间过滤配置文件(就像最近N天以来的所有互动一样),在这种情况下,应按给定的时间范围过滤查看的项目。

  3. viewedItems上使用时间过滤器扫描整个表格。

  4. 查询必须具有高性能,因为可以在请求时将配置文件提取。

  5. 具有更新单个客户记录的能力(例如,通过批处理作业,如果需要,可以更新每个客户的记录)。

一种方法是使用哈希键customer_viewed_items和值范围为customerId的范围键timestamp创建另一个表(例如itemId),客户查看过。但这似乎是一个越来越复杂的架构-更不用说访问该项目所涉及的成本的两倍了。如果我必须基于(例如)“已购买”项目创建另一个属性,则需要创建另一个表。因此,我想到的解决方案对我来说似乎并不好。

如果能帮助您提出更好的方案/方法,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

一旦您真的不知道用户将查看多少个项目(边缘情况-用户连续多次打开所有项目)-您就无法将这些信息存储在单个dynamodb记录中。

唯一的解决方案是规范化数据库并按照您的描述创建单独的表。

现在,下一个问题-如何在这种方案中最小化检索成本?通常,您不需要获取所有所有的项目,可能想要显示其中的一些项目,那么您只需获取最后的X。

您可以在主表客户中缓存此类项目,即-创建字段“ lastXviewedItems”并对其进行更新,因此它仅包含有限数量的项目而没有超出大小限制,当然用于BI分析-您必须将其存储在也是第二张桌子。