Mencegah Entri Bersebelahan/Bertindih dengan EXCLUDE dalam PostgreSQL
Masalah:
Apabila membuat pangkalan data untuk menyimpan julat tarikh/masa sewenang-wenangnya, matlamatnya adalah untuk mengelakkan pertindihan dan entri bersebelahan. Kekangan menggunakan klausa EXCLUDE dan indeks GiST digunakan, tetapi timbul kebimbangan mengenai andaian resolusi kedua.
Penyelesaian 1: Andaikan Resolusi Kedua
Jika permohonan hanya memerlukan resolusi kedua, dengan mengandaikan ini dalam kekangan mungkin mencukupi. Walau bagaimanapun, jenis data peleraian yang lebih tinggi mungkin memerlukan penyelesaian yang lebih mantap.
Penyelesaian 2: Sempadan Inklusif
Sempadan inklusif ([]) untuk julat bawah dan atas membenarkan pengesanan bertindih dengan kekangan CHECK menggunakan fungsi julat. Kekangan EXCLUDE dengan && memastikan tidak bertindih, manakala kekangan CHECK lain menguatkuasakan sempadan inklusif.
Penyelesaian 3: Sempadan Kanonik
Sempadan Kanonik ([)] memudahkan bukan- bertindih melalui kekangan EXCLUDE dengan &&. Selain itu, pengendali bersebelahan (-|-) digunakan dalam kekangan EXCLUDE berasingan untuk melarang masukan bersebelahan. Kekangan SEMAK memastikan nilai terikat yang sesuai.
Butiran Pelaksanaan:
-- 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)) );
Cadangan:
Penyelesaian 3 menawarkan penyelesaian yang mantap untuk mengendalikan kedua-dua entri bertindih dan bersebelahan, tanpa mengira resolusi keperluan.
Atas ialah kandungan terperinci Bagaimanakah Kekangan EXCLUDE PostgreSQL Dapat Menghalang Entri Julat Tarikh/Masa Bertindih dan Bersebelahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!