Database Constraint - Hàng rào bảo vệ cuối cùng

Application validation có thể bị bypass (batch update, manual SQL). Database constraint LUÔN được enforce.

CHECK constraint

-- Checkin phải trước checkout
ALTER TABLE reservations
ADD CONSTRAINT start_before_end CHECK (checkin_at < checkout_at);
 
-- Business rule: EU customers phải có VAT ID
ALTER TABLE invoices
ADD CONSTRAINT eu_vat CHECK (NOT(is_eu) OR vatid IS NOT NULL);

Exclusion Constraint - chống chồng chéo (chỉ PostgreSQL)

Tự động ngăn 2 booking trùng thời gian cho cùng phòng - không cần application-level locking:

CREATE TABLE bookings (
    room_number INT,
    reservation TSTZRANGE,
    EXCLUDE USING GIST (room_number WITH =, reservation WITH &&)
);
-- && = "overlaps": hai khoảng thời gian giao nhau cho cùng room → từ chối

Liên quan