Verhindern benachbarter/überlappender Einträge mit EXCLUDE in PostgreSQL
Problem:
Beim Erstellen eines Wenn Sie eine Datenbank zum Speichern beliebiger Datums-/Zeitbereiche verwenden, besteht das Ziel darin, überlappende und benachbarte Einträge zu verhindern. Es wird eine Einschränkung mithilfe einer EXCLUDE-Klausel und eines GiST-Index verwendet, es bestehen jedoch Bedenken hinsichtlich der Annahme einer zweiten Lösung.
Lösung 1: Annahme einer zweiten Lösung
Wenn die Anwendung erfordert nur eine zweite Auflösung, vorausgesetzt, dass dies in der Einschränkung ausreichend sein könnte. Allerdings erfordern Datentypen mit höherer Auflösung möglicherweise eine robustere Lösung.
Lösung 2: Inklusive Grenzen
Inklusive Grenzen ([]) für den unteren und oberen Bereich ermöglichen Überlappungserkennung durch eine CHECK-Einschränkung unter Verwendung von Bereichsfunktionen. Eine EXCLUDE-Einschränkung mit && stellt sicher, dass es keine Überlappung gibt, während eine andere CHECK-Einschränkung inklusive Grenzen erzwingt.
Lösung 3: Kanonische Grenzen
Kanonische Grenzen ([)] ermöglichen nicht- Überlappung durch eine EXCLUDE-Einschränkung mit &&. Darüber hinaus wird ein benachbarter Operator (-|-) in einer separaten EXCLUDE-Einschränkung verwendet, um benachbarte Einträge zu verhindern. Eine CHECK-Einschränkung stellt geeignete Grenzwerte sicher.
Implementierungsdetails:
-- 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)) );
Empfehlung:
Lösung 3 bietet a Robuste Lösung für die Handhabung sowohl überlappender als auch benachbarter Einträge, unabhängig von der Auflösungsanforderung.
Das obige ist der detaillierte Inhalt vonWie kann die EXCLUDE-Einschränkung von PostgreSQL überlappende und benachbarte Datums-/Zeitbereichseinträge verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!