Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> SQL

Surrogate Key (Khóa đại diện) trong RDBMS


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_921987200
698_561256170
304_571898250
458_661666110

Ở đâ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ạiVí dụƯu điểmNhược điểm
Auto-increment Integer1, 2, 3... (MySQL AUTO_INCREMENT, PostgreSQL SERIAL, SQL Server IDENTITY)Nhỏ, nhanh, dễ join, index tốtKhông phân tán (sharding khó), lộ thông tin thứ tự
UUID / GUID550e8400-e29b-41d4-a716-446655440000Unique 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 / IdentityOracle SEQUENCE, PostgreSQL IDENTITYLinh hoạt, có thể cachePhụ thuộc vendor
Snowflake ID / ULID64-bit/128-bit time-ordered IDSắp xếp theo thời gian, phân tán tốtPhức tạp hơn

Surrogate Key vs Natural Key (Khóa tự nhiên)

Tiêu chíSurrogate KeyNatural Key
Nguồn gốcHệ thống sinhDữ liệu thực (email, CMND, ISBN, mã sản phẩm...)
Ý nghĩa nghiệp vụKhông cóCó
Thay đổiKhông bao giờCó thể thay đổi (đổi email, gộp mã...)
Hiệu suất join/indexTốt (int nhỏ)Có thể kém (string lớn, composite)
Phân tán (sharding)Cần UUID/SnowflakeKhó

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

  1. Luôn có Surrogate Key làm Primary Key (PK).
  2. Đặt Unique Constraint trên Natural Key (nếu có) để đảm bảo tính toàn vẹn nghiệp vụ.
  3. Foreign Key luôn tham chiếu đến Surrogate Key (PK), không tham chiếu Natural Key.
  4. Dùng BIGINT (64-bit) cho auto-increment để tránh tràn (2 tỷ record).
  5. 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ế.