MySQL - Khóa Phụ: Hướng dẫn Chi tiết cho Người mới Bắt đầu

Xin chào các bạn yêu thích cơ sở dữ liệu! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của MySQL, tập trung vào Khóa Phụ. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ hướng dẫn bạn từng bước về khái niệm này, như tôi đã làm cho hàng trăm sinh viên trong những năm dạy học của mình. Vậy, hãy lấy một tách cà phê, và chúng ta cùng bắt đầu nhé!

MySQL - Alternate Key

Khóa Phụ là gì?

Trước khi chúng ta đi sâu vào chi tiết, hãy bắt đầu từ những điều cơ bản. Khóa Phụ, còn được gọi là Khóa Ứng cử, là một cột (hoặc một tập hợp các cột) trong bảng cơ sở dữ liệu có thể phục vụ như khóa chính. Nó giống như việc bạn có một chìa khóa dự phòng cho ngôi nhà của mình - nó có thể mở cửa, nhưng bạn thường sử dụng chìa khóa chính thay vì nó.

Trong ngôn ngữ cơ sở dữ liệu, Khóa Phụ giúp xác định duy nhất mỗi bản ghi trong bảng, tương tự như Khóa Chính. Sự khác biệt chính là trong khi có thể có nhiều Khóa Phụ, chỉ có một trong số đó được chọn làm Khóa Chính.

So sánh với thế giới thực tế

Hãy tưởng tượng bạn đang tổ chức một thư viện nhỏ. Mỗi cuốn sách có thể được xác định duy nhất bằng số ISBN, sự kết hợp của tiêu đề và tác giả, hoặc mã vạch duy nhất bạn đã chỉ định. Tất cả những điều này đều có thể phục vụ như các khóa để xác định cuốn sách, nhưng bạn có thể chọn ISBN làm phương thức cataloging chính. Những cái còn lại sẽ là Khóa Phụ của bạn.

Đặc điểm của Khóa Phụ

Bây giờ chúng ta đã hiểu Khóa Phụ là gì, hãy cùng khám phá các đặc điểm chính của nó:

  1. Độc nhất: Giống như Khóa Chính, Khóa Phụ phải chứa các giá trị duy nhất cho mỗi bản ghi trong bảng.

  2. Không Null: Khóa Phụ không thể chứa giá trị NULL. Chúng phải luôn có giá trị hợp lệ.

  3. Tối thiểu: Chúng nên sử dụng số lượng cột tối thiểu cần thiết để đảm bảo tính duy nhất.

  4. Stable: Các giá trị trong các cột Khóa Phụ không nên thay đổi thường xuyên.

  5. Ứng cử cho Khóa Chính: Bất kỳ Khóa Phụ nào cũng có thể được chọn làm Khóa Chính.

Hãy xem một ví dụ để minh họa các đặc điểm này:

CREATE TABLE students (
student_id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(50) UNIQUE,
social_security_number VARCHAR(11) UNIQUE,
first_name VARCHAR(50),
last_name VARCHAR(50)
);

Trong bảng students, cả emailsocial_security_number đều là Khóa Phụ. Chúng duy nhất, không null (được强制 bởi ràng buộc UNIQUE), và có thể phục vụ như Khóa Chính nếu chúng ta hadn't chọn student_id.

Các loại Khóa trong một Bảng

Để hiểu rõ hơn về Khóa Phụ, điều giúp ích là biết về các loại Khóa khác nhau trong bảng MySQL. Dưới đây là một tổng quan nhanh:

Loại Khóa Mô tả
Khóa Chính Identifier chính cho mỗi bản ghi trong bảng
Khóa Phụ (Khóa Ứng cử) Một cột hoặc tập hợp các cột có thể phục vụ như Khóa Chính
Khóa Ngoại Một cột tham chiếu đến Khóa Chính trong bảng khác
Khóa Hợp Một khóa bao gồm hai hoặc nhiều cột
Khóa Surrogate Một khóa nhân tạo được tạo ra chỉ để xác định

Quy tắc cần tuân theo cho Khóa Phụ

Khi làm việc với Khóa Phụ, có một số quy tắc quan trọng cần nhớ:

  1. Độc nhất là quan trọng nhất: Mỗi Khóa Phụ phải xác định duy nhất mỗi bản ghi trong bảng. Không có hai hàng nào có thể có cùng giá trị cho Khóa Phụ.
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(20) UNIQUE,
name VARCHAR(100),
price DECIMAL(10, 2)
);

Trong ví dụ này, sku (Stock Keeping Unit) là một Khóa Phụ. Nó được đánh dấu là UNIQUE để đảm bảo không có hai sản phẩm có cùng SKU.

  1. Không cho phép giá trị Null: Khóa Phụ phải luôn chứa một giá trị. Chúng không thể để trống.
ALTER TABLE products
MODIFY sku VARCHAR(20) UNIQUE NOT NULL;

Sự thay đổi này đảm bảo rằng trường sku không bao giờ có thể là NULL.

  1. Thành phần tối thiểu: Sử dụng số lượng cột ít nhất cần thiết để đạt được tính duy nhất.
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE,
customer_id INT,
UNIQUE KEY (order_date, customer_id)
);

Tại đây, sự kết hợp của order_datecustomer_id tạo thành một Khóa Phụ. Chúng sử dụng cả hai vì mỗi một trong số chúng không duy nhất riêng lẻ, nhưng cùng nhau chúng xác định duy nhất một đơn hàng.

  1. Ưu tiên tính bất biến: Mặc dù không luôn luôn có thể, nhưng tốt nhất là các giá trị trong các cột Khóa Phụ không thay đổi thường xuyên.

  2. Xem xét hiệu suất: Nhớ rằng MySQL sẽ tạo một chỉ mục cho mỗi ràng buộc UNIQUE, điều này có thể ảnh hưởng đến hiệu suất trên các bảng lớn.

CREATE TABLE large_table (
id INT AUTO_INCREMENT PRIMARY KEY,
column1 VARCHAR(50) UNIQUE,
column2 VARCHAR(50) UNIQUE,
-- Hãy cẩn thận khi thêm quá nhiều ràng buộc UNIQUE
data VARCHAR(1000)
);

Trong trường hợp này, việc có nhiều ràng buộc UNIQUE có thể làm chậm quá trình chèn và cập nhật trên các bảng rất lớn.

Ví dụ Thực tế: Cơ sở Dữ liệu Sách

Hãy áp dụng tất cả kiến thức này vào một ví dụ phức tạp hơn. Hãy tưởng tượng chúng ta đang tạo một cơ sở dữ liệu cho một nhà sách:

CREATE TABLE books (
book_id INT AUTO_INCREMENT PRIMARY KEY,
isbn VARCHAR(13) UNIQUE NOT NULL,
title VARCHAR(200) NOT NULL,
author_first_name VARCHAR(50) NOT NULL,
author_last_name VARCHAR(50) NOT NULL,
publication_year INT,
price DECIMAL(10, 2),
UNIQUE KEY (title, author_last_name, author_first_name)
);

Trong bảng books:

  • book_id là Khóa Chính.
  • isbn là một Khóa Phụ (mỗi sách có một ISBN duy nhất).
  • Sự kết hợp của title, author_last_name, và author_first_name tạo thành một Khóa Phụ khác (giả sử không có tác giả viết hai cuốn sách với cùng tiêu đề).

Cấu trúc này cho phép chúng ta xác định duy nhất các sách theo nhiều cách khác nhau, cung cấp sự linh hoạt trong các truy vấn và kiểm tra tính toàn vẹn dữ liệu.

Kết luận

Và đó là tất cả, các bạn! Chúng ta đã cùng nhau hành trình qua thế giới của Khóa Phụ trong MySQL, từ định nghĩa cơ bản đến các đặc điểm, loại và quy tắc quản lý chúng. Nhớ rằng, Khóa Phụ là những người anh hùng vô danh của cơ sở dữ liệu - chúng cung cấp thêm cách để đảm bảo tính toàn vẹn và tính duy nhất của dữ liệu.

Khi bạn tiếp tục hành trình MySQL của mình, hãy tiếp tục thử nghiệm với các cấu trúc bảng và sự kết hợp khóa khác nhau. Càng thực hành nhiều, việc thiết kế cơ sở dữ liệu sẽ càng trở nên trực quan hơn. Và biết đâu, một ngày nào đó, bạn có thể tự mình dạy người khác về những kỳ diệu của Khóa Phụ!

Chúc các bạn mã hóa vui vẻ, và hy vọng các truy vấn của bạn luôn trả về kết quả mong đợi!

Credits: Image by storyset