【发布时间】:2018-03-27 15:08:06
【问题描述】:
我已将我的一个 Cosmos DB 的分区键设置为 /partition。
例如:我们有一个包含订阅者列表的Chat 文档,然后我们有一个包含文本、对作者的引用和一些其他属性的ChatMessages。两个文档都有一个 partition 属性,其中包含“聊天”类型和聊天 ID。
聊天示例:
{
"id" : "955f3eca-d28d-4f83-976a-f5ff26d0cf2c",
"name" : "SO questions",
"isChat" : true,
"partition" : "chat_955f3eca-d28d-4f83-976a-f5ff26d0cf2c",
"subscribers" : [
...
]
}
然后我们有这样的消息文档:
{
"id" : "4d1c7b8c-bf89-47e0-83e1-a8cf0d71ce5a",
"authorId" : "some guid",
"isMessage" : true,
"partition" : "chat_955f3eca-d28d-4f83-976a-f5ff26d0cf2c",
"text" : "What should I do?"
}
现在返回特定聊天的所有消息非常方便,我只需要使用属性isMessage = true查询分区chat_955f3eca-d28d-4f83-976a-f5ff26d0cf2c的所有文档。一切都好...
但如果我现在想通过 id 查询我的数据库以获取特定消息,我通常只知道 id,但不知道分区,因此必须运行 slow crosspartition 查询。这让我想到了一个问题,如果我不应该将 partitionKey 添加到消息 id 中,这样我就可以在查询 db 时拆分 id 以便更快地查找。我看到文档的 _rid 属性看起来像是 db 的 id 和集合的 id 的组合,然后是文档特定的 id。我的意思是(简化):
Chat.Id = "abc"
Chat.Partition = "chat_abc" //[type]_[chatId]
Message.Id = "chat_abc|123" //[Chat.Partition]|[Message.Id]
Message.Partition = chat_abc //[Chat.Partition]
假设我现在想通过id 获取Message 文档,我只需将id 拆分为| 符号,然后使用id 的第一部分查询文档为分区和完整的id作为key。
这有意义吗?有没有更好的方法来做到这一点?我是否应该始终传递文档的partitionKey,而不仅仅是id?我应该只使用_rid 属性吗?
非常感谢任何经验!
更新
我找到了以下答案here:
一些应用程序将分区键编码为 ID 的一部分,例如 分区键是客户 ID,ID = "customer_id.order_id", 这样您就可以从 ID 值中提取分区键。
我已经通过电子邮件进一步询问了 cosmos 团队这是否是推荐的模式,并发布了答案,以防万一。
【问题讨论】:
标签: azure-cosmosdb database-partitioning