Ett mycket flexibelt och väl normaliserat sätt skulle vara att lagra varje öppningsperiod som en rad i en tabell. En öppningsperiod kan kodas som den veckodag den börjar, tiden på dagen den börjar och hur länge den varar. Varje öppningsperiod är kopplad till en restaurang via en främmande nyckel.
CREATE TABLE opening_period
(restaurant integer,
weekday integer,
time time,
duration interval,
PRIMARY KEY (restaurant,
weekday,
time,
duration),
FOREIGN KEY (restaurant)
REFERENCES restaurant
(id)
ON DELETE CASCADE,
CHECK (weekday >= 0
AND weekday < 7),
-- prevent overlapping opening periods
EXCLUDE USING gist (restaurant WITH =,
tsrange('epoch'::timestamp + time + weekday * INTERVAL '1 days',
'epoch'::timestamp + time + weekday * INTERVAL '1 days' + duration,
'[)') WITH &&));