我是键值存储的新手,需要您的推荐。我们正在开发一个管理文档及其修订的系统。有点像 wiki。我们正在考虑将这些数据保存在键值存储中。
请不要给我推荐您喜欢的数据库,因为我们想破解它以便我们可以使用许多不同的键值数据库。我们正在使用 node.js,因此我们可以轻松地使用 json。
我的问题是:数据库的结构应该是什么样的?我们有每个文档的元数据(时间戳、最后文本、ID、最新版本),我们有每个修订的数据(更改、作者、时间戳等)。那么,您推荐哪种键/值结构?
谢谢
最佳答案
摘自 MongoDB groups .它在某种程度上特定于 MongoDB,但是,它非常通用。
大多数这些历史记录实现都分解为两种常见策略。
策略一:嵌入历史
理论上,您可以将文档的历史嵌入文档本身。这甚至可以原子地完成。
> db.docs.save( { _id : 1, text : "Original Text" } )
> var doc = db.docs.findOne()
> db.docs.update( {_id: doc._id}, { $set : { text : 'New Text' }, $push : { hist : doc.text } } )
> db.docs.find()
{ "_id" : 1, "hist" : [ "Original Text" ], "text" : "New Text" }
策略二:将历史写入分离集合
> db.docs.save( { _id : 1, text : "Original Text" } )
> var doc = db.docs.findOne()
> db.docs_hist.insert ( { orig_id : doc._id, ts : Math.round((new Date()).getTime() / 1000), data : doc } )
> db.docs.update( {_id:doc._id}, { $set : { text : 'New Text' } } )
在这里你会看到我写了两次。一个到大师收藏和 一个到历史收藏。 要快速查找历史记录,只需获取原始 ID:
> db.docs_hist.ensureIndex( { orig_id : 1, ts : 1 })
> db.docs_hist.find( { orig_id : 1 } ).sort( { ts : -1 } )
- 这两种策略都可以通过仅显示差异来增强
- 您可以通过添加从
历史集合
到原始集合
的链接来混合
Whats the best way of saving a document with revisions in a key value store?
很难说有“最好的方法”。显然,这里需要进行一些权衡。
嵌入:
- 单个文档的原子更改
- 可能会产生大文档,可能会超出合理的大小限制
- 可能必须增强代码以避免在不必要时返回完整的 hist
单独收集:
- 更容易编写查询
- 不是原子的,需要两个操作(你有交易吗?)
- 更多存储空间(原始文档的额外索引)
关于node.js - 在键值存储中保存带有修订的文档的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5594970/