Azure Cosmos DB是多模型的意思是什么?

时间:2017-06-01 10:22:52

标签: azure azure-cosmosdb nosql

查看新的Azure cosmos数据库,我对它的多模型性质感到有些困惑。具体来说,这是否意味着:

a)可以同时查询相同的底层数据库/存储,以便我可以对同一个集合使用gremlin图形查询和mongodb api。

  • 或 -

b)这是否意味着您可以在配置Cosmos DB时选择不同的模型(图形,键值,列,文档),以及从那时起数据的存储方式。

这本小册子听起来像a),但是使用Azure仪表板创建一个宇宙实例,它看起来像b),因为你必须在创建时选择一个模型类型。

此外,文献中提到了柱状数据,但在创建时我没有看到它的选项。

6 个答案:

答案 0 :(得分:16)

Cosmos DB是一个NoSQL数据引擎,是Document DB的演变。当您创建容器("数据库实例")时,为您的用例选择最相关的API,以优化与底层数据存储交互的方式以及数据如何持久保存到该存储中。

因此,根据所选的API,它会将所需的模型(图形,列,键值或文档)投影到底层商店。

您只能对容器使用一个API,由于数据的存储和检索方式,无法使用多个API。 API规定了存储模型 - 图形,键值,列等,但它们都重新映射到引擎盖下的相同技术。

感谢@Jesse Carter在下面的评论,看来你可以混合搭配图和DocumentSQL API。

From the docs:

多模型,多API支持

Azure Cosmos DB本身支持多种数据模型,包括文档,键值,图形和列族。 Cosmos DB数据库引擎的核心内容模型基于原子记录序列(ARS)。原子由一小组原始类型组成,如string,bool和number。记录是由这些类型组成的结构。序列是由原子,记录或序列组成的数组。 数据库引擎可以有效地将不同的数据模型转换和投影到基于ARS的数据模型上。 Cosmos DB的核心数据模型可以从动态类型编程语言本地访问,并且可以像JSON一样公开。

该服务还支持用于数据访问和查询的流行数据库API。 Cosmos DB的数据库引擎目前支持DocumentDB SQL,MongoDB,Azure Tables(预览版)和Gremlin(预览版)。您可以继续使用流行的OSS API构建应用程序,并获得经过实战考验和全面管理的全球分布式数据库服务的所有好处。

答案 1 :(得分:12)

Cosmos DB的核心是一个地理位置分散的数据库,它有自己的Atom-Record-Sequence存储引擎和索引。在该基础架构之上,我们能够实现许多不同类型的存储,从使用我们的SQL API的SQL,到Mongo,到Cassandra,到Gremlin,再到Azure Table存储的实现等等。

每种不同的商店类型都有自己的数据类型(例如编码数字,日期等方式),并以自己的方式在我们的存储和索引层中进行编码。随着时间的推移,我们希望我们的SQL API本身支持大多数这些数据类型。但是现在我们的每个数据库类型都使用自己的编码约定。在Cosmos DB中创建帐户(这是一个组织单位,用户可以拥有多个帐户)时,在帐户中指定数据库的“类型”。因此,您可以拥有一个Table API帐户或一个Mongo帐户,或者拥有什么。

在某些情况下,可以使用API​​ Y访问数据类型为X的帐户。例如,可以使用SQL API与Table API帐户中的表进行通信。但在图表之外,这通常不是一个好主意。现在,我们以特殊格式编码每个API的信息,并且不同的数据类型不会互相说出格式。因此,如果要使用SQL API写入Table API,最终结果很可能是损坏的数据。

例外是图表,我们努力确保所有数据库类型的工作相当合理,我们将来会对此有更多的说法。

因此,如果您确实想要使用多API访问,我们强烈建议您仅在不使用给定帐户的“本机”API时以“只读”模式执行此操作。换句话说,无论如何都要使用来自Table API的SQL API读取,请不要写入起诉SQL API客户端的Table API帐户。

答案 2 :(得分:3)

接受的答案错过了一些观点。

Cosmos DB是一个NoSQL数据库,但它是高度分布式的,我们的存储格式是Atom-Record-Sequence。

为什么重要?我们知道它接受JSON作为输入和输出格式,这并不意味着Cosmos将其数据存储为JSON,它实际上可以是任何格式。这有助于我们推断Cosmos的多模型:根据特定模型执行查询时得到的结果可能是数据的投影或视图。

@JesseCarter已经解释过我们可以互换使用Document API和Graph API。上周Table API公开宣布,可能这个API也没有太大差异。

Spectologic的那些人写了一篇关于Cosmos的Cross-API使用的好文章,并且还指出多模型比化妆品更多的化妆品,唯一真正的例外似乎是Mongo。有趣的部分在“切换门户网站体验”一章中得到了指出。在这里:https://blog.spectologic.com/2017/06/30/digging-into-cosmosdb-storage/

所以也许最后归结为GlobalDocumentDbMongoDb

答案 3 :(得分:2)

对此我也很感兴趣,想从API使用审核角度了解更多信息,并从这些答案中学到了更多的知识。

在进行实验时,看起来事情比原始答案有了进一步的发展,因此增加了现代感。

我能够选择SQL API成功创建一个Cosmos DB帐户,在门户中创建一个文档,然后通过MongoDB API检索该文档。

原始答案表明MongoDB是单数形式,无法与使用其他API创建的数据进行交互。

现在,通过Yaron(https://stackoverflow.com/a/48286729/141022)提示的数据类型差异,是否进行更充分的测试是否会导致文档损坏,以及是否存在存储差异是否会导致性能下降的提示,这仍然有待观察。

出于我的目的,我感兴趣的是审计一个API是否足够,在这种情况下,由于在一个API中创建的数据可以被另一个API检索,因此这还不够,因此我没有进行深入测试。

值得注意的是,ARM模板既不使用GlobalDocumentDB也不使用MongoDB部署,但是如果碰巧有所不同,则从门户导出回ARM模板将导致GlobalDocumentDB。

答案 4 :(得分:1)

如果您对CosmosDB的实现细节感兴趣,则可以阅读很久以前的本白皮书(假定实现没有改变)。 http://www.vldb.org/pvldb/vol8/p1668-shukla.pdf

TLDR:

  • 在底部,CosmosDB将数据存储在ARS中,并以JSON格式公开。
  • 默认情况下,数据库引擎索引所有文档中的所有字段,因此启用了非常灵活的查询。
  • 数据库引擎执行类似于JavaScript的中间语言,桥接数据库公开的低级存储和API。
  • 由于这种桥接,可以添加更多的数据库API以支持不同的查询机制(例如SQL,文档,列式)。

答案 5 :(得分:0)

多模型表示您的数据可以用多种不同的方式存储。当前,CosmosDB存储4种不同类型的数据,它允许您与API集成并围绕这些数据库存储类型构建用户体验。 这4种类型是文档数据库或Mongo数据库,图形数据库,键值对以及宽列或列族