PostgreSQL での EXCLUDE による隣接/重複エントリの防止
問題:
データベースに任意の日付/時刻範囲を保存することを防ぐことが目的です。重複および隣接するエントリ。 EXCLUDE 句と GiST インデックスを使用した制約が採用されていますが、2 番目の解決の仮定に懸念が生じます。
解決策 1: 2 番目の解決を仮定する
制約内のこれで十分であると仮定すると、2 番目の解像度のみが必要になります。ただし、高解像度のデータ型には、より堅牢なソリューションが必要になる場合があります。
解決策 2: 包含境界
下限範囲と上限範囲の両方に包含境界 ([]) を使用すると、範囲関数を使用した CHECK 制約による重複検出。 && を伴う EXCLUDE 制約は重複しないことを保証し、別の CHECK 制約は包含境界を強制します。
解決策 3: 正規境界
正規境界 ([)] は非重複を容易にします。 && を使用した EXCLUDE 制約によってオーバーラップします。さらに、隣接演算子 (-|-) を別の EXCLUDE 制約で使用して、隣接エントリを禁止します。 CHECK 制約により、適切な境界値が保証されます。
実装の詳細:
-- Solution 2: Inclusive Bounds CREATE TABLE tbl ( tbl_id serial PRIMARY KEY, tsr tsrange, CONSTRAINT tsr_no_overlap EXCLUDE USING gist (tsr WITH &&), CONSTRAINT tsr_enforce_incl_bounds CHECK (lower_inc(tsr) AND upper_inc(tsr)) ); -- Solution 3: Canonical Bounds CREATE TABLE tbl ( tbl_id serial PRIMARY KEY, tsr tsrange, CONSTRAINT tsr_no_overlap EXCLUDE USING gist (tsr WITH &&), CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-), CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr)) );
推奨事項:
ソリューション 3 は、解像度要件に関係なく、重複するエントリと隣接するエントリの両方を処理する堅牢なソリューション。
以上がPostgreSQL の EXCLUDE 制約は、日付/時刻範囲エントリの重複や隣接をどのように防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。