Azure Cosmos数据库更新模式

时间:2017-08-03 08:50:12

标签: azure azure-cosmosdb

我最近开始使用Cosmos DB进行项目,我遇到了一些设计问题。来自SQL背景,我知道相关数据应该嵌套在NoSQL DB上的文档中。这确实意味着文档可能变得非常大。

由于不支持部分更新,当您想要更新文档上的单个属性时,要实现的最佳设计模式是什么?

我是否应该阅读整个文档服务器端,更新值并立即写回文档以执行更新?如果文档很大,如果你的所有数据都是嵌套的,那么这似乎是有问题的。

如果我采用制作许多较小文档并根据ID推断关系的方法,我认为这会立即解决读取/写入更新问题,但感觉我反对NoSQL的概念,实质上我是建立关系数据库。

由于

4 个答案:

答案 0 :(得分:4)

锁定和锁定。如果可以进行部分更新,那就是需要发生的事情。使用锁定保持<15ms写入延迟SLA是一个困难的工程问题。

  

如果文档很大,这似乎有问题,如果你的所有数据都是嵌套的,那么这些文档是不可避免的。

定义您的恐惧 - 烧毁请求单元,应用主机内存,入口/出口网络流量?你认为这是一个问题,但你没有说明具体的结果。我不是说你错了或怀疑部分更新方法的效率,我只是说这个论点很薄。

通常你想在NoSQL中JOIN没什么,所以我在最后一段完全和你在一起。

答案 1 :(得分:2)

每当您尝试创建文档时,请尝试考虑这一点:

  • 文档的哪一部分需要单独访问。如果是,则创建引用文档,否则创建嵌入文档。

    如果你想知道该选择什么,我想你应该看一下这个问题,对于MongoDb,但会帮助你Embedded vs Referenced Document

答案 2 :(得分:0)

嵌入或引用是我在NoSQL世界中设计文档结构时遇到的最常见问题。

在嵌入式关系中,子实体已嵌入到父文档中。在引用关系中,单独文档中的子实体和另一文档中的父实体,基本上有两种(或更多)类型的文档。

没有一种关系模式适合所有人。您应采取的方法取决于正在设计的数据的检索和更新。

1.您是否需要检索所有子实体以及父实体?如果是,请使用嵌入式关系。

2.您的用例是否允许单独检索实体?本案例使用关系模式。

我使用过的大多数用例,我都使用了关系模式。例如:社交图(具有关系树的配置文件),邻近点(基于GeoJSON的邻近搜索),分类列表等。

关系模式也更容易更新和维护,因为实体存储在单个文档中。

答案 3 :(得分:0)

请参阅此CosmosDb特定文章:

Data Modeling in CosmosDb