我是使用DocumentDB API的Azure Cosmos DB的新手。我计划对我的数据建模,以便一个文档引用另一个文档。这很简单,如Modeling document data中所述。不过,我也想将相关文件分成不同的集合(这个决定与数据是如何相互关联的partitioned)。Cosmos DB:如何使用DocumentDB API在单独的集合中引用文档
编辑2017/7/24:为了回应一个疑问,为什么我选择使用单独的集合:单独集合的推理主要归结为分区键和读/写优先级。由于需要在集合中的所有文档中都存在某个分区键,因此分离所选分区键不属于的文档是有意义的。在对选项进行了大量权衡之后,我决定使用的分区键是一种可以优化写入速度并在分片间均匀分配数据的分区键 - 但不幸的是,它并不属于我的“元数据”文档。由于元数据和测量数据之间存在着巨大的关系,我选择在测量中使用对元数据的引用,而不是嵌入。而且由于元数据很少(或绝对不会)被附加到每个度量上,所以我认为额外往返DB的费用是一个非常低的问题。
由于引用是未经数据库验证的“薄弱环节”,因此存储附加信息(如集合名称)是否可能并明智?也就是说,我们可以使用一种路径而不是只有一个字符串ID?
Metadata document in collection "Metadata":
{
"id": "metadata1",
...
}
Measurement document in collection "Measurements":
{
"id": "measurement1",
"metadata-id" : "../Metadata/metadata1",
...
}
然后,当我解析我的应用程序/脚本中的数据时,我知道要查询什么集合和文档。最后,我认为还有其他更好的方法可以解决这个问题,我欢迎你的建议(例如下划线,而不是斜线;使用符号表示集合,例如$元数据等)。或者,我使用关系跨越集合的代码味道?
谢谢!
编辑:对于downvoter,你能解释你的推理吗?我的问题是不明白的,不清楚的,还是没有用的?为什么?
你能否详细说明你的分区是什么让你认为需要另一个集合是必要的?我一直在广泛使用宇宙一段时间,从来没有发现这种情况。 (不是downvoter btw它的一个公平的问题)只是好奇你的推理。 –
@JesseCarter我更新了我的问题,阐述了我使用单独集合的理由。我很好奇你如何能够在优化读/写速度的同时使用单个分区密钥来实现异构(假设)数据? – brudert
请参阅我提供的关于如何使用单个集合完成要查找的内容的答案。你正在考虑一种危险和不必要的方式,即每种类型需要一个集合。情况并非如此,因为集合是通用存储而不是实体特定的表。考虑到开始添加第三种或第四种实体类型时的成本差异,并且必须为每增加一个新的实体类型付费。 –