次のようなテーブルがあるとします。
CREATE TABLE foo (
id SERIAL PRIMARY KEY
, barid integer NOT NULL REFERENCES bar(id)
, bazid integer NOT NULL REFERENCES baz(id)
, startdate timestamp(0) NOT NULL
, enddate timestamp(0) NOT NULL
);
このテーブルの目的は、テーブル bar と baz の間に擬似的な「1 対多」の関係を提供することですが、この関係は時間の経過とともに変化する可能性があります。
SELECT * FROM bar
JOIN foo on TRUE
AND foo.barid = bar.id
AND now() BETWEEN foo.startdate AND foo.enddate
JOIN baz on baz.id = foo.bazid
テーブルの特定の行について、bar
テーブル内の対応する行を見つけたいと考えていますbaz
が、対応する行は期間によって異なる可能性があるため、現在は別の行を返し、先月は別の行を返す必要があります。
私の質問は次のとおりです。このテーブルのデータの整合性を検証する最良の方法は何ですか? 具体的には、特定のタイムスタンプについて、 のテーブルfoo
に1 行しかないことを確認する必要がありますfoo.barid
。私はトリガーを書くことができることを知っています(今ではこれが私の唯一のオプションのようです)が、誰かがもっと簡単なアイデアを持っているのでしょうか? 何らかの部分インデックスを使おうと思っていたのですが、条件の書き方がわかりません...