【问题标题】:homogeneous vs heterogeneous in documentdbdocumentdb 中的同质与异构
【发布时间】:2017-07-17 17:45:09
【问题描述】:

我正在使用 Azure DocumentDB,我在 NoSql 方面的所有经验都在 MongoDb 中。我查看了定价模型,成本是每个收藏品。在 MongoDb 中,我会为我正在使用的东西创建 3 个集合:用户、公司和电子邮件。我注意到这种方法每月每次收集的费用为 24 美元。

与我一起工作的人告诉我,我做错了。我应该将所有这三个东西都存储在一个集合中,并带有一个字段来描述数据类型是什么。每个集合都应该按日期或地理区域相关联,以便世界的一个部分有更小的部分可供搜索。 并:

"将不同类型的文档组合成一个集合并添加 一个字段,用于在搜索中将它们分开,如类型字段或 东西”

我从来没有想过在 Mongo 中这样做,因为它会使索引、分片键和其他事情变得难以正确。

对象之间可能没有重叠的字段(例如:电子邮件和公司对象)

我可以这样做,但我似乎找不到任何其他人这样做的例子 - 这向我表明这可能是不正确的。现在,我不需要一个例子,但是有人可以指出我的某个位置,该位置描述了哪个是“正确”的方法吗?或者,如果您确实为所有数据创建了一个集合 - 除了 Azure 的定价模型,这样做的优点/缺点是什么?

有没有关于 DocumentDb 架构设计的好文章?

【问题讨论】:

  • 没有“正确”或“错误”的方式(尽管你的同事告诉你)。话虽如此:人们一直将内容组合到单个集合中,包括使用 MongoDB(不知道为什么您不会想到这一点,或者为什么这会使索引变得更加困难;索引是基于每个属性的)。借助 CosmosDB,您可以优化成本,并允许您在单个事务中访问异构数据。
  • 我不会梦想将入站电子邮件和用户或公司放在一个集合中。我会怎么称呼这个系列? “熔炉”?我的意思是,数据甚至以什么方式相关?电子邮件确实有电子邮件地址,并且可能映射到用户,但这似乎不是一个好的技术。另外,你会如何分片?您将在两个对象的每个字段上都有一个索引。
  • 另外,这个问题更多地与寻找一个好的资源来阅读有关如何设计 DocumentDB 架构的信息 - 显示每个架构的优缺点,而不是专门寻找“X 是正确的答案”跨度>
  • 这就是为什么这个问题是题外话。需要围绕您的特定需求进行良好的讨论,并且可能需要重新思考集合的概念。另外:教程/参考推荐问题是题外话。
  • 把逻辑分区(每个都有自己唯一的分区键)想象成一个表,把集合想象成一个包含多个表/分区的数据库。您越能将查询定位在特定分区,它们就会越快越便宜(跨分区查询会慢很多)。在 SQL Server 中进行分区可能有些困难,Azure 上的数据库的最小大小为 100GB,而在 Cosmos DB 上,逻辑分区的最大大小目前为 10GB。

标签: azure azure-cosmosdb nosql


【解决方案1】:

是的。为了充分利用 CosmosDb,需要将 Collection 视为一个完整的数据库系统,而不是设计为仅保存一种对象的“表”。

Cosmos 中的分片非常简单。您只需指定一个所有文档都将填充的字段,然后选择它作为分区键。如果您只选择一个通用值,例如 keypartitionKey,您可以通过选择适当的值轻松地将入站电子邮件的存储与用户以及其他任何内容分开。

class InboundEmail
{
   public string Key {get; set;} = "EmailsPartition";
   // other properties
}

class User
{
   public string Key {get; set;} = "UsersPartition";
   // other properties
}

我所展示的是仍然只是一个例子。实际上,您的分区键值应该更加动态。重要的是要了解对已知分区的查询非常快。一旦您需要扫描多个分区,您就会看到速度慢得多且成本更高的结果。

因此,在一个摄取大量用户数据的应用中。将单个用户的活动一起保存在一个分区中对于该特定实体可能有意义。

如果您想证明这是使用 CosmosDb 的适当方式,请考虑添加新的 Gremlin Graph API。图本质上是异构的,因为它们包含许多不同的实体和实体类型以及它们之间的关系。 Cosmos 的查询边界位于集合级别,因此如果您尝试将所有实体放在不同的集合中,那么 Graph API 或查询都不会起作用。

编辑: 我在 cmets 中注意到您发表了此声明 And you would have an index on every field in both objects。 CosmosDb 确实自动索引每个文档的每个字段。他们使用一种特殊的专有的基于路径的索引机制,确保 JSON 树的每个路径都有索引。您必须明确选择退出此自动索引功能。

【讨论】:

  • 在说某事“非常简单”时请小心。特别是对于分片(分区)键,这不是非常简单(甚至也不是简单),因为这会对性能产生重大影响。
  • 我不是指您选择分区键值的过程。这无疑是困难的,需要练习和深入理解应用程序的查询模式。我说的是 CosmosDb 中的分片是如何工作的。你选择一把钥匙。然后将整个分片过程从您那里抽象出来。作为开发人员,您实际上不需要做任何事情来实现这一点,因为它完全是 PaaS,与 Mongo非常不同。
  • @DavidMakogon 如果您通过为分区键选择不适当的“值”来削弱您进行高效查询的能力,这与 Cosmos 中的分片方式无关,也不影响 Cosmos 的能力继续高效分片。
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2012-12-20
相关资源
最近更新 更多