CREATE TABLE operating_period (
id SERIAL NOT NULL PRIMARY KEY,
during TSTZRANGE NOT NULL,
-- other meta fields
);
Requirements: 1. No operating period can overlap with each other
Question:
- How do I add a constraint to make sure that there is no overlap in the operating hours?
- In terms of query speed, am I better off with two columns
(start_at, end_at)
or is GIST index fast fortstzrange
? - In schema design, is
tstzrange
commonly used? Or am I better of with two columns?
The answer to 1. is clear. To make sure there is no overlap use an exclusion constraint:
This is implemented with a GiST index on
during
, that supports many types of queries automatically. See:Answers to 2. and 3. are not as clear because those really depend on a lot of things. For opening hours I would most likely go with range types in current versions of Postgres. I would also enforce
[)
bounds for all entries to keep things simple. Details in the first linked answer.If you should go with
(start_at, end_at)
, you'll be interested in theOVERLAPS
operator:Either way, the guideline on SO is to ask one question per question, not a whole list ...