我正在寻找一个系统来跟踪 Google App Engine (Python) 上 ndb.Models/Expandos 内容的版本(历史)。
内容可能比较长,可能有很多版本,但版本之间的差异可能很小。我希望其他人已经做过类似的事情,我想知道他们是如何做到的,以及哪些原则可以指导设计和开发。
在部署时不知道数据模型的属性是什么(例如“标题”、“内容”、“正文”、“日期”等),但类型是已知的(日期、文本、 ETC)。
我最初的想法是安排这样的事情:
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 上运行。