多个版本的 couchDB 是否保留冗余数据?
Does multiple versions of couchDB keeps redundant data?
我刚开始使用 CouchDB 并注意到它在数据库中保留了多个版本的数据。这是否意味着每个版本都是当前添加的字段的完整副本?那么它是在磁盘上保留冗余数据还是版本只是增量版本?
CouchDB 保存多个完整 文档修订,它不 存储增量更改。 CouchDB 的内部使用仅附加数据结构,因此每个新修订都会添加到数据库文件中。
此外,CouchDB 使用 MVCC(多版本并发控制),它在允许并发编写器的同时避免了对锁的需求。 (您可以在复制设置中的 their documentation) This is relevant because the revision numbers are an important part of that mechanism, and keeping some previous revisions aid in that process. (particularly for conflict resolution 中阅读有关此功能的更多信息)
简而言之,每次修改文档时,您的数据库中都会有重复项。因此,多次修改同一文档会导致数据库文件膨胀。此外,修改较少的非常大的文档也有同样的效果。对于每个文档,数据库只考虑最新版本 "active",但旧版本 可能 仍然存在。 (接下来会详细介绍)
这听起来可能效率低下且浪费资源,但 CouchDB 为您提供了一项名为 compaction 的功能。此过程从数据库文件中完全删除所有修订(最近的修订除外)。在 CouchDB 2.0 之前,这通常由管理员手动调用,但现在自动化程度更高。
关于 CouchDB 的一个常见误解是多个版本可以像版本控制系统一样使用(例如:git、svn),因此您可以始终保留数据库的某种历史记录。然而,这是完全错误的,因为 MVCC 纯粹是为了并发控制。如前所述,压缩会删除旧修订,因此您应该随时只依赖数据库中存在的最新修订。
我强烈建议通读 CouchDB 的所有内容 official documentation。它不是特别冗长,并且在描述内部结构和您在决定如何构建应用程序时可用的权衡方面非常出色。
我刚开始使用 CouchDB 并注意到它在数据库中保留了多个版本的数据。这是否意味着每个版本都是当前添加的字段的完整副本?那么它是在磁盘上保留冗余数据还是版本只是增量版本?
CouchDB 保存多个完整 文档修订,它不 存储增量更改。 CouchDB 的内部使用仅附加数据结构,因此每个新修订都会添加到数据库文件中。
此外,CouchDB 使用 MVCC(多版本并发控制),它在允许并发编写器的同时避免了对锁的需求。 (您可以在复制设置中的 their documentation) This is relevant because the revision numbers are an important part of that mechanism, and keeping some previous revisions aid in that process. (particularly for conflict resolution 中阅读有关此功能的更多信息)
简而言之,每次修改文档时,您的数据库中都会有重复项。因此,多次修改同一文档会导致数据库文件膨胀。此外,修改较少的非常大的文档也有同样的效果。对于每个文档,数据库只考虑最新版本 "active",但旧版本 可能 仍然存在。 (接下来会详细介绍)
这听起来可能效率低下且浪费资源,但 CouchDB 为您提供了一项名为 compaction 的功能。此过程从数据库文件中完全删除所有修订(最近的修订除外)。在 CouchDB 2.0 之前,这通常由管理员手动调用,但现在自动化程度更高。
关于 CouchDB 的一个常见误解是多个版本可以像版本控制系统一样使用(例如:git、svn),因此您可以始终保留数据库的某种历史记录。然而,这是完全错误的,因为 MVCC 纯粹是为了并发控制。如前所述,压缩会删除旧修订,因此您应该随时只依赖数据库中存在的最新修订。
我强烈建议通读 CouchDB 的所有内容 official documentation。它不是特别冗长,并且在描述内部结构和您在决定如何构建应用程序时可用的权衡方面非常出色。