DynamoDB分区设计

时间:2018-10-10 15:02:17

标签: amazon-dynamodb dynamodb-queries

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

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

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

  1. billingAccountNumber + customerId
  2. billingAccountNumber + InstanceId
  3. customerId
  4. InstanceId

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

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

  1. 一段时间内某些billingAccountNumber的事件。
  2. 一段时间内某些customerId的事件
  3. 一段时间内某个instanceId的事件。

当前,我正在使用BillingAccountNumber作为分区键,因为这将平均分配负载,并将timestamp作为排序键,以便我们可以得到给定范围的结果。

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

在性能和成本方面哪种方法更有效?

1 个答案:

答案 0 :(得分:0)

  

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

排序键与排序有关。您的customerId有任何排序含义吗?我猜不是,大多数时候它们都适合分区键。 instanceId也是一样。

相反,timestamp非常适合于排序键。我强烈建议您使用它。这非常有效。

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

有关建议,请参见下文。


表的键必须为每个项目提供唯一性。如果billingAccountNumber完全标识了该行,那就太好了。如果未在“排序”键中添加任何内容以确保唯一性。

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

  1. 一段时间内某些billingAccountNumber的事件•PK:billingAccountNumber,SK:时间戳
  2. 一段时间内某些customerId的事件•PK:customerId,SK:时间戳
  3. 一段时间内某个instanceId的事件•PK:instanceId,SK:时间戳

使用类似以下的查询:“ #customerId =:customerId AND #timestamp在:ts0和:ts1之间”播放查询。