我想知道在以下场景中分区 DocumentDB 集合中的 partitionkey :
DocumentDB
partitionkey
集合中的每个文档 C 包含2个字段: a 和 b
C
a
b
必须使用字段 a 和 b 作为查找条件快速查找文档 C (在sql查询 where 子句中使用它们) .
where
我认为有必要以某种方式指定两个字段来完成目标2.有没有什么方法可以指定字段 a 和 b 作为我的集合的分区键?
如果没有,有没有替代解决方案?
有两种方法可以做到这一点:
选择 a 或 b (接收方)作为分区键 . 由于DocumentDB会自动为所有属性编制索引,因此将针对单个分区执行查询 .
创建一个新属性,该属性是 a 和 b 的连接值(例如 from:a@b.com;to:c@d.com 并将其用作分区键 . 然后在执行查询时,在查询中包含新属性作为过滤器 .
from:a@b.com;to:c@d.com
第二种方法比 a 和 b 的查询更有效 . 如果您只有 a 或两者( a 和 b )混合查询,那么第一种方法更好,因为两个查询都将针对单个分区 .
但正如其他人所提到的,无论采用哪种方法,您都会有低延迟的查询响应,或者您甚至选择了不同的分区密钥,如事务ID . 但对于在 a 和 b 上进行过滤的查询工作负载,上述方法将是最佳方法 .
我想你可能在这里混淆了两个概念 - 分区和索引 .
为了支持使用a和b作为标准的快速检索,您需要将这些文档编入索引 . 幸运的是,DocumentDB已经为您编制索引,因此您可以获得快速的性能 . 见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-indexing
分区是一种在多个集合中分割数据(如果有很多数据)的方法,以便处理超过单个集合限制的数据 . 指定分区键时,具有相同键的文档将转到同一个集合 . 见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-partition-data
那么在选择分区键时你应该考虑什么逻辑?根据经验,您希望在查询中出现的文档可以在同一个集合中找到 . 因此,例如,如果您执行大量返回给定userId的所有文档的查询,您可能希望按用户ID进行分区 .
2 回答
有两种方法可以做到这一点:
选择
a
或b
(接收方)作为分区键 . 由于DocumentDB会自动为所有属性编制索引,因此将针对单个分区执行查询 .创建一个新属性,该属性是
a
和b
的连接值(例如from:a@b.com;to:c@d.com
并将其用作分区键 . 然后在执行查询时,在查询中包含新属性作为过滤器 .第二种方法比
a
和b
的查询更有效 . 如果您只有a
或两者(a
和b
)混合查询,那么第一种方法更好,因为两个查询都将针对单个分区 .但正如其他人所提到的,无论采用哪种方法,您都会有低延迟的查询响应,或者您甚至选择了不同的分区密钥,如事务ID . 但对于在
a
和b
上进行过滤的查询工作负载,上述方法将是最佳方法 .我想你可能在这里混淆了两个概念 - 分区和索引 .
为了支持使用a和b作为标准的快速检索,您需要将这些文档编入索引 . 幸运的是,DocumentDB已经为您编制索引,因此您可以获得快速的性能 . 见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-indexing
分区是一种在多个集合中分割数据(如果有很多数据)的方法,以便处理超过单个集合限制的数据 . 指定分区键时,具有相同键的文档将转到同一个集合 . 见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-partition-data
那么在选择分区键时你应该考虑什么逻辑?根据经验,您希望在查询中出现的文档可以在同一个集合中找到 . 因此,例如,如果您执行大量返回给定userId的所有文档的查询,您可能希望按用户ID进行分区 .