DynamoDB 日历/事件类结构的推荐架构

gun*_*goo 6 amazon-dynamodb

我对 DynamoDB 设计很陌生,并试图为我的应用程序获取正确的架构。在这个应用程序中,不同的用户将输入有关他们一天的各种属性。例如“用户 X,3 月 1 日 12:00-2:00,累了”。给定时间可能有多个条目,或重叠时间(例如,12-2 累了,12-1 吃午饭)。

我需要根据用户和时间范围进行查询。常见查询:

  • 给我时间 t1 和 t2 之间用户 X 的所有“动作”
  • 给我用户 X 的操作 Z 的所有开始时间

我最初的想法是分区键将是开始时间的用户 ID 和范围键,但由于重复的开始时间而无法正常工作,对吗?

第二个想法:

  • 用户 ID - 分区键
  • 开始时间 - RangeKey
  • Action - 该开始时间的所有操作的 JSON 文档

    [{动作:“午餐”,结束时间:“下午1点”},{动作:累了,结束时间:“下午2点”}]

关于正确模式的任何建议?

Boj*_*ski 2

这确实没有一个解决方案。您将需要根据您的用例评估多个选项,您拥有多少数据/您查询的频率以及通过哪些字段等。

但一个好的解决方案是像这样对架构进行分区。

  • 生成的 UUID 作为分区键
  • 用户身份
  • 开始时间(unix 纪元时间或 ISO8601 时间格式)

优点

  • 可以处理多个时区
  • 可以轻松查询用户ID和开始日期(您将需要带有主键用户ID和排序键开始时间的二级索引)
  • 由于随机生成的主键,数据在 dynamoDB 分区上的分布更加均匀,热键更少。

缺点

  • 每个项目的更多数据(由于 UUID)(+16 字节)
  • 新二级索引的额外成本,注意扫描表中的数据通常比拥有二级索引要昂贵得多。

这与您最初的想法非常接近,为了获得更精确的答案,我们需要更多有关您计划进行多少次写入和读取以及您需要哪种查询的信息。