【问题标题】:DynamoDB record size increasing with timeDynamoDB 记录大小随时间增加
【发布时间】:2018-10-17 04:42:27
【问题描述】:

我在 DynamoDB 中有一个 customer 表,其中包含 namedobzipcodeemail 等基本属性。我想向其中添加另一个属性,该属性将随着时间的推移而不断增加。例如,每次用户单击产品(项目)时,我都想将其添加到记录中,以便在customerId 索引的单个值中获得客户资料的完整快照。因此,我的新属性将被称为 viewedItems 并且将是查看的 itemIds 列表(连同时间戳)。

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

我怎样才能最好地定义我的对象以执行以下操作?

  1. 通过customerId 访问客户的完整资料,包括查看次数。

  2. 客户的访问时间过滤配置文件(如自过去 N 天以来的所有交互),在这种情况下,应按给定时间范围过滤查看的项目。

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

  4. 查询需要高效,因为可以在请求时提取配置文件。

  5. 能够更新单个客户记录(例如,通过批处理作业,在需要时更新每个客户的记录)。

一种方法是创建一个不同的表(例如customer_viewed_items),其中包含哈希键customerId 和范围键timestamp,其值为客户查看的itemId。但这看起来是一个越来越复杂的模式——更不用说访问该项目所涉及的成本的两倍了。如果我必须根据(比如说)“购买”的物品创建另一个属性,那么我需要创建另一个表。所以,我想到的解决方案对我来说似乎并不好。

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

【问题讨论】:

  • 通常,我会说这听起来像是 RDBMS 的工作,但大概你有理由不走那条路。

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


【解决方案1】:

一旦您真的不知道用户将查看多少项目(极端情况 - 用户按顺序多次打开所有项目) - 您不能将此信息存储在单个 dynamodb 记录中。

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

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

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

【讨论】:

  • 如何在不读取缓存、附加并写回缓存的情况下缓存“最后 X”项?在批处理时我不会知道所有最后 X 项。
  • @Nik 你需要读/修改/写回,是的,这就是缓存的工作原理
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 2020-06-23
  • 2019-06-07
  • 2020-02-05
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多