Empêcher les entrées adjacentes/qui se chevauchent avec EXCLUDE dans PostgreSQL
Problème :
Lors de la création d'un base de données pour stocker des plages de dates/heures arbitraires, l’objectif est d’éviter les entrées superposées et adjacentes. Une contrainte utilisant une clause EXCLUDE et un index GiST est utilisée, mais des inquiétudes surgissent quant à l'hypothèse de la deuxième résolution.
Solution 1 : Suppression de la deuxième résolution
Si l'application ne nécessite qu'une deuxième résolution, en supposant que cela dans la contrainte puisse être suffisant. Cependant, les types de données à plus haute résolution peuvent nécessiter une solution plus robuste.
Solution 2 : Limites inclusives
Les limites inclusives ([]) pour les plages inférieure et supérieure permettent détection de chevauchement par une contrainte CHECK utilisant des fonctions de plage. Une contrainte EXCLUDE avec && garantit le non-chevauchement, tandis qu'une autre contrainte CHECK applique des limites inclusives.
Solution 3 : Limites canoniques
Limites canoniques ([)] facilitent la non- se chevauchent via une contrainte EXCLUDE avec &&. De plus, un opérateur adjacent (-|-) est utilisé dans une contrainte EXCLUDE distincte pour interdire les entrées adjacentes. Une contrainte CHECK garantit des valeurs liées appropriées.
Détails de mise en œuvre :
-- 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)) );
Recommandation :
La solution 3 propose un solution robuste pour gérer à la fois les entrées superposées et adjacentes, quelle que soit l'exigence de résolution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!