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ốiLiên quan
- Unique Constraint và NULL - cạm bẫy lớn nhất của UNIQUE constraint
- JSON Column - JSON schema validation
- Spatial Index - GIST index dùng chung cơ chế
- Kỹ thuật thao tác dữ liệu hiệu quả - FOR UPDATE khi cần lock thủ công