8

さまざまなコンテンツ (投稿、スレッド、コメントなど) を持つ 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をポイントして更新します。selfEdit_Comment.body

最後に、データベース用の Git の簡易バージョンを実行しています。

  • Create_Contentコミットです (完全な状態を に保存しますself.edition)。
  • Content特定のブランチ + 作業ディレクトリ (last_editポインター) です。
  • ユーザー エディションはブランチを前方に移動Contentし、 を新しいコンテンツ (たとえば)bodyに変更しCommentます。

簡単な結末

私が気付いたのは、すべてのユーザー アクションが のテーブルにエントリを持つことですCreate_Content

私の質問は次のとおりです。

これが起こるのはどれほど悪いですか?つまり、このテーブルはかなり大きくなる可能性があり、すべてのアクションがヒットします。

私のアプローチは「クリーン」だと思いますが、車輪を再発明していると確信しています。この特定のホイールは何ですか?

4

1 に答える 1

4

試すことができます: https://bitbucket.org/emacsway/django-versioning。Django-versioning を使用すると、django モデルに保存されているデータをバージョン管理でき、コンテンツのコピーではなく差分のみを保存できます。ManyToMany (現在) を除くすべてのフィールド タイプをサポートします。

あなたのプロジェクトにも役立つかもしれません: Django 組み込みのコメント アプリとオブジェクトの参照方法。これは素晴らしくクリーンなアプローチだと思います。

物理データベースのサイズは問題ではありません。レコード数は問いません。参照:パフォーマンスが低下し始める前に、MySQL データベースはどのくらい大きくなることができますか?

しかし、完全な履歴を保持することはどの程度役立つのでしょうか? TimeMachine のように、履歴の削除を開始できます。毎日 (1 週間)、毎週 (数か月)、および毎月の記録を作成します。Crontab または Django-Celery は、古い履歴を削除するのに役立ちます。

于 2013-07-25T15:31:22.447 に答える