在 PostgreSQL 中使用 EXCLUDE 防止相邻/重叠条目
问题:
创建数据库存储任意日期/时间范围,目标是防止重叠和相邻条目。采用了使用 EXCLUDE 子句和 GiST 索引的约束,但是对第二个分辨率的假设产生了担忧。
解决方案 1:假设第二个分辨率
如果应用程序仅需要第二个分辨率,假设这在约束中可能就足够了。然而,更高分辨率的数据类型可能需要更稳健的解决方案。
解决方案 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中文网其他相关文章!