什么是在关键值存储中保存带有修订的文档的最佳方法?

use*_*601 2 key-value mongodb nosql node.js

我是Key-Value Stores的新手,我需要你的建议.我们正在开发一个管理文档及其修订的系统.有点像维基.我们正在考虑将这些数据保存在一个关键值存储中.

请不要给我一个你喜欢的数据库的建议,因为我们想破解它,所以我们可以使用许多不同的键值数据库.我们正在使用node.js,因此我们可以轻松使用json.

我的问题是:数据库的结构应该是什么样的?我们有每个文档的元数据(timestamp,lasttext,id,latestrevision),我们有每个版本的数据(更改,作者,时间戳等...).那么,您推荐哪种键/值结构?

谢谢

Gat*_* VP 5

来自MongoDB 小组的贿赂.它有些特定于MongoDB,但它非常通用.

这些历史实施中的大多数分解为两种常见策略.

策略1:嵌入历史

理论上,您可以将文档的历史记录嵌入到文档本身中.这甚至可以原子地完成.

> 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" } 
Run Code Online (Sandbox Code Playgroud)

策略2:将历史写入单独的集合

> 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' }  } ) 
Run Code Online (Sandbox Code Playgroud)

在这里你会看到我做了两次写作.一个到主集合,一个到历史集合.要获得快速历史记录查找,只需获取原始ID:

> db.docs_hist.ensureIndex( { orig_id : 1, ts : 1 }) 
> db.docs_hist.find( { orig_id : 1 } ).sort( { ts : -1 } )
Run Code Online (Sandbox Code Playgroud)
  • 只显示差异可以增强这两种策略
  • 您可以通过添加来自的链接history collection进行混合original collection

什么是在关键值存储中保存带有修订的文档的最佳方法?

很难说有一种"最佳方式".显然这里有一些权衡取舍.

嵌入:

  • 单个doc上的原子更改
  • 可能导致大型文档,可能会破坏合理的大小限制
  • 可能必须增强代码以避免在没有必要时返回完整的hist

单独收集:

  • 更容易编写查询
  • 不是原子的,需要两个操作(你有交易吗?)
  • 更多存储空间(原始文档上的额外索引)