Nosql 更改文档数据库

359 阅读5分钟

Nosql 更改文档数据库

文档数据库在形式上是无架构的,允许将自包含文档作为记录或项存储在集合中。文档数据库对正式架构或表单的严格性较低,根据定义,文档数据库可以适应对平均表单的变体和修改。事实上,文档数据库不会阻止您将一组完全不同的文档存储在单个集合中,尽管这样的集合在逻辑上可能不是很有用。

CouchDB(现在是Couchbase的一部分)和MongoDB是两个领先的开源文档数据库,它们非常灵活地在同一集合中存储具有不同属性集的文档。

例如,您可以轻松地将以下两个文档存储在一起:

{name => "John Doe", organization => "Great Co", email=>"john.doe@example.com"} 

{ name => "Wei Chin", company => "Work well", phone => "123-456-7890")

启动 CouchDB 并将这两个文档实际存储在名为 contacts 的数据库中。

MongoDB服务器可以托管多个数据库,每个数据库可以具有多个集合。

相比之下,CouchDB 服务器可以存储多个数据库,但没有集合的概念。

您可以使用命令行实用程序、Futon 或外部程序与 CouchDB 交互并存储文档。

CouchDB 提供了一个 REST API 来执行所有任务,包括创建和管理数据库和文档,甚至触发复制。

查看图中的屏幕截图,查看联系人数据库中两个文档的列表,如在 Futon 中查看的那样。该列表仅显示 id、CouchDB 生成的 UUID 和文档的版本号。

image.png

展开 Wei Chin 的信息显示了完整的文档及其所有部分,如图所示。

image.png

图中右下角的导航箭头允许您浏览文档版本。这在许多数据库中可能看起来不合适,并提醒您版本控制软件或文档管理系统,但它是 CouchDB 中固有的重要功能。对 CouchDB 文档的更新意味着添加该文档的新版本。因此,如果将名称从“Wei Chin”更新为“Wei Lee Chin”,则文档的当前更新版本(inJSON 格式)将如下所示:

{"_id": "797f603b2d043f6b23264e27fa00121f", 

"_rev": "2-949a21d63459638cbd392e6b3a27989d",

"name":"Wei Lee Chin", 
 
 "company": "Work well", 
 
 "phone":*123-456-7890
                      }

除了名称字段的更新值外,您应该看到值的差异为 _rev。_rev字段保存文档的修订号。文档的原始修订号为 1-63726a5e55e33ed02a927ca8518df073。更新后,修订号为 2-949a21d63459638cbd392e6b3a27989d。CouchDB 中的修订号采用 N- 的形式,其中 N 表示文档已更新的次数,哈希值是文档传输表示形式的 MD5 哈希。创建文档时 N 为 1。

MD5 是一种单向 bash 算法,可获取任意长度的数据并生成 128 位指纹或消息摘要。

CouchDB 使用多版本并发控制 (MVCC) 来促进对数据库的并发访问。使用 MVCC 使 CouchDB 能够避免锁定机制以确保写入保真度。每个文档都经过版本控制,文档版本有助于协调冲突。在更新文档之前,将验证当前版本(更新前)是否与读取文档以进行更新时的版本相同。如果版本不匹配,则表明可能存在冲突,因为读取和后续更新之间由另一个独立进程进行了更新。

更新文档时,将保存整个文档的较新版本,而不是现有文档的更新。此过程的副作用是,您可以享受性能提升,因为追加到连续内存比就地更新更快。由于版本号或修订号是 CouchDB 的核心概念,因此您会看到多个版本。

但是,默认情况下,文档的多个版本不会永久保留。版本控制的目的是避免冲突并提供并发性。压缩和复制会修剪旧版本,并且在任何给定时刻都只能保证最新版本的存在。这意味着默认情况下,您无法使用 _rev 字段查询或访问文档的旧版本。在单节点方案中,您可能希望关闭压缩并保留版本。但是,一旦您设置集群,该策略就会失败,因为只有最新版本被复制。

如果确实需要保留文档的版本并查询较旧版本,则需要以编程方式执行此操作。CouchDB创始人有一个简单但有效的解决方案。它建议您执行以下操作:

在访问文档时提取文档当前版本的字符串表示形式。在更新之前,使用 Base64 编码对字符串表示形式进行编码,然后将二进制表示形式另存为文档的附件。使用当前版本号(更新前)作为附件的名称。

这意味着如果按如下方式访问文档本身:

http://127.0.0.1:5984/contacts/797f603b2d043f6b23264e27fa00121f

然后,可以按如下方式访问文档作为附件提供的版本 2:

http://127.0.0.1:5984/contacts/797f603b2d043f6b23264e27fa00121f/2-949a21d63459 638cbd392e6b3a27989d

在大多数情况下,这种管理版本的方式既简单又有用。可以通过根据用例保存文档版本来构建更复杂的版本管理系统。

Futon 使用所示技术管理文档版本。此技术在 CouchDB 的 jQuery JavaScript 客户端库中实现。

因此,虽然CouchDB中的版本控制是一个有趣的功能,但文档存储的延展性和灵活性是一个更通用的功能,这在其他无模式NoSQL数据库中也可以找到。


本文正在参加「金石计划 . 瓜分6万现金大奖」