Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DocumentDB:如何更好地为更新构建数据结构_C#_Azure Cosmosdb - Fatal编程技术网

C# DocumentDB:如何更好地为更新构建数据结构

C# DocumentDB:如何更好地为更新构建数据结构,c#,azure-cosmosdb,C#,Azure Cosmosdb,例如,我收集了如下文档: { hotField1 : 0, hotField2 : "", coldField1 : 0, ... coldFieldN : "" } 在这个范围内,冷属性只写一次,有时被访问,热属性被写然后相当频繁地访问\更新(但在不同的用例中,它不是相同的子文档或相同对象的部分)。 文档量相当大(100万或更多),热数据的大小至少是冷数据的十倍 由于部分更新仍然是最需要但尚未实现的功能,更新hotField1的唯一方法是: 索取完整文件 更改hotF

例如,我收集了如下文档:

{
   hotField1 : 0,
   hotField2 : "",
   coldField1 : 0,
...
   coldFieldN : ""
}
在这个范围内,冷属性只写一次,有时被访问,热属性被写然后相当频繁地访问\更新(但在不同的用例中,它不是相同的子文档或相同对象的部分)。 文档量相当大(100万或更多),热数据的大小至少是冷数据的十倍

由于部分更新仍然是最需要但尚未实现的功能,更新hotField1的唯一方法是:

  • 索取完整文件
  • 更改hotField1或hotField2
  • 写回整个文件
  • 这在RU方面成本高昂,而且扩展性不太好

    那么问题是如何在DocumentDB中组织此类数据和调用以最小化成本?

    发现的备选方案:

  • 显然最好:检索一个属性;改变更新-还没有
  • 将两个集合分开,使用存储过程从主集合中检索,然后从字典中检索
  • 将hotFields1-2作为子文档
    ({sub:{hf1:0,hf2:“}}})
    并以某种方式仅更新它?(我不确定这是否可能)

  • PS.C#在我们使用的客户端库的标记中。如果缺少smth,则可以改用REST接口。

    基于文档的NoSQL在更改一个或所有属性后替换文档

    就成本而言,它是以每次收集为基础的

    因此,如果您有一个数据库,其中包含两个集合,每个集合的性能层为S1,即每月25美元

    $25 x 2=$50

    如果您需要更好的性能,并将其更改为S2,则将收取以下费用:

    $50+$25=$75

    虽然没有确切的“最佳”答案:

    您的#2选择不适用于存储过程,因为存储过程的作用域是集合

    更新子文档(#3选项)与更新顶级属性没有什么不同-您仍在检索和重新编写文档(子文档只是文档上的另一个属性)

    虽然它可能会减少RU(正如Larry在评论中指出的,您需要进行基准测试),但您可以选择将热属性存储在单独的(较小的)文档(或多个较小的文档)中。属性越少,更新过程中消耗的带宽就越少,索引更新也就越少。然而,由于您现在要检索多个文档(可能跨越多个调用),您可能会发现此活动否定了存储在单个文档中所节省的任何RU


    注意:没有什么可以阻止您将这些单独的文档存储在同一个集合中(这样您就可以使用存储过程解决问题,正如您在#2选项中所建议的那样)。您只需要创建一些类型的属性来帮助您识别不同的文档类型。

    #3现在也不可能。我的第一个建议是使用直截了当的一体式文档方法构建它,并对其进行基准测试。如果不符合snuff,那么如果使用分区集合,则调整分配的吞吐量参数,如果不符合,则转到更高的s级别。如果这还不够,那么考虑一个更复杂的分区设计,基于该领域的“热”。根据我的经验,工程师关于什么会快什么不会快的假设与现实大相径庭。“你需要试验一下。”拉里·麦克切隆,我们已经有了RDBMS的工作系统,所以我们已经收集了一些统计数据。你能详细说明一下,你所说的更复杂的设计是什么意思吗?只是用热场和冷场来分割数据对于构建、维护和培养新的开发人员来说是更多的工作。为什么在你还不知道简单的一体式文档设计是否足够之前就要付出这样的代价呢?这不完全是我想要的,但是我有很好的洞察力。我花了一些时间考虑单独存储文档是否是一个好主意。显然-不。我确信部分更新是有计划的,但这显然不是一件容易的事。首先制作特殊类型的数据-子文档不是很合理吗。因此,它将不是一个普通的JSON{}对象,而是DocDB术语中的小文档(即带有_etag和其他u字段)。我认为并发控制是可能的,因为对于每个用户添加的文档属性,仅部分更新就需要类似于_etag的东西。那么子文档对于CC是有效的。你怎么想?我真的不明白你的后续问题,关于不是一个普通的JSON对象,我也不明白你是如何得出结论,使用单独的文档(一种非常常用的技术)不是一个好主意,但是。。。评论不是供讨论的。