0

更新: 質問は改善されましたが、まだ助けが必要です!

次のテーブル構造があります。

テーブルreports:

ID |       time | title | (extra columns)
 1 | 1364762762 |   xxx | ...

次の構造を持つ複数objectのテーブル

ID | objectID |       time | title | (extra columns)
 1 |        1 | 1222222222 | ...   | ...
 2 |        2 | 1333333333 | ...   | ...
 3 |        3 | 1444444444 | ...   | ...
 4 |        1 | 1555555555 | ...   | ...

オブジェクト テーブルでは、オブジェクトの更新時に同じ objectID を持つ新しいバージョンが挿入されるため、古いバージョンを引き続き使用できます。たとえば、エントリを参照してくださいobjectID = 1

レポート テーブルでは、reportが挿入されますが、更新/編集されることはありません。

私ができるようにしたいのは次のとおりです。

テーブルのエントリごとに、オブジェクトが作成されたときのように、すべてのreportsオブジェクトの状態を照会できるようにしたいと考えています。report

たとえば、ID 1 の上記のサンプル レポートを見てみましょう。レポートが作成されたとき (time列を参照)、objectID 1 の現在のバージョンは ID 1 のエントリでした (エントリ ID 4 はその時点では存在しませんでした)。ObjectID 2 は、エントリ ID 2 の現在のバージョンでも存在していました。

これを達成する方法がわかりません。

オブジェクトのバージョンを時間列で選択するクエリを使用できます。

SELECT *
FROM (
    SELECT *
    FROM   objects
    WHERE  time < [reportTime]
    ORDER BY time DESC
)
GROUP BY objectID

このクエリのパフォーマンスについては話さないでください。これは、私が何をしたいのかを明確にするためです。私の問題は、時間列の比較です。システム時間が「何らかの理由で」変更される可能性があり、時間列に間違ったデータが含まれ、間違った結果につながるため、これは正しいオブジェクトバージョンを取得したことを確認する良い方法ではないと思います。

そうする別の方法は何でしょうか?これには時間列を使用しないことを考えましたが、代わりに、データベーステーブル全体の挿入順序を知っているGLOBAL増分値を使用しました。

4

1 に答える 1

0

オブジェクトの新しいバージョンをインターンしており、問題がtime列である場合(この列を使用して、どちらが新しいかを並べ替えていると思います); auto-incremental IDバージョンの列を使用することをお勧めします。最終的には、time値が信頼できない場合でも、信頼できる値にIDなります。常に増加しているためです。IDが高いほど、新しいバージョンです。

于 2013-03-31T17:43:41.200 に答える