1

記事のロールバック


言い換えればいいと思ったので、この質問の本文の多くを削除しました。ここに言い換えます:

ストライクスルーで何かを実装するにはどうすればよいですか?1つのリビジョン更新を以前のものと比較します。mySQLデータベースで処理できるので、リビジョンやバージョン管理自体は必要ありませんが、ほぼ変更ログのようなページの更新を通じて、緑と赤の取り消し線で変更を視覚的に識別できるようにしたいです(ユーザーがそれを見たい)。

SOのリビジョン変更で似たようなものを見たことがありますが、このようなものが欲しいですか?

今の私の質問は元の質問とは根本的に違うと思います、ごめんなさい

しかしここに:https ://stackoverflow.com/posts/2326658/revisions

4

6 に答える 6

3

パート1:データ構造 (元の質問から)

  1. バージョンごとに1行-VS-1行にすべてのバージョン:行
    ごとに1つのリビジョンを格納し、XMLまたはその他の複数値をサポートするタイプとしてすべてのリビジョンを1つの行にパックしないでください。最初は記事が数回編集され、作成者が改訂を要求する場合がありますが、後でアプリケーションから要求されるのは最新バージョンのみになります。この場合、すべての変更履歴をロードしても意味がありません。

  2. 1つのテーブル-VS-2つのテーブル:
    Third_normal_formは2つのテーブルの使用を提案します:いずれの場合も完全な記事を保存し、 -typeの実装
    - Article[ActicleID(int,PK), AuthorID(int,FK), ...]
    - ArticleRevisions[ArticleID(int,UK), RevisionID(int,UK), Content, RevisionComment, RevisionTimeStamp, ...]
    で遊んではいけません-ユースケースは複雑さを要求しませんが、単純さを要求します。また、最新のリビジョンを簡単に取得できるように、をテーブルにdelta冗長に格納することもできます。 1つのテーブルでソリューションを選択する場合があります。例として、 Tracのデータベーススキーマの76行目()を見てください。また、StackOverflowのものと非常によく似ているリビジョン履歴リビジョン差分の例を見て、 Tracがその単純なWikiに対してどのようにそれを行うかを見ることができます。LatestRevisionIDArticle
    Table('wiki'...

パート2:2つのリビジョン間の違いの検出と提示
まず、変更を視覚的に識別するのではなく、プログラムで識別します。必要なのは、2つのファイル(文字列/文字列のリスト)を指定すると、異なる結果が得られるライブラリです。多くの場合、 stackoverflowと同様に、行ごとの比較を選択します)。次に、それらの結果を使用に提示する手段が必要です(緑、赤、三振など)。

PHPとそのライブラリについてはほとんど知識がありませんが、次のリンクから始めることができます。

于 2010-03-09T23:19:04.453 に答える
2

あなたの提案は私には完全に理にかなっているように聞こえます。リビジョンごとに1行のテーブルと、リビジョンテーブル内の現在のリビジョンに効果的にリンクする「表示可能な記事」ごとに1行のテーブルです。それについて冗長なことは何ですか?

1つのテーブルにある種の「現在の」列を使用して偽造することもできますが、特定の記事に対して1つのリビジョンのみが最新であることを確認する必要があります。これは、私にはかなり厄介に聞こえます。

于 2010-02-24T14:30:50.760 に答える
1

XMLとして保存してみてください

私が問題を理解できる限り。各行を1行として保存すれば解決できます。しかし、行数が大幅に増えるため、これは悪いことです。

したがって、データを次のように行に格納します

<row num=1>How would you structure something like this. I want to allow my authors to create articles. However, </row>
<row num=2>should they choose, I would like to be able to allow each save to be a new revision and then allow each </row>
............

すべてが1行ですが、xml形式です。uがそれを取得するとき、num属性を使用して行を比較できます。

于 2010-03-09T18:28:21.793 に答える
0

あなたの質問は、「バージョン管理はどのように実装されていますか?」と要約できます。通常、各リビジョンは、テキスト全体ではなく、古いバージョンとの差分として保存されます(ただし、バリエーションはたくさんあります)。ほとんどのシステムは、変更を「行」に分離できない非テキスト形式の完全なすべてのバージョンを保存できます/保存します。

于 2010-02-24T14:31:43.847 に答える
0

diff私があなたのタグを正しく理解しているなら、あなたはPHPでの実装を探しています。正しい?データベースにどのように保存するかは、現時点では実際にはわからない要因によって異なります。複数の言語などで何をする予定かはわかりません。とにかく、残っているのは、すべてのリビジョンがtextレコード内のmysqlフィールドになるということです。次に、を使用してこれらのリビジョンの2つを比較しdiffます。

ここにいくつかの興味深いPHPの実装があります。私はそれらのどれとも一緒に仕事をしたことがないので、それらがどれほど優れているか、そしてそれらがあなたの要件を満たしているかどうかはわかりませんが、少なくとも出発点になるかもしれません:

diffサーバーの構成によっては、たとえばLinuxコマンドラインを使用できる場合もあります。

于 2010-03-09T18:34:22.807 に答える
0

コードの差分を扱っているのか、より一般的なドキュメントを扱っているのかわかりません。私は数年前に、wikiドキュメントのバージョンの差分を表示する実装を行いました。2つのバージョンを並べて、古いバージョンでは削除を赤でマークし、新しいバージョンでは追加を緑でマークしました。これはすべてjavascriptで行われ、最初にHTMLのテキスト部分だけを抽出し、それらを差分して(diff_match_patch.jsを使用)、次にdiffの結果を使用して何を強調表示するかを決定します(スタイルを使用して背景色を変更します)。それはかなりトリッキーで、完璧ではなく(しかし十分に近い)、かなりのDOM操作を伴いました。したがって、実行可能ですが、簡単ではありません。

于 2010-03-10T01:08:01.880 に答える