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