开放时间的非重叠,连续时间戳范围(tstzrange)

sam*_*mol 2 postgresql indexing database-design range-types

CREATE TABLE operating_period (
  id SERIAL NOT NULL PRIMARY KEY,
  during TSTZRANGE NOT NULL,
  -- other meta fields
);
Run Code Online (Sandbox Code Playgroud)

要求:1.运营期间不得相互重叠

题:

  1. 如何添加约束以确保在运行时间内没有重叠?
  2. 在查询速度方面,我最好用两列(start_at, end_at)还是GIST索引快速tstzrange
  3. 在架构设计中,tstzrange常用吗?或者我最好用两列?

Erw*_*ter 6

1.答案清楚.要确保没有重叠,请使用排除约束:

CREATE TABLE operating_period (
  id serial PRIMARY KEY                -- PK is NOT NULL automatically
 ,during tstzrange NOT NULL
 ,EXCLUDE USING gist (during WITH &&)  -- no overlap
);
Run Code Online (Sandbox Code Playgroud)

这是通过GiST索引实现的during,它自动支持多种类型的查询.相关回答:

2.3.的答案不是很清楚,因为它确实取决于很多事情.两者都有其优点和缺点.对于开放时间,我很可能会使用当前版本的Postgres中的范围类型.我还会[)对所有条目强制执行边界以保持简单.第一个链接答案的详细信息.

如果你应该去(start_at, end_at),你会对OVERLAPS运营商感兴趣:

无论哪种方式,这里的指导方针是每个问题提出一个问题,而不是整个清单......