2

行のバージョン管理を使用して、テーブルの主キーを設計したいと考えています。私のテーブルには、ID とタイムスタンプの 2 つの主要なフィールドと、その他のフィールドが含まれています。一意の「ID」については、以前のバージョンのレコードを保存したいと考えています。したがって、テーブルの主キーを ID フィールドとタイムスタンプ フィールドの組み合わせとして作成しています。したがって、特定の ID のすべてのバージョンを表示するには、次のように指定できます。

Select * from table_name where ID=<ID_value>

ID の最新バージョンを返すには、次を使用できます。

Select * from table_name where ID=<ID_value> ORDER BY timestamp desc

最初の要素を取得します。ここでの私の質問は、ID フィールドが主キー フィールドの一部であることを考慮して、テーブル全体をスキャンして同じ ID に一致するすべてのエントリを取得する代わりに、このクエリは効率的で O(1) で実行されるでしょうか? 理想的には O(1) で結果を取得するには、主キー全体を提供する必要がありました。テーブル全体のスキャンを実行する必要がある場合、このリクエストを O(1) で実行できるように主キーを設計するにはどうすればよいでしょうか?

ありがとう、スリラム

4

2 に答える 2

1

これには History Table パターンを使用する方がはるかに簡単で優れています。

create table foo (
  foo_id int primary key,
  name text
);

create table foo_history (
  foo_id int,
  version int,
  name text,
  operation char(1) check ( operation in ('u','d') ),
  modified_at timestamp,
  modified_by text
  primary key (foo_id, version)
);

更新または削除時に foo 行を foo_history にコピーするトリガーを作成します。

postgres の完全な例については、https: //wiki.postgresql.org/wiki/Audit_trigger_91plus

于 2015-07-22T19:05:58.887 に答える