Lors de la création d'une base de données qui stocke des plages de dates/heures arbitraires, il est essentiel d'appliquer des contraintes qui empêchent les entrées qui se chevauchent ou qui sont adjacentes. Ces contraintes sont cruciales pour maintenir l'intégrité et l'exactitude des données.
Dans PostgreSQL, la contrainte EXCLUDE répond à cet objectif en utilisant un index GiST. Cependant, une préoccupation commune se pose concernant l'hypothèse d'une résolution d'une seconde lors de la définition de ces contraintes. Les types de données d'horodatage dans PostgreSQL ont souvent une résolution plus élevée, ce qui peut entraîner des inexactitudes.
Solution utilisant des limites exclusives
Pour résoudre ce problème et éviter les plages superposées et adjacentes, il est Il est recommandé d'appliquer des limites exclusives ('[)') sur les plages de dates/heures. Cela implique d'inclure la limite inférieure (en utilisant 'lower_inc()') et d'exclure la limite supérieure ("PAS upper_inc()') via une contrainte CHECK. De plus, pour exclure les plages adjacentes, une autre contrainte EXCLUDE utilisant l'opérateur '-|-' peut être utilisée.
Exemple de code :
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)) );
Cette solution garantit que seules les plages avec des limites exclusives sont autorisées, empêchant ainsi les entrées qui se chevauchent et celles qui sont adjacentes. Il garantit également l'intégrité des données en appliquant le comportement de plage souhaité.
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!