Bốn lựa chọn, khác nhau ở chỗ ai giữ danh sách giá trị hợp lệ.
Số nguyên (0, 1, 2...) — tốn ít chỗ nhất nhưng đọc dữ liệu thô không hiểu gì, và ý nghĩa của số nằm trong code ứng dụng. Ai đó chèn nhầm thứ tự trong enum của code là hỏng toàn bộ dữ liệu cũ. Thường không đáng đánh đổi.
Chuỗi + CHECK constraint — lựa chọn mặc định tốt trong hầu hết trường hợp:
status text not null
check (status in ('pending', 'paid', 'shipped', 'cancelled'))Dữ liệu tự giải thích, thêm giá trị mới chỉ là sửa constraint, và bảng nén chuỗi lặp lại rất hiệu quả nên chi phí lưu trữ không đáng kể.
Kiểu ENUM của PostgreSQL — ràng buộc chặt, lưu gọn (4 byte), có thứ tự sắp xếp theo thứ tự khai báo. Điểm bất tiện: ENUM là một kiểu dữ liệu, nên thêm giá trị phải ALTER TYPE, còn xoá hay đổi tên giá trị thì phức tạp — bất lợi khi danh sách trạng thái còn hay thay đổi.
Bảng tra cứu (order_statuses + khoá ngoại) — chọn khi trạng thái cần dữ liệu đi kèm: nhãn hiển thị đa ngôn ngữ, thứ tự sắp xếp, màu badge, hoặc khi người vận hành được phép tự thêm trạng thái. Đổi lại phải join thêm.
Cách chọn nhanh: danh sách ngắn và cố định, không cần metadata → chuỗi + CHECK. Cần metadata hoặc người dùng tự cấu hình → bảng tra cứu. ENUM gốc chỉ nên dùng khi danh sách gần như bất biến.