Un modo molto flessibile e ben normalizzato sarebbe memorizzare ogni periodo di apertura come una riga in una tabella. Un periodo di apertura può essere codificato come il giorno della settimana in cui inizia, l'ora del giorno in cui inizia e la durata. Ogni periodo di apertura è collegato a un ristorante tramite una chiave esterna.
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 &&));