我认为,无论NoSQL聚合存储是键值,列系列还是文档数据库,它都会支持值的版本控制。经过一番谷歌搜索,我得出结论,这个假设是错误的,它只是取决于DBMS实现。这是真的吗?
我知道Cassandra和BigTable支持它(都是列系列商店)。似乎Hbase(列系列)和Riak(键值)可以,但Redis和Hadoop(键值)没有。 Mongo DB(文档)可以Couchbase有,但MongoDB没有(文档存储)。我在这里看不到任何模式。有经验法则吗?(例如,"键值存储通常没有版本控制,而列系列和文档数据库有")
做什么:我想创建一个从URL到PNG图像的网站屏幕截图数据库。我宁愿使用键值存储,因为除了版本控制之外,它是满足问题的最简单的解决方案。但是,当网站更改或降级并且我更新数据库时,我不想丢失旧图像。即使我选择具有版本控制的键值数据库,我也希望能够切换到不同的键值数据库,而不受许多键值数据库不支持版本控制的约束。因此,我试图了解在聚合NoSQL数据库的连续统一体中,版本控制在什么复杂程度下成为数据模型隐含的功能。
您实际上并不需要键值存储的版本控制支持。
您真正需要从数据存储中获得的唯一东西是高效的扫描/范围查询功能。
这意味着数据存储可以按字典顺序检索条目。
大多数KV商店都这样做,所以这很容易。
这是你这样做的方式:
-
创建版本控制密钥。
如果无法将原始名称哈希为固定长度,请在原始密钥的长度前面加上。 然后输入密钥的哈希值或原始密钥本身,并以固定长度的编码版本号结尾(因此,通过将数字与最大版本反转,按字典顺序从高版本到低版本排序)。
-
查询
执行从最大可能版本到版本 0 的范围查询,但只检索一个键。
做
如果不需要显式版本,还可以使用时间戳,这样就可以在不获取最新版本的情况下插入。
一个非常有趣的方法是Datomic数据库。而是存储版本,在Datomic中,没有更新只有插入。整个数据库是不可变的,这意味着您可以指定您希望在连接时看到数据库的关键时刻,并且整个历史记录似乎只包含到目前为止所做的更改。或者考虑一下,可以查询插入数据库的任何内容,以查找其历史。您还可以对数据库进行分支,并在一个分支中创建数据,而另一个分支中没有数据(在编程中,它就像一个基于 git 的数据库,可以在其中创建多个历史记录)