Я думаю, что вы имеете в виду, что номер БРОНИРОВАНИЕ предназначен как минимум для одного гостя. Стандарт SQL ANSI позволит вам выразить ограничение как ASSERTION что-то вроде:
create assertion x as check
(not exists (select * from booking b
where not exists
(select * from booking_guest bg
where bg.booking_id = b.booking_id)));
Однако я не думаю, что Postgres поддерживает это (я не уверен, что какая-либо текущая СУБД поддерживает).
Существует способ использования материализованных представлений и проверки ограничений, но я никогда не видел, чтобы это делалось на практике:
1) Создать материализованное представление как
select booking_id from booking b
where not exists
(select * from booking_guest bg
where bg.booking_id = b.booking_id);
2) Добавить проверочное ограничение к материализованному представлению:
check (boooking_id is null)
Это ограничение не будет выполнено, если когда-либо материализованное представление не будет пустым, то есть, если будет бронирование без связанного гостя. Однако вам следует быть осторожным с эффективностью этого подхода.