さまざまなコンテンツ (投稿、スレッド、コメントなど) を持つ Django webapp があり、それらの履歴を追跡したいと考えています。だから私は「コンテンツ」の「バージョン管理」を作成しようとしています。これが私がやっている方法です(質問の最後までスキップしてください):
Create_Content
アクションを表すモデルがあります。アクター ( editor
)、一連の変更 ( edition
)、タイムスタンプ、およびアクションが作用するコンテンツがあります。
class Create_Content(models.Model):
editor = models.ForeignKey('User')
edition = models.TextField() # pickled dictionary
date = models.DateTimeField(auto_now_add=True)
content = models.ForeignKey('Content')
履歴は変更できないため、一度だけ保存されます。
私はコンテンツが以下を持っていると定義します:
class Content(models.Model):
last_edit = models.ForeignKey(Create_Content, related_name='content_last_id')
first_edit = models.ForeignKey(Create_Content, related_name='content_first_id')
def author(self):
return self.first_edit.editor
last_edit
最後に実行されたアクションはどこfirst_edition
で、コンテンツの最初の作成者を取得するために使用します。
webapp のすべての実際のコンテンツは、 の派生モデルによって作成/編集される Content の派生モデルによって実装されCreate_Content
ます。例えば、
class Comment(Content):
post = models.ForeignKey(Post, related_name="comment_set")
body = models.TextField()
の保存中に作成されますCreate_Comment(Create_Content)
(実際、 のすべてのサブクラスCreate_Content
はプロキシです)。
たとえば、ユーザー エディションはCreate_Content
(たとえばEdit_Comment(Create_Content)
) のサブクラスのインスタンスであり、 中save()
に、実際のコンテンツ (たとえば)last_edit
をポイントして更新します。self
Edit_Comment.body
最後に、データベース用の Git の簡易バージョンを実行しています。
Create_Content
コミットです (完全な状態を に保存しますself.edition
)。Content
特定のブランチ + 作業ディレクトリ (last_edit
ポインター) です。- ユーザー エディションはブランチを前方に移動
Content
し、 を新しいコンテンツ (たとえば)body
に変更しComment
ます。
簡単な結末
私が気付いたのは、すべてのユーザー アクションが のテーブルにエントリを持つことですCreate_Content
。
私の質問は次のとおりです。
これが起こるのはどれほど悪いですか?つまり、このテーブルはかなり大きくなる可能性があり、すべてのアクションがヒットします。
私のアプローチは「クリーン」だと思いますが、車輪を再発明していると確信しています。この特定のホイールは何ですか?