【发布时间】:2017-01-06 16:57:50
【问题描述】:
我刚开始使用 CouchDB,并注意到它在数据库中保留了多个版本的数据。这是否意味着每个版本都是当前添加的字段的完整副本?那么它是在磁盘上保留冗余数据还是版本只是增量版本?
【问题讨论】:
标签: couchdb couchdb-futon nosql
我刚开始使用 CouchDB,并注意到它在数据库中保留了多个版本的数据。这是否意味着每个版本都是当前添加的字段的完整副本?那么它是在磁盘上保留冗余数据还是版本只是增量版本?
【问题讨论】:
标签: couchdb couchdb-futon nosql
CouchDB 拥有多个完整文档修订版,它确实不存储增量更改。 CouchDB 的内部使用仅追加数据结构,因此每个新修订都会添加到数据库文件中。
此外,CouchDB 使用 MVCC(多版本并发控制),它在允许并发写入者的同时避免了对锁的需求。 (您可以在their documentation 中阅读有关此功能的更多信息)这是相关的,因为修订号是该机制的重要组成部分,并且保留一些以前的修订有助于该过程。 (特别是对于 conflict resolution 在复制设置中)
简而言之,每次修改文档时,您的数据库中都会有重复项。因此,多次修改同一个文档会导致数据库文件膨胀。此外,修改较少的非常大的文档也具有相同的效果。对于每个文档,只有最新版本被数据库视为“活动”,但旧版本可能仍然存在。 (接下来会详细介绍)
>这听起来可能效率低下且浪费,但 CouchDB 为您提供了一个名为 compaction 的功能。此过程会从数据库文件中完全删除所有修订(最新版本除外)。在 CouchDB 2.0 之前,这通常由管理员手动调用,但现在更加自动化。
关于 CouchDB 的一个常见误解是多个版本可以像版本控制系统一样使用(例如:git、svn),因此您始终可以保留数据库的某种历史记录。然而,这完全是错误的,因为 MVCC 纯粹是为了并发控制。如前所述,压缩会删除旧版本,因此您应该只依赖数据库中存在的最新版本。
我强烈建议通读 CouchDB 的所有 official documentation。它不是特别冗长,而且非常出色地描述了您在决定如何构建应用程序时可以使用的内部结构和权衡取舍。
【讨论】: