6

古いバージョンを復元できるため、編集時に(stackexchangeプロジェクトのように)すべてのバージョンの投稿を保存するのが一般的です。すべてのバージョンを保存するための最良の方法は何だろうか。

方法1:すべてのバージョンを同じテーブルに保存し、注文バージョンまたはアクティブバージョンの列を追加します。これにより、テーブルが長くなりすぎます。

方法2:古いバージョンを保存するアーカイブテーブルを作成します。

どちらの方法でも、記事のメイン識別子である行IDをどのように処理するのでしょうか。

4

4 に答える 4

9

リビジョン履歴を保存する「最良の」方法は、特定の目標/制約が何であるかによって異なりますが、これらについては言及していません。

しかし、ここであなたの2つの提案された方法についていくつかの考えがあります:

  • 投稿用に 1 つのテーブルを作成し、投稿履歴用に 1 つ作成します。例:

    create table posts (
      id int primary key,
      userid int
    );
    
    create table posthistory (
      postid int,
      revisionid int,
      content varchar(1000),
      foreign key (postid) references posts(id),
      primary key (postid, revisionid)
    );
    

(明らかに、より多くの列、外部キーなどがあります。)これは実装が簡単で理解しやすい(そしてRDBMSに参照整合性を維持させるのは簡単です)が、あなたが述べたように、posthistory行が多すぎてすぐに検索できない場合があります足りる。

は(および の PK )postidの外部キーであることに注意してください。posthistoryposts

  • 最新のリビジョンがすべて 1 つのテーブルにあり、以前のリビジョンが別のテーブルにある非正規化スキーマを使用します。これには、プログラム側でより多くのロジックが必要when I add a new version, replace the post with the same id in the post table, and also add this to the revision tableです。

(これは、 SE Data Explorerのデータ ダンプに基づいて、SE サイトが使用するものである可能性があります。または、そうでない可能性もあります。私にはわかりません。)

このアプローチでpostidは、 はテーブルの外部キーでもあり、posthistoryテーブルの主キーでもありpostsます。

于 2012-02-09T13:22:30.073 に答える
3

私の意見では、興味深いアプローチは

  • たとえば、別のテーブルを定義するにはposts_archive(テーブルのすべての列posts+ 自動インクリメントされた主キー + オプションで日付が含まれます...)
  • テーブルで定義された after-insert および after-updates トリガーを介してこのテーブルをフィードしpostsます。
于 2012-02-09T13:06:01.743 に答える
2

テーブルのサイズが問題になる場合は、2 番目のオプションを選択することをお勧めします。そうすれば、アクティブなバージョンを小さなテーブルからすばやく返すことができ、大きなアーカイブ テーブルから古いバージョンを復元するのに時間がかかります。とはいえ、適切なデータベースとインデックス作成では、テーブルのサイズは問題になりません。

いずれにしても、行 ID だけでなく、複数のテーブル列で構成される主キーが必要です。些細な答えは、各リビジョンが作成された時刻を含むタイムスタンプをキーに含めることです。これにより、ID は引き続き特定の記事を識別し、ID とリビジョン時刻は合わせて記事の特定のリビジョンを識別します。

于 2012-02-09T13:17:23.293 に答える
2

時系列データの処理は既知の問題です。

messageID, version, description, ...方法 1 は、テーブル識別子を変更するだけです。主キーを含むテーブルになりますmessageID, version。インクリメントされたバージョンの行を追加するだけで、データを変更できます。クエリはもう少し複雑です。

方法 2 はより面倒ですrowID。方法 1 とまったく同じ 1 つのテーブルと 2 つ目のテーブルが作成されます。次に、更新のたびに、データを「バックアップ」にコピーすることを忘れないでください。テーブル"。

方法 3: Mattの答え

私の意見では、方法 1 と 3 の方が優れています。スキーマは 1 の方が単純ですが、方法 3 を使用して、バージョン管理されていないデータを投稿に使用できます。

于 2012-02-09T13:26:32.470 に答える