2009-03-12 11 views
8

私は現在、1つのファイルの複数のバージョンを保存することを可能にする単純なリビジョンシステムに取り組んでいます。MySQLを使用して簡単なリビジョンシステムを作成する最も良い方法は何ですか?

(簡潔にするために除去廃止列)を以下のように

表構造である:

file_id  file_revision  file_parent  file_name 
-------------------------------------------------------- 
1   1     0    foo.jpg 
2   2     1    foorevised.jpg     
3   3     1    anotherrevision.jpg 

  • file_id主キー、自動インクリメント
  • file_revision記憶しますリビジョン番号、デフォルトの場合1
  • file_parentリビジョンのトップレベルの親であり、デフォルトの場合は0になります。
  • file_nameがファイル名です。

問題:

  • 好ましくは、私はすべてのファイルを取得する単一のクエリを使用して ...
  • しかし、各ファイルの唯一の最新リビジョン...
  • .. 1つのリビジョンだけが保存されている場合(オリジナル)、このリビジョンを取得する必要があります。

どのポインタも大変ありがたいです。前もって感謝します。

+0

これはなぜ落とされたのかわかりませんが、正当な質問だと私は答えを知りたいと思うでしょう。 –

答えて

3

検索のための最も効率的な方法は、ファイル1の最新バージョンを取得するときに、事前に入力する必要があるis_latestの列を追加し、次にselect * from table where file_id=1 and is_latest=trueを追加することです。しかし、複雑です。

ファイルの最新バージョンを1つのテーブルに、履歴バージョンを別のテーブルに格納する方法もあります。主に、を選択したい場合は、最新のバージョンであるファイルがあります。select * from table where is_latest=trueは、is_latestが索引付けされていても完全な表スキャンになる可能性があります。最新の行がすべて1つのテーブルにある場合、データベースはシーケンシャルIOでそれらすべてを読み取ることができ、1)必要なレコードだけを検索するためにテーブルをシークするか、または2)大きなテーブルをスキャンする古いレコードの途中のデータ量。

既存のテーブルデザインを変更したくないと仮定すると、グループワイズ最大値の選択と呼ばれます。this articleを参照してください。

+0

これは非常に古い答えですが、確かにタイムスタンプのチェックは簡単で、簡単で効率的です。 is_latestフラグを削除するために最後のリビジョンを更新する必要はありません。選択すると、1を選択し、タイムスタンプで順序を選択します。 – Sk446

1
file_id  file_revised  file_name    Time_Stamp 
----------------------------------------------------------------- 
1   1     foo.jpg     insert_time 
2   1     foorevised.jpg   insert_time     
3   1     anotherrevision.jpg  insert_time 

私は、このようなクエリにバリエーションを行うだろう:

SELECT * WHERE file_revision

またはクエリのこのタイプのバリエーションのいずれかの任意の数、すなわちBY TIME_STAMP GROUP BY file_revision = 1 ORDER最大1つのfile_idで注文することもできます。

関連する問題