テーブルのレコードレベルのバージョン管理について、この投稿を行っていました。アーキテクチャが履歴テーブルの使用法を扱っていることに気付きました。ただし、私のシナリオではロールバックは必要ありませんが、特定の時点のレコードを取得する必要があります。これは、バージョン管理に単一のテーブルを使用する設計を試みた場所です。これは必要最小限のテーブル データであることに注意してください (制約、インデックスなどはありません)。列に group by 句が含まれているため、id に基づいてインデックスを作成する予定です。
たとえば、私はテーブル Test を持っています
id は識別子です。
modstamp はデータのタイムスタンプです (非 null)
上記の列に加えて、テーブルには簿記の列が含まれます
local_modstamp は、レコードが更新されたタイムスタンプです
del_modstamp は、レコードが削除されたときのタイムスタンプです
バックアップ中に、すべてのレコードがソースから取得され、レコードの値が local_modstamp = null および del_stamp = null になる場所に挿入されます。
id |modstamp |local_modstamp |del_modstamp |
---|---------------------------|---------------|-------------|
1 |2016-08-01 15:35:32 +00:00 | | |
2 |2016-07-29 13:39:45 +00:00 | | |
3 |2016-07-21 10:15:09 +00:00 | | |
レコードが取得されたら、データを処理するためのシナリオを次に示します (参照時間[ref_time]がプロセスが実行される時間であると仮定します)。
通常どおり挿入します。
更新: local_modstamp = ref_time で最新のレコードを更新します。次に、新しいレコードを挿入します。クエリは次のようになります: update test set local_modstamp = where id = and local_modstamp is not null and del_modstamp is not null insert into test values(...)
削除: 最新のレコードを del_modstamp = ref_time で更新します。update test set del_modstamp = where id = and local_modstamp is not null and del_modstamp is not null
この設計は、local_modstamp が null ではなく、del_modstamp が null ではない最新のレコードを取得することを目的としています。ただし、クエリ (最も内側のクエリ) を使用して特定の時点を取得しようとしている問題に遭遇しました。
select id, max(modstamp) from test where modstamp <= <ref_time> and (del_modstamp is null || del_modstamp <= <ref_time>) group by id;
テーブルの最新のレコードを識別するために null をプレースホルダーとして使用するという間違いを犯したようです (そうですか?)。既存の設計を使用して特定時点の記録を取得する方法はありますか?
そうでない場合、可能性のある解決策は、local_modstamp を最新のレコードに設定することだと思います。これには、更新の場合に max(local_modstamp) を使用してロジックを更新する必要があります。特定の時点のデータを取得するために、既存のアーキテクチャを維持できますか?
私は現在 SQL-Server を使用していますが、この設計は他のデータベース製品にも拡張される可能性があります。ベンダー固有のハックを使用する代わりに、より一般的なアプローチを使用してデータを取得するつもりです。