14

Keeping page changes historyHow to version control a record in a database (たとえば)に関する多くの SO の質問を読んだ後、私はその作業を行うための本当に洗練された解決策を見つけることができません。

さて、登録ユーザーがいくつかの記事を投稿し、他のユーザーがそれらの記事の改訂を送信し、一部のモデレーター ユーザーがそれらの改訂をチェックできるようにする、この単純な改訂システムに何が必要かをできるだけ明確に説明しましょう。

MySQL データベース

データベースには、次の簡略化されたフィールドを持つ article テーブルが含まれています。

ARTICLE(id, id_user, title, content, date);

リビジョン/履歴バージョンを実装するには、次の表があると思います。

REVISION(id, id_article, revision_id_user, id_moderator, revision_date, 
         revision_title, revision_content, revision_description, revision_check);

との関係:ARTICLE 0,n <---> 1,1 REVISION

ワークフロー

  • ユーザーが を作成しARTICLE、それがテーブルに挿入されARTICLEます (素晴らしい! )

  • 別のユーザーがARTICLEthis を更新すると、この更新はテーブルに記録されREVISION、モデレーター ユーザーのキューに入れられます。( revision_check=0)。

  • モデレーター ユーザーが を検証するREVISION(revision_check=1)と、は値ARTICLE(content)を取得しREVISION(revision_content)ます。

私の質問

  • このワークフローは良い方法だと思いますか? なぜなら、私は間違いを見ているからです: if there are several REVISIONs for an ARTICLE:
  • 最後に送信されたコンテンツとREVISIONオリジナルのコンテンツのどちらを使用する必要がありARTICLEますか?
  • REVISIONまたは、最後のリビジョンがチェックされていない間は他のリビジョンを送信できないため、リビジョンをブロックする必要があります。
  • ライトバージョニングを記録する方法はありますか? ところで、REVISIONSQL、PHP、js の比較関数を使って、更新された内容だけをテーブルに挿入することはできますか? そして、それをどのように表示するのですか?REVISIONテーブルがとても重くなるのではないかと心配しているからです。

  • おまけ:SOはどうですか?

アイデア、リンク、ソース、プラグイン(MySQL、PHP 5、および JS/jQuery) は大歓迎です。

4

1 に答える 1

9

あなたのパーソナライズされたワークフローのため、あなたの質問に対するプラグインを使用した単一の回答はありません。

改訂ワークフローについて

それはあなた自身のビジョンであり、あなたの使用にとってそれほど悪くはないようです。しかし、一部のユースケースは進化する必要があると確信しています。

私が見ることができる最初のポイントは、リビジョンが進行中で、モデレーターによって検証されるまで、リビジョンをロックする必要があるということです。ARTICLE(revision=progress)進行中の場合は、たとえばロックし、メッセージを表示してユーザーが記事を同時に編集できないようにするなどを追加します。

2 点目、注意してください。記事の作成者はモデレーション プロセスなしで記事を更新できると思います。このため、ARTICLE(revision=progress)著者が自分の記事を更新している間、 も設定する必要があります。

リビジョンの簡易バージョンのデータベースへの記録について

次のように、変更ごとに配列を作成するクレイジーな関数をphp(またはその他)で作成できます。

array('1'=>array('char_pos'=>'250','type'=>'delete','length'=>'25','change'=>''),
'2'=>array('char_pos'=>'450','type'=>'insert','length'=>'16','change'=>'some text change'),
...);

ご覧のとおり、これをデータベースに作成、フォーマット、および記録することは、非常に面倒で管理が難しい場合があります。

MySQL でバージョン管理を行う方法はないと思います。PROPEL のような ORM を使用してバージョン管理を行うこともできますが、結果が期待どおりになるとは思いません...

ここでは、データベースが大きくなったとしても、更新された記事全体をリビジョンごとに記録する方がよいようです。あなたのワークフローでは REVISION テーブルをあまり読まないので、MySQL には大きな負荷がかかりません。

比較表示について

Diff-Match-Patch プラグインを使用して、2 つのコンテンツ間の更新をハイライトすることができます。 「差分」デモはこちら. SO はBeyond 比較(または同様のもの) を使用して、リビジョン間の変更を強調していると思います。

SO テクノロジの詳細については、このページを参照してください。

于 2013-03-16T10:04:02.290 に答える