Postgres:避免与其他条件重叠范围的最佳方法

Posted

技术标签:

【中文标题】Postgres:避免与其他条件重叠范围的最佳方法【英文标题】:Postgres: best way to avoid overlapping ranges with other conditions 【发布时间】:2020-06-15 15:48:47 【问题描述】:

简化的 M-N 连接表

CREATE TABLE dummy (
   fkey1 int, /* omitting FK clause */
   fkey2 int,

    /* could also separate begin and end dates */
   effective_dates_of_assignment daterange,

   EXCLUDE /* WHAT GOES HERE?? */
 )

我想要一个明显的排除规则,如果fkey 字段相同,则日期没有重叠。 (如果键不同,则不排除。)

到目前为止,我最好的想法是添加贡献的多维数据集模块并在所有三个字段上创建一个 gist 多列索引。但是虽然它看起来像一个 3-D 立方体,但重叠约束将在其中两个中退化。那么这里是什么

EXCLUDE USING gist (cube([fkey1, fkey2, lower(effective_dates_of_assignment)],
                         [fkey1, fkey2, upper(effective_dates_of_assignment)])
              WITH &&)

这种使用附加模块的解决方案是否最适合相对常见的用例?

【问题讨论】:

【参考方案1】:

看看:

https://www.postgresql.org/docs/12/rangetypes.html#RANGETYPES-INDEXING

使用 btree_gist 示例。

CREATE EXTENSION btree_gist;
CREATE TABLE room_reservation (
    room text,
    during tsrange,
    EXCLUDE USING GIST (room WITH =, during WITH &&)
);

你将在哪里替换你的 FK 值,所以:

EXCLUDE USING GIST (fkey1 WITH =, fkey2 WITH =, daterange(date_start, date_end, '[]'::text) WITH &&)

假设单独的日期和包括上限日期。

【讨论】:

所以,我确实需要一个扩展,但是这个会更干净!

以上是关于Postgres:避免与其他条件重叠范围的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 9.x 在重叠日期和时间范围内加入

确定范围重叠,包括小于和大于范围

针对IF语句测试范围值数组的最佳方法

UISearchController 重叠 TableView 的滚动视图。解决这个问题的最佳方法?

检查范围是不是重叠

数组与 Postgres 中的数组重叠