【问题标题】:Query dynamoDB by date range按日期范围查询 dynamoDB
【发布时间】:2017-11-18 11:59:28
【问题描述】:

我正在开发一个允许用户阅读书籍的应用程序。我正在使用 DynamoDB 存储用户阅读的书籍的详细信息,并且我计划使用存储在 DynamoDB 中的数据来计算统计数据,例如热门书籍、作者等。

我当前的架构如下所示:

user_id | timestamp | book_id | author_id 

user_id 是分区键,timestamp 是排序键。

我遇到的问题是,使用此架构我只能查询 单个用户(分区键)已阅读的书籍的详细信息。这是对我的要求之一。

另一个要求是查询在某个日期范围内创建的所有记录,例如:过去7天创建的记录。使用此架构,我无法运行此查询。

我已经研究了很多其他选项,但还没有找到一种方法来创建允许我运行两个查询的架构。

  • 检索单个用户阅读的书籍记录(可以)。
  • 检索所有用户在过去 x 天阅读的书籍记录(无法做到)。

我不想运行扫描,因为它会很昂贵,我研究了使用 GSI 作为时间戳的选项,但它需要我指定一个哈希键,因此我无法查询在 2 之间创建的所有记录日期。

【问题讨论】:

  • 您是否设法找到了一个好的解决方案。因为我有完全相同的情况。除了扫描之外,您还发现了什么?

标签: amazon-dynamodb


【解决方案1】:

一个简单的解决方案是创建一个 GSI,其具有跨所有书籍的恒定哈希键和时间戳作为范围键。这将允许您执行您的查询类型。

这种方法的问题在于它很可能成为扩展瓶颈,因为相同的哈希键意味着相同的节点。解决此问题的一种解决方法是进行分片:创建一组哈希键(例如:从 1 到 10)并将该组中的随机键分配给每本书。然后,当您进行查询时,您将需要进行 10 次查询并合并结果。您甚至可以使这个集合大小动态化,以便它随您的数据缩放。

我还建议针对此用例研究其他工具(不是 DynamoDB),因为 DDB 不是数据分析的最佳工具。例如,您可以将 DynamoDB 数据输入 CloudSearch 或 ElasticSearch 并在那里进行分析。

【讨论】:

  • 创建一组哈希键不是一个选项,因为如果 2 个用户在完全相同的时间阅读一本书,时间戳的值将是相同的,并且如果两个记录以相同的哈希结束,它不会保存。正如您所提到的,我也开始相信 dynamodb 不是最适合这个用例。
  • 如果您在每个时间戳的末尾附加一定长度的随机噪声,则可以轻松避免这种边缘情况。
【解决方案2】:

一个解决方案可能是使用 GSI 并包括另外两列,当您摄取记录时,请摄取日期作为主键,例如 2017-07-02 和时间戳作为范围键 04:22:33:000。

为检查点维护一张表,其中包含表的进程名称和时间戳,每次从表中读取时,您都可以更新检查点表以获取增量数据。如果您想获取过去 7 天的数据更改时间戳到过去 7 日期并获取过去 7 天和当前时间之间的数据。

您可以通过将日期作为分区传递并在关键字之间使用作为范围条件的时间戳来使用查询规范。

您将根据检查点表和当前日期计算日期差异,因此您每天都会获得数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多