4

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 に変更します (スペースを節約するため) などを使用しますdiff-match-patch。1時間、1日、または設定された時間ごとに1回の完全な保存、または設定された数の差分が期待されます。

読み込み中

読み込みheadは簡単です。

古いバージョンは、完全な保存または差分としてマークされ、データが直接返されるか、差分からコンパイルされるかに応じてマークされます。

考え?

他の人がこの問題に取り組んでいると確信しており、それについてどのようなアイデアや実装があるか知りたい. 明らかに、Git、Mercurial、Subversion、CVS などの完全なバージョン管理システムがありますが、これらはどちらも意図した目的には過剰であり、Google App Engine では機能しません。

4

1 に答える 1

2

いくつかの考え:

  • バージョンに対して単調に増加する ID が必要になるため、バージョン エンティティの範囲クエリを実行できます。これはおそらく、ドキュメントと同じエンティティ グループにすべての履歴データが必要であり、ドキュメント エンティティまたは同じグループ内の別のエンティティに最新バージョン ID を保持することを意味します。システム全体で単調に増加する ID が必要な場合 (異なるグループ内の複数のエンティティに加えられた変更を関連付ける、または順序付けするなど)、シャード カウンターとクロスグループ トランザクションを調べる必要があります。

  • 差分を保存するのに十分なスペースが懸念される場合、更新時だけでなく、バ​​ックグラウンド ジョブを使用して完全なバージョンを差分に減らす理由がわかりません。スペースが大きな問題ではなく、主な機能が任意の 2 つのバージョンを比較できる場合、完全なデータを保存する方が簡単な場合があるため、比較のコストは中間バージョンの数に比例しません (またはすべてのバージョン (差分が過去のバージョン間の場合)。過去のバージョンのプロパティに対してクエリを実行したくない場合は、古いエンティティをコンパクトな形式でシリアル化し、インデックスのない BLOB プロパティに格納することでスペースを節約できます。(差分を使用した場合、これがとにかく各差分を保存する方法だと思いますか?) また、n 回のリビジョンごとにマイルストーンで完全なドキュメントを保持することもできます。

  • あなたの説明から、MyDoc を Version エンティティへの参照にすることを好むように思えます。これには、最上位のデータが含まれます。おそらく、MyDoc に最上位のデータを含める (そしてそのプロパティに MyDoc キーなどでインデックスを付ける) 方が簡単で、更新すると、以前のデータ (差分または完全) を使用してバージョンが作成されるだけです。

  • 削除に対応することを忘れないでください。MyDoc がなくなり (そのため、キーとプロパティのクエリに表示されない)、親パスの最新のバージョンには、最後の既知の完全なドキュメントが含まれている可能性があります。

(これは私の思いつきです。私が取り組んでいる CMS について少し考えましたが、まだ構築していません。)

于 2012-05-16T21:31:20.403 に答える