Mục tiêu: Hiểu và phân biệt được các loại quan hệ trong cơ sở dữ liệu quan hệ (1–1, 1–n, n–n), từ đó thiết kế được các bảng có mối liên kết rõ ràng, tối ưu.
Giới thiệu về mối quan hệ trong CSDL
Cơ sở dữ liệu quan hệ được tổ chức dưới dạng các bảng (tables), và mỗi bảng có thể liên kết với bảng khác thông qua khóa ngoại (foreign key).
Trong thiết kế cơ sở dữ liệu, quan hệ giữa các bảng là yếu tố cực kỳ quan trọng để đảm bảo:
- Tính toàn vẹn dữ liệu.
- Dễ truy vấn và bảo trì.
- Hạn chế dư thừa.
Các loại quan hệ chính:
- Quan hệ 1–1 (one-to-one)
- Quan hệ 1–n (one-to-many)
- Quan hệ n–n (many-to-many)
Quan hệ 1–1 (One to One)
Khái niệm:
Một dòng ở bảng A chỉ liên kết với duy nhất một dòng ở bảng B và ngược lại.
Ví dụ:
Bảng users
(thông tin người dùng) – Bảng user_profiles
(thông tin chi tiết):
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
CREATE TABLE user_profiles (
user_id INT PRIMARY KEY,
full_name VARCHAR(100),
address TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
Ứng dụng: Khi bạn muốn tách dữ liệu nhạy cảm hoặc chi tiết ra khỏi bảng chính để tăng tính bảo mật hoặc tối ưu hiệu suất.
Quan hệ 1–n (One to Many)
Khái niệm:
Một dòng ở bảng A có thể liên kết với nhiều dòng ở bảng B, nhưng một dòng ở bảng B chỉ thuộc một dòng ở bảng A.
Ví dụ:
Bảng categories
– Bảng products
:
CREATE TABLE categories (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
category_id INT,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
Ứng dụng: Rất phổ biến, ví dụ: một thể loại có nhiều sản phẩm, một giáo viên dạy nhiều lớp, một khách hàng có nhiều đơn hàng.
Quan hệ n–n (Many to Many)
Khái niệm:
Một dòng ở bảng A có thể liên kết với nhiều dòng ở bảng B, và ngược lại.
Cách thực hiện:
Cần tạo bảng trung gian (junction table) để biểu diễn quan hệ.
Ví dụ:
Bảng students
, bảng courses
, bảng trung gian student_course
:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE courses (
id INT PRIMARY KEY,
title VARCHAR(100)
);
CREATE TABLE student_course (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
Ứng dụng: Học sinh học nhiều khóa học, sản phẩm thuộc nhiều danh mục, bài viết có nhiều thẻ (tags)…
Mẹo thiết kế quan hệ hiệu quả
- Luôn xác định rõ logic mối quan hệ trước khi tạo bảng.
- Dùng khóa ngoại (foreign key) để đảm bảo tính toàn vẹn dữ liệu.
- Với quan hệ n–n, luôn cần bảng trung gian, có thể mở rộng thêm cột như
ngày tham gia
,vai trò
… - Hạn chế dùng quan hệ 1–1 nếu không cần thiết.
Tự luyện
Thiết kế CSDL cho hệ thống thư viện, gồm các bảng:
books
(sách)authors
(tác giả)categories
(thể loại)book_category
(n–n: sách và thể loại)
Các bạn hãy thử thiết kế cấu trúc bảng và xác định các loại quan hệ giữa chúng.
👉 Bài tiếp theo: [Bài 17. INNER JOIN – kết hợp 2 bảng theo khóa chung] sẽ hướng dẫn cách truy vấn dữ liệu có liên quan giữa nhiều bảng.
Thảo luận