【发布时间】:2020-02-27 12:08:48
【问题描述】:
如何选择分区键,以便在给定时间段内有效地查询我的所有文档?
背景:
我正在使用 Azure CosmosDB 为聊天应用程序构建分析工具。我有一个单独的容器来存储传入和传出的消息。典型的Message 文档如下所示:
{
"version": "v1",
"partition_key": "user_id",
"timestamp": "2020-01-30 14:02:32.402+00:00",
"type": "incoming_message",
"message": "hi there",
"sender": "sender_id",
"receiver": "receiver_id",
}
我已考虑将以下选项作为我的分区键:
- User id:使用这种方法,我可以轻松地按用户查询所有消息。但是,基于时间的过滤必须是跨分区查询,并且 RU 成本会很高,尤其是在容器中有数千个文档的情况下。
- 日期特定值:根据this,我可以使用日期和随机数作为分区键(例如:2018-08-09.1、2018-08-09.2 等) .但是,使用这种方法,我将不得不将数百个分区键传递到 in 子句 以便运行大时间间隔的查询(例如:过去 6 个月)。
对于选择更好的分区键以支持按时间过滤文档的单分区查询,您有什么建议吗?
【问题讨论】:
-
时间戳是查询中唯一的过滤器吗?此查询中是否没有其他值将使用?
-
嗨@MarkBrown,我还有其他疑问(例如:获取特定用户的所有消息)。对于其他查询,我将重复的消息文档存储在由用户 ID 分区的不同容器中。
标签: sql azure-cosmosdb partitioning database-partitioning azure-cosmosdb-sqlapi