内容可能相对较长,版本可能很多,但是版本之间的差异可能非常小。我预计其他人已经做过类似的事情,我想知道他们如何处理以及什么原则可以指导设计和开发。
在部署时不知道数据模型的属性是什么(例如“标题”,“内容”,“正文”,“日期”等),但是类型是已知的(日期,文本等)。
我的初步想法是将其安排为这样:
from google.appengine.ext import ndb
class Version(ndb.Expando):
version_id = ndb.IntegerProperty()
# dated, etc.
# data properties are not known in advance, hence Expando
class MyDoc(ndb.Model):
head = ndb.KeyProperty(kind=Version)
instance = ndb.kind=Property(kind=Version, repeated=True)
# ^^^ may be a StructuredProperty?
算法概述如下:
保存
每当用户保存文档时,将所有最新数据放入一个新的Version
中,并将head
指向该实例。
在此时或此后的某个时间,使用例如diff-match-patch的工具,将旧版本的完整保存更改为差异(以节省空间)。我预计每小时、每天或某个设定时间或一定数量的差异会产生一个完整保存。
加载
加载head
很简单。
较早版本将标记为完整保存或差异,并根据情况直接返回数据或从差异编译。
思考?
我相信其他人已经解决了这个问题,我想知道有哪些关于它的想法和实现。显然,有完整的版本控制系统,如Git、Mercurial和Subversion和CVS - 但那些都是过度设计的,不适用于Google App Engine。