[英]Postgres: best way to avoid overlapping ranges with other conditions
簡化的 MN 連接表
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 &&)
這種使用附加模塊的解決方案是否最適合相對常見的用例?
看一眼:
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 &&)
假設單獨的日期和包括上限日期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.