Thiết kế CSDL: Khóa, Quan hệ và Nguyên tắc Vàng

Đăng ngày: 22-09-2025 06:17
mariadbCSDLMySQLkhóa chínhCSDL quan hệkhóa ngoạiquan hệmột-mộtmột-nhiềunhiều-nhiềuthiết kế CSDLchuẩn hóa dữ liệuchỉ mục

Chào mừng bạn đến với bài viết thứ 9 trong loạt bài về MySQL & MariaDB. Hôm nay, chúng ta sẽ khám phá những khái niệm cốt lõi trong thiết kế CSDL. Đó là khóa chính, khóa ngoại và các loại quan hệ khác nhau. Hiểu rõ những điều này sẽ giúp bạn xây dựng CSDL mạnh mẽ và hiệu quả.

Một CSDL được thiết kế tốt là nền tảng của mọi ứng dụng thành công. Nó đảm bảo tính toàn vẹn dữ liệu, hiệu suất truy vấn và khả năng mở rộng. Chúng ta cùng nhau tìm hiểu các yếu tố quan trọng này nhé.

Khóa Chính (Primary Key)

Khóa chính là một hoặc một tập hợp các cột trong một bảng. Nó được dùng để xác định duy nhất mỗi bản ghi (row) trong bảng đó. Không có hai bản ghi nào có thể có cùng giá trị khóa chính.

Đặc điểm của Khóa Chính:

  • Duy nhất: Mỗi giá trị khóa chính phải là duy nhất.
  • Không rỗng: Khóa chính không được phép chứa giá trị NULL.
  • Ổn định: Giá trị khóa chính nên ít thay đổi theo thời gian.

Ví dụ: Trong bảng `customers`, cột `customer_id` thường được chọn làm khóa chính. Mỗi khách hàng sẽ có một `customer_id` duy nhất.

CREATE TABLE customers (
 customer_id INT PRIMARY KEY,
 first_name VARCHAR(255),
 last_name VARCHAR(255),
 email VARCHAR(255)
);

Khóa Ngoại (Foreign Key)

Khóa ngoại là một cột (hoặc tập hợp các cột) trong một bảng. Nó tham chiếu đến khóa chính của một bảng khác. Khóa ngoại thiết lập mối quan hệ giữa hai bảng.

Mục đích của Khóa Ngoại:

  • Đảm bảo tính toàn vẹn tham chiếu (Referential Integrity).
  • Ngăn chặn việc thêm dữ liệu không hợp lệ vào bảng.
  • Duy trì mối quan hệ giữa các bảng.

Ví dụ: Giả sử chúng ta có bảng `orders` và muốn liên kết mỗi đơn hàng với khách hàng tương ứng. Chúng ta sẽ sử dụng `customer_id` làm khóa ngoại trong bảng `orders`, tham chiếu đến khóa chính `customer_id` trong bảng `customers`.

CREATE TABLE orders (
 order_id INT PRIMARY KEY,
 customer_id INT,
 order_date DATE,
 total_amount DECIMAL(10, 2),
 FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Trong ví dụ này, `FOREIGN KEY (customer_id) REFERENCES customers(customer_id)` chỉ định rằng cột `customer_id` trong bảng `orders` là khóa ngoại và nó tham chiếu đến cột `customer_id` trong bảng `customers`.

Các Loại Quan Hệ trong CSDL

Các loại quan hệ mô tả cách các bảng liên kết với nhau. Có ba loại quan hệ chính:

1. Quan hệ Một-Một (One-to-One)

Trong quan hệ một-một, một bản ghi trong bảng A chỉ liên kết với tối đa một bản ghi trong bảng B. Và ngược lại, một bản ghi trong bảng B chỉ liên kết với tối đa một bản ghi trong bảng A.

Ví dụ: Một người chỉ có một hộ chiếu, và một hộ chiếu chỉ thuộc về một người. Chúng ta có thể có hai bảng: `persons` và `passports`. `person_id` là khóa chính trong `persons` và cũng là khóa ngoại trong `passports`.

CREATE TABLE persons (
 person_id INT PRIMARY KEY,
 name VARCHAR(255),
 dob DATE
);
CREATE TABLE passports (
 passport_id INT PRIMARY KEY,
 person_id INT UNIQUE,
 passport_number VARCHAR(255),
 issue_date DATE,
 expiry_date DATE,
 FOREIGN KEY (person_id) REFERENCES persons(person_id)
);

Lưu ý thuộc tính `UNIQUE` trên cột `person_id` trong bảng `passports`. Điều này đảm bảo rằng mỗi người chỉ có thể có một hộ chiếu.

2. Quan hệ Một-Nhiều (One-to-Many)

Trong quan hệ một-nhiều, một bản ghi trong bảng A có thể liên kết với nhiều bản ghi trong bảng B. Nhưng một bản ghi trong bảng B chỉ có thể liên kết với một bản ghi trong bảng A.

Ví dụ: Một khách hàng có thể đặt nhiều đơn hàng, nhưng mỗi đơn hàng chỉ thuộc về một khách hàng. Chúng ta đã thấy ví dụ này ở phần Khóa Ngoại, với bảng `customers` và `orders`.

3. Quan hệ Nhiều-Nhiều (Many-to-Many)

Trong quan hệ nhiều-nhiều, một bản ghi trong bảng A có thể liên kết với nhiều bản ghi trong bảng B. Và ngược lại, một bản ghi trong bảng B cũng có thể liên kết với nhiều bản ghi trong bảng A.

Ví dụ: Một học sinh có thể học nhiều môn học, và một môn học có thể được học bởi nhiều học sinh. Để hiện thực hóa quan hệ này, chúng ta cần một bảng trung gian (junction table).

Bảng Trung Gian: Bảng trung gian chứa khóa chính của cả hai bảng liên quan và tạo thành một khóa ghép (composite key). Nó giải quyết vấn đề quan hệ nhiều-nhiều bằng cách tạo ra hai quan hệ một-nhiều.

CREATE TABLE students (
 student_id INT PRIMARY KEY,
 name VARCHAR(255),
 class VARCHAR(255)
);
CREATE TABLE courses (
 course_id INT PRIMARY KEY,
 course_name VARCHAR(255),
 credit INT
);
CREATE TABLE student_courses (
 student_id INT,
 course_id INT,
 PRIMARY KEY (student_id, course_id),
 FOREIGN KEY (student_id) REFERENCES students(student_id),
 FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

Trong ví dụ này, bảng `student_courses` là bảng trung gian. Nó chứa `student_id` và `course_id`, tạo thành khóa ghép. Mỗi bản ghi trong bảng này đại diện cho một học sinh đăng ký một môn học.

Các Nguyên Tắc Nền Tảng để Xây Dựng CSDL Tốt

Thiết kế CSDL tốt đòi hỏi sự cân nhắc kỹ lưỡng. Dưới đây là một số nguyên tắc quan trọng:

  • Chuẩn hóa dữ liệu (Normalization): Loại bỏ sự dư thừa dữ liệu và cải thiện tính toàn vẹn dữ liệu.
  • Chọn kiểu dữ liệu phù hợp: Chọn kiểu dữ liệu tối ưu cho mỗi cột để tiết kiệm dung lượng và tăng hiệu suất.
  • Sử dụng chỉ mục (Indexes): Tạo chỉ mục trên các cột thường được sử dụng trong truy vấn để tăng tốc độ truy vấn.
  • Đặt tên rõ ràng: Đặt tên cho bảng, cột và chỉ mục một cách rõ ràng và dễ hiểu.
  • Bảo mật dữ liệu: Áp dụng các biện pháp bảo mật để bảo vệ dữ liệu khỏi truy cập trái phép.

Việc tuân thủ các nguyên tắc này sẽ giúp bạn xây dựng một CSDL mạnh mẽ, ổn định và dễ bảo trì.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về khóa chính, khóa ngoại và các loại quan hệ trong thiết kế CSDL. Chúng ta cũng đã thảo luận về các nguyên tắc nền tảng để xây dựng một CSDL có cấu trúc tốt. Hy vọng bạn đã nắm vững những kiến thức này. Hãy áp dụng chúng vào thực tế để tạo ra những CSDL hiệu quả và tối ưu. Chúc bạn thành công trên con đường làm chủ MySQL & MariaDB!

0 Bình luận