Việc lựa chọn giữa INT (hoặc TINYINT UNSIGNED) và ENUM phụ thuộc vào đặc điểm dữ liệu và yêu cầu nghiệp vụ.
Khi nào nên dùng ENUM?
- Danh sách giá trị cố định, biết trước, ít thay đổi (ví dụ: trạng thái: 'active', 'inactive', 'pending'; size: 'S', 'M', 'L').
- Muốn ràng buộc dữ liệu ở cấp database: chỉ cho phép các giá trị trong danh sách, chèn giá trị khác sẽ báo lỗi (
Data truncated). - Cần tính dễ đọc: giá trị lưu trữ là chuỗi có ý nghĩa, không phải số mã hóa.
- Số lượng giá trị nhỏ (tối đa 65.535 giá trị khác nhau).
Ví dụ ENUM
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number ENUM('10', '20', '30')
);
mysql> INSERT INTO DemoTable (Number) VALUES ('10'), ('20'), ('30');
-- Chèn giá trị không trong danh sách:
mysql> INSERT INTO DemoTable (Number) VALUES ('50');
ERROR 1265 (01000): Data truncated for column 'Number' at row 1
Khi nào nên dùng TINYINT UNSIGNED (hoặc INT)?
- Danh sách giá trị không cố định, có thể mở rộng, thêm mới thường xuyên.
- Cần thực hiện phép toán số học, sắp xếp theo giá trị số tự nhiên.
- Muốn tham chiếu khóa ngoại (Foreign Key) đến bảng lookup (bảng tra cứu) riêng để quản trị danh sách giá trị linh hoạt.
- Cần lưu trữ phạm vi số lớn hơn (TINYINT UNSIGNED: 0-255, SMALLINT UNSIGNED: 0-65535).
Ví dụ TINYINT UNSIGNED
mysql> CREATE TABLE DemoTable2 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number TINYINT UNSIGNED
);
mysql> INSERT INTO DemoTable2 (Number) VALUES (100), (50), (60), (70);
Không bị giới hạn bởi danh sách giá trị định nghĩa trước.
Bảng so sánh tóm tắt
| Tiêu chí | ENUM | TINYINT UNSIGNED |
|---|---|---|
| Ràng buộc giá trị | Chặt chẽ (chỉ giá trị trong danh sách) | Lỏng lẻo (bất kỳ số nào trong phạm vi) |
| Dễ đọc | Cao (chuỗi có nghĩa) | Thấp (số mã hóa) |
| Thay đổi danh sách | Khó (cần ALTER TABLE) | Dễ (chỉ thêm dữ liệu vào bảng lookup) |
| Hiệu năng | Tốt (lưu trữ 1-2 byte) | Tốt (1 byte) |
| Phép toán/sắp xếp | Theo thứ tự định nghĩa trong ENUM | Theo giá trị số tự nhiên |
Khuyến nghị: Dùng ENUM cho các thuộc tính phân loại ổn định (trạng thái, loại, phân loại). Dùng TINYINT/SMALLINT + bảng lookup cho các danh sách thay đổi thường xuyên hoặc cần quan hệ khóa ngoại.