我对DynamoDB还是比较陌生,我们正在为我们的一个应用程序设计一个自由格式的搜索GUI。我们正在使用的主要数据存储是传统的关系数据库,我们计划将DynamoDB用作数据库顶部的持久性“缓存”层,仅用于搜索。
在我们的案例中,我们有3个键来确定客户。
我们将客户存储为上述3个ID的组合,如下所示:
DynamoDB中的每个项目代表某个事件在某个特定时间发生在客户身上。
什么是在DynamoDB中设计此模式的最佳方法。查询将类似于
等
当前,我正在使用BillingAccountNumber作为分区键,因为这将平均分配负载,并将timestamp作为排序键,以便我们可以得到给定范围的结果。
我正在辩论是否可以使用customerId或instanceId作为排序键,并使用时间戳作为过滤器,以便可以在时间戳上使用filterExpression进行查询。
在性能和成本方面哪种方法更有效?
答案 0 :(得分:0)
我正在辩论是否可以使用customerId或instanceId作为排序键,并使用时间戳作为过滤器,以便可以在时间戳上使用filterExpression进行查询。
排序键与排序有关。您的customerId
有任何排序含义吗?我猜不是,大多数时候它们都适合分区键。 instanceId
也是一样。
相反,timestamp
非常适合于排序键。我强烈建议您使用它。这非常有效。
在filterExpression中使用timestamp
并不是一个好主意,因为您的查询将进行扫描,然后应用过滤器。在巨大的桌子上,这正是不要做的事情。
有关建议,请参见下文。
表的键必须为每个项目提供唯一性。如果billingAccountNumber
完全标识了该行,那就太好了。如果未在“排序”键中添加任何内容以确保唯一性。
要回答查询,您需要全局二级索引(GSI):
使用类似以下的查询:“ #customerId =:customerId AND #timestamp在:ts0和:ts1之间”播放查询。