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 では機能しません。