10

我认为无论 NoSQL 聚合存储是键值、列族还是文档数据库,它都会支持值的版本控制。经过一番谷歌搜索,我得出的结论是这个假设是错误的,它只取决于 DBMS 的实现。这是真的?

我知道 Cassandra 和 BigTable 支持它(都是列族商店)。似乎 Hbase(列族)和 Riak(键值)可以,但 Redis 和 Hadoop(键值)没有。Mongo DB(文档)会做Couchbase,但 MongoDB 不会(文档存储)。我在这里看不到任何模式。有经验法则吗?(例如,“键值存储通常没有版本控制,而列族和文档数据库有”)

我正在尝试做的事情:我想创建一个从 URL 到 PNG 图像的网站截图数据库。我宁愿使用键值存储,因为除了版本控制之外,它是解决问题的最简单的解决方案。但是当网站更改或停用并且我更新我的数据库时,我不想丢失旧图像。即使我选择了一个具有版本控制的键值数据库,我也希望能够切换到不同的键值数据库,而不受许多键值数据库不支持版本控制的约束。因此,我试图了解在聚合 NoSQL 数据库的连续统一体中,版本控制在何种复杂程度成为数据模型隐含的功能。

4

2 回答 2

10

您实际上并不需要 Key-Value 存储的版本控制支持。

您真正需要的数据存储中唯一需要的是高效的扫描/范围查询功能。

这意味着数据存储可以按字典顺序检索条目。

大多数 KV 商店都这样做,所以这很容易。

这就是你的做法:

  1. 创建版本化密钥。

    如果您无法将原始名称散列为固定长度,请在原始密钥的长度前添加。然后放入密钥或原始密钥本身的哈希,并以固定长度编码的版本号结束(因此通过将数字与最大版本反转来按字典顺序从高版本到低版本)。

  2. 询问

    执行从最大可能版本到版本 0 的范围查询,但只检索一个键。

完毕

如果您不需要显式版本,您还可以使用时间戳,这样您就可以在不获取最新版本的情况下插入。

于 2014-10-27T14:08:07.850 回答
5

一个非常有趣的方法是Datomic数据库。而是存储版本,在 Datomic 中,没有更新,只有插入。整个数据库是不可变的,这意味着您可以指定要在连接时查看数据库的关键时刻,整个历史记录似乎只包含到该点所做的更改。或者想一想,任何插入数据库的任何东西都可以向后查询其历史。您还可以对数据库进行分支并在一个分支中创建不在另一个分支中的数据(在编程中,它就像基于 git 的数据库,可以创建多个历史记录)

于 2015-10-22T04:58:31.193 回答