Una forma muy flexible y bien normalizada sería almacenar cada período de apertura como una fila en una tabla. Un período de apertura se puede codificar como el día de la semana en que comienza, la hora del día en que comienza y la duración que dura. Cada período de apertura está vinculado a un restaurante a través de una clave externa.
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 &&));