我在DynamoDB中有一个customer
表,其基本属性为name
,dob
,zipcode
,email
等。我想添加另一个属性随着时间的推移,它会不断增加。例如,每次用户单击产品(项目)时,我都希望将其添加到记录中,以便在由customerId
索引的单个值中具有客户配置文件的完整快照。因此,我的新属性将称为viewedItems
,并将是已查看的itemId
列表(以及时间戳)。
但是,鉴于DynamoDB值的大小限制为4KB,随着我不断将点击的产品添加到客户资料中,它会随着时间的推移而超过。
如何最好地定义我的对象以便执行以下操作?
通过customerId
访问客户的完整个人资料,包括视图。
访问者的访问时间过滤配置文件(就像最近N天以来的所有互动一样),在这种情况下,应按给定的时间范围过滤查看的项目。
在viewedItems
上使用时间过滤器扫描整个表格。
查询必须具有高性能,因为可以在请求时将配置文件提取。
具有更新单个客户记录的能力(例如,通过批处理作业,如果需要,可以更新每个客户的记录)。
一种方法是使用哈希键customer_viewed_items
和值范围为customerId
的范围键timestamp
创建另一个表(例如itemId
),客户查看过。但这似乎是一个越来越复杂的架构-更不用说访问该项目所涉及的成本的两倍了。如果我必须基于(例如)“已购买”项目创建另一个属性,则需要创建另一个表。因此,我想到的解决方案对我来说似乎并不好。
如果能帮助您提出更好的方案/方法,我们将不胜感激。
答案 0 :(得分:2)
一旦您真的不知道用户将查看多少个项目(边缘情况-用户连续多次打开所有项目)-您就无法将这些信息存储在单个dynamodb记录中。
唯一的解决方案是规范化数据库并按照您的描述创建单独的表。
现在,下一个问题-如何在这种方案中最小化检索成本?通常,您不需要获取所有所有的项目,可能想要显示其中的一些项目,那么您只需获取最后的X。
您可以在主表客户中缓存此类项目,即-创建字段“ lastXviewedItems”并对其进行更新,因此它仅包含有限数量的项目而没有超出大小限制,当然用于BI分析-您必须将其存储在也是第二张桌子。