我刚刚开始使用CouchDB并注意到它在数据库中保留了多个版本的数据。这是否意味着每个版本都是当前添加的字段的完整副本?那么它是否在磁盘上保留冗余数据,或者版本只是增量版本?
答案 0 :(得分:1)
CouchDB拥有多个完整版本的文档,不存储增量更改。 CouchDB的内部使用仅附加数据结构,因此每个新版本都会添加到数据库文件中。
此外,CouchDB使用MVCC(多版本并发控制),它允许在允许并发编写器时需要锁定。 (您可以在their documentation中阅读有关此功能的更多信息)这是相关的,因为修订号是该机制的重要组成部分,并且保留一些先前的修订版有助于该过程。 (特别是对于复制设置中的conflict resolution)
简而言之,每次修改文档时,数据库中都会有重复项。因此,多次修改同一文档可能会导致数据库文件膨胀。此外,具有较少修改的非常大的文档也具有相同的效果。对于每个文档,只考虑最新版本"活动"由数据库,但旧的修订可能仍然存在。 (更多关于下一个)
这可能听起来既不浪费又浪费,但CouchDB为您提供了一个名为compaction的功能。此过程将从数据库文件中删除所有修订(最新的除外)。在CouchDB 2.0之前,这通常由管理员手动调用,但现在它更加自动化。
关于CouchDB的一个常见误解是,多个版本可以像版本控制系统一样使用(例如:git,svn),因此您可以随时保留数据库的某种历史记录。但是,这完全是错误的,因为MVCC纯粹是为了并发控制。如前所述,压缩会删除旧版本,因此您应该只依赖于数据库中现有的最新版本。
我强烈建议您阅读所有CouchDB的official documentation。它并不特别冗长,在描述您在决定如何构建应用程序时可以使用的内部和权衡方面非常出色。