Een zeer flexibele en goed genormaliseerde manier zou zijn om elke openingsperiode als één rij in een tabel op te slaan. Een openingsperiode kan worden gecodeerd als de weekdag waarop deze begint, de tijd van de dag waarop deze begint en de duur ervan. Elke openingsperiode is via een externe sleutel gekoppeld aan een restaurant.
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 &&));