1

我对 DynamoDB 比较陌生,我们正在为我们的一个应用程序设计一个自由格式的搜索 GUI。我们使用的主要数据存储是传统的关系数据库,我们计划使用 DynamoDB 作为数据库顶部的持久“缓存”层,仅用于搜索。

在我们的例子中,我们有 3 个键来确定客户。

我们将客户存储为上述 3 个 ID 的组合,如下所示:

  1. billingAccountNumber + customerId
  2. billingAccountNumber + InstanceId
  3. 客户ID
  4. 实例 ID

DynamoDB 中的每个项目都代表在特定时间发生在客户身上的事件。

在 DynamoDB 中设计这种模式的最佳方法是什么。查询将类似于

  1. 一段时间内某些 billingAccountNumber 的事件。
  2. 一段时间内特定客户 ID 的事件
  3. 一段时间内某个 instanceId 的事件。

等等

目前,我使用 BillingAccountNumber 作为分区键,因为这将平均分配负载,并使用时间戳作为排序键,以便我们可以获得给定范围的结果。

我正在讨论是否可以使用 customerId 或 instanceId 作为排序键,并使用时间戳作为过滤器,以便我可以在时间戳上使用 filterExpression 进行查询。

就性能和成本而言,哪种方式更有效?

4

1 回答 1

0

我正在讨论是否可以使用 customerId 或 instanceId 作为排序键,并使用时间戳作为过滤器,以便我可以在时间戳上使用 filterExpression 进行查询。

排序键是关于排序的。你customerId有排序的意思吗?我猜不是,大多数时候它们都适合分区键。对于instanceId.

相反,timestamp非常适合一个Sort Key。我强烈建议你这样使用它。这是非常有效的。

在 filterExpression 中使用timestamp不是一个好主意,因为您的查询将进行扫描然后应用过滤器。在一张巨大的桌子上,这正是不应该做的事情

请参阅下面的建议。


您的表的键必须为每个项目提供唯一性。如果billingAccountNumber完全识别该行,那就太好了。如果它没有在排序键中放置一些东西以确保唯一性。

为了回答您需要全局二级索引 (GSI) 的查询:

  1. 一段时间内特定 billingAccountNumber 的事件 • PK:billingAccountNumber,SK:时间戳
  2. 一段时间内特定客户 ID 的事件 • PK:客户 ID,SK:时间戳
  3. 特定 instanceId 一段时间内的事件 • PK:instanceId,SK:时间戳

使用如下查询:“#customerId = :customerId AND #timestamp IS BETWEEN :ts0 AND :ts1” 使用查询。

于 2018-10-13T00:12:00.130 回答