【问题标题】:Non-overlap, continuous timestamp ranges (tstzrange) for opening hours营业时间的非重叠、连续时间戳范围 (tstzrange)
【发布时间】:2014-12-19 18:43:49
【问题描述】:
CREATE TABLE operating_period (
  id SERIAL NOT NULL PRIMARY KEY,
  during TSTZRANGE NOT NULL,
  -- other meta fields
);

要求: 1. 营业期间不能相互重叠

问题:

  1. 如何添加约束以确保工作时间不重叠?
  2. 就查询速度而言,我是使用两列(start_at, end_at) 更好还是tstzrange 的 GIST 索引更快?
  3. 架构设计中,tstzrange常用吗?还是我最好用两列?

【问题讨论】:

    标签: postgresql database-design indexing range-types


    【解决方案1】:

    1. 的答案很明确。为确保没有重叠,请使用exclusion constraint

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

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

    2.3. 的答案不太清楚,因为它确实取决于很多事情。两者都有其优点和缺点。对于开放时间,我很可能会在当前版本的 Postgres 中使用范围类型。我还将对所有条目强制执行[) 界限以保持简单。详情见first linked answer

    如果您应该使用(start_at, end_at),您将对OVERLAPS 运算符感兴趣:

    不管怎样,这里的指导方针是每个问题问一个问题,而不是整个列表...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多