【问题标题】:Simple version/history on ndb/Google App Enginendb/Google App Engine 上的简单版本/历史
【发布时间】:2012-05-16 12:46:21
【问题描述】:

我希望创建一个系统,用于在 Google App Engine (Python) 上跟踪 ndb.Models/Expandos 内容的版本(历史)。

内容可能比较长,可能有很多版本,但版本之间的差异可能很小。我希望其他人已经做过类似的事情,我想知道他们是如何做到的,以及哪些原则可以指导设计和开发。

在部署时不知道数据模型的属性是什么(例如“标题”、“内容”、“正文”、“日期”等),但类型是已知的(日期、文本等)。

我最初的想法是安排如下:

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 上运行。

【问题讨论】:

  • 您是否考虑过简单地使用来自 Git 之类的模型并使其适应您自己的目的?
  • 我很好奇你是否找到了解决方案,我也有类似的问题。

标签: google-app-engine versioning app-engine-ndb


【解决方案1】:

一些想法:

  • 您需要一个单调递增的版本 ID,以便您可以对版本实体进行范围查询。这可能意味着您需要将所有历史数据与文档放在同一实体组中,并将最新版本 ID 保留在文档实体上或同一组中的单独实体中。如果您想要一个系统范围内单调递增的 ID(例如关联或排序对不同组中的多个实体所做的更改),您需要研究分片计数器和跨组事务。

  • 如果空间足以让您担心存储差异,我不明白您为什么要将完整版本减少为具有后台作业的差异,而不仅仅是更新。如果空间不是一个大问题并且主要功能是能够区分两个任意版本,那么存储完整数据可能会更容易,因此差异的成本与中间版本的数量(或所有版本,如果您的差异在历史版本之间)。假设您不想对过去版本的属性执行查询,您可以通过以紧凑​​形式序列化旧实体并将其存储在非索引 blob 属性中来节省空间。 (我假设这就是您存储每个差异的方式,如果您使用差异?)您还可以在每 n 次修订的里程碑中保留完整文档,因此两个历史版本之间的差异最多需要 2n 个版本来计算。

  • 从您的描述看来,您希望 MyDoc 成为对 Version 实体的引用,该实体将包含最重要的数据。也许 MyDoc 包含最重要的数据(并使用 MyDoc 键等对其属性进行索引)会更容易,并且更新只是使用以前的数据(差异或完整)创建版本。

    李>
  • 不要忘记容纳删除。也许 MyDoc 消失了(因此它不会出现在键和属性查询中),并且父路径的最新版本包含完整的最后一个已知文档。

(这只是我的想法。我为我工作的 CMS 做了一些思考,但我还没有构建它。)

【讨论】:

  • 许多版本控制系统没有单调递增的 ID。而且您不能使用分片计数器来生成单调递增的 ID。
猜你喜欢
  • 2014-03-06
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多