Surrogate Key (Khóa đại diện / Khóa thay thế) là khóa chính được tạo ra bởi hệ thống (system-generated) với mục đích **duy nhất** để nhận diện mỗi hàng (tuple) trong bảng. Nó **không mang ý nghĩa nghiệp vụ (business meaning)**.
Đặc điểm chính
- Tự động sinh (auto-increment, sequence, UUID/GUID, identity).
- Không chứa thông tin thực tế về entity (không phải tên, email, mã số thuế...).
- Chỉ dùng cho mục đích nhận diện duy nhất trong database.
- Thường là kiểu số nguyên (INT, BIGINT) hoặc UUID.
- Không bao giờ thay đổi (immutable) sau khi gán.
Ví dụ minh họa
Bảng ProductPrice:
| Key (Surrogate Key) | ProductID (Natural Key) | Price |
|---|---|---|
| 505_92 | 1987 | 200 |
| 698_56 | 1256 | 170 |
| 304_57 | 1898 | 250 |
| 458_66 | 1666 | 110 |
Ở đây, cột Key là Surrogate Key. Cột ProductID là Natural Key (khóa tự nhiên - có ý nghĩa nghiệp vụ).
Các dạng phổ biến
| Loại | Ví dụ | Ưu điểm | Nhược điểm |
|---|---|---|---|
| Auto-increment Integer | 1, 2, 3... (MySQL AUTO_INCREMENT, PostgreSQL SERIAL, SQL Server IDENTITY) | Nhỏ, nhanh, dễ join, index tốt | Không phân tán (sharding khó), lộ thông tin thứ tự |
| UUID / GUID | 550e8400-e29b-41d4-a716-446655440000 | Unique toàn cầu, phù hợp distributed DB, không lộ thứ tự | Lớn (16 bytes), index chậm hơn, không sequential |
| Sequence / Identity | Oracle SEQUENCE, PostgreSQL IDENTITY | Linh hoạt, có thể cache | Phụ thuộc vendor |
| Snowflake ID / ULID | 64-bit/128-bit time-ordered ID | Sắp xếp theo thời gian, phân tán tốt | Phức tạp hơn |
Surrogate Key vs Natural Key (Khóa tự nhiên)
| Tiêu chí | Surrogate Key | Natural Key |
|---|---|---|
| Nguồn gốc | Hệ thống sinh | Dữ liệu thực (email, CMND, ISBN, mã sản phẩm...) |
| Ý nghĩa nghiệp vụ | Không có | Có |
| Thay đổi | Không bao giờ | Có thể thay đổi (đổi email, gộp mã...) |
| Hiệu suất join/index | Tốt (int nhỏ) | Có thể kém (string lớn, composite) |
| Phân tán (sharding) | Cần UUID/Snowflake | Khó |
Khi nào nên dùng Surrogate Key?
- Hầu hết các bảng trong OLTP (transactional systems).
- Khi natural key phức tạp (composite key nhiều cột).
- Khi natural key có thể thay đổi.
- Hệ thống phân tán, microservices (dùng UUID/Snowflake).
- Data warehouse (Dimension tables) - Surrogate key bắt buộc cho SCD (Slowly Changing Dimensions).
Best Practices
- Luôn có Surrogate Key làm Primary Key (PK).
- Đặt Unique Constraint trên Natural Key (nếu có) để đảm bảo tính toàn vẹn nghiệp vụ.
- Foreign Key luôn tham chiếu đến Surrogate Key (PK), không tham chiếu Natural Key.
- Dùng BIGINT (64-bit) cho auto-increment để tránh tràn (2 tỷ record).
- Dùng UUID v7 (time-ordered) hoặc Snowflake cho distributed systems.
Tóm lại: Surrogate Key là "người lạ" được hệ thống giao việc nhận diện hàng dữ liệu, giúp tách biệt identity khỏi business logic, tăng hiệu suất và linh hoạt thiết kế.