Tối ưu không đồng nghĩa với phức tạp. Hiểu đúng về chuẩn hoá, phi chuẩn hoá và cách sử dụng khoá chính - khoá ngoại sẽ giúp bạn thiết kế cơ sở dữ liệu ổn định, dễ mở rộng và hiệu năng cao.
1. Chuẩn hoá là gì? Tại sao cần chuẩn hoá?
Chuẩn hoá (Normalization) là quá trình tổ chức dữ liệu trong cơ sở dữ liệu để:
- Giảm dư thừa dữ liệu
- Tránh mâu thuẫn dữ liệu
- Cải thiện tính toàn vẹn
Ví dụ đơn giản:
Giả sử bạn có bảng Students:
| ID | Name | ClassName | TeacherName |
|---|---|---|---|
| 1 | An | 10A | Cô Hà |
| 2 | Bình | 10A | Cô Hà |
| 3 | Chi | 10B | Thầy Sơn |
- Vấn đề: Nếu cô Hà đổi lớp, bạn phải cập nhật ở nhiều dòng, rất dễ sai sót.
- Giải pháp: Chuẩn hoá bằng cách tách ra 2 bảng:
Classes(ID, ClassName, TeacherName)Students(ID, Name, ClassID)- có khoá ngoại tớiClasses.ID
2. Các mức chuẩn hoá phổ biến
| Mức chuẩn | Mục tiêu chính | Tránh lỗi gì? |
|---|---|---|
| 1NF | Không chứa danh sách lồng nhau (array) | Tránh lưu trữ dữ liệu phức tạp |
| 2NF | Phụ thuộc đầy đủ vào khóa chính | Tránh dữ liệu dư khi có khóa tổ hợp |
| 3NF | Tránh phụ thuộc bắc cầu (transitive) | Tránh lặp lại thông tin gián tiếp |
3. Phi chuẩn hoá là gì? Khi nào dùng?
Phi chuẩn hoá (Denormalization) là cố tình làm ngược lại chuẩn hoá để:
- Tăng hiệu năng truy vấn
- Giảm số lần
JOINphức tạp
Khi nào nên phi chuẩn hoá?
| Tình huống thực tế | Giải thích |
|---|---|
| Truy vấn phức tạp và quá chậm | Tránh JOIN quá nhiều bảng |
| Dữ liệu ít thay đổi (ít cập nhật) | Tránh vấn đề đồng bộ dữ liệu |
| Phân tích dữ liệu, báo cáo (OLAP) | Ưu tiên tốc độ đọc, không cần tối ưu ghi |
Cảnh báo: Phi chuẩn hoá có thể gây dư thừa dữ liệu và khó bảo trì nếu không kiểm soát tốt.
4. Sử dụng khoá chính và khoá ngoại đúng cách
Khoá chính (Primary Key):
- Không được
NULL - Dùng để định danh duy nhất mỗi bản ghi
- Nên dùng kiểu
INT,UUIDhoặcAUTO_INCREMENT
Khoá ngoại (FOREIGN KEY)
- Dùng để liên kết giữa các bảng
- Giúp duy trì tính toàn vẹn dữ liệu
- Có thể khai báo
ON DELETE CASCADEhoặcON UPDATE CASCADEđể xử lý tự động.
5. Thiết kế mối quan hệ 1-N và N-N hiệu quả
Quan hệ 1-N(One-to-Many)
Ví dụ: 1 lớp học có nhiều học sinh
- Lớp (Class):
ID,Name - Học sinh (Student):
ID,Name,ClassID
-- Class table
CREATE TABLE Class (
ID INT PRIMARY KEY,
Name VARCHAR(100)
);
-- Student table
CREATE TABLE Student (
ID INT PRIMARY KEY,
Name VARCHAR(100),
ClassID INT,
FOREIGN KEY (ClassID) REFERENCES Class(ID)
);
Quan hệ N-N (Many-to-Many)
Ví dụ: 1 học sinh học nhiều môn, 1 môn có nhiều học sinh
- Tạo bản trung gian
StudentSubject
-- Student
CREATE TABLE Student (
ID INT PRIMARY KEY,
Name VARCHAR(100)
);
-- Subject
CREATE TABLE Subject (
ID INT PRIMARY KEY,
Title VARCHAR(100)
);
-- StudentSubject (Join table)
CREATE TABLE StudentSubject (
StudentID INT,
SubjectID INT,
PRIMARY KEY (StudentID, SubjectID),
FOREIGN KEY (StudentID) REFERENCES Student(ID),
FOREIGN KEY (SubjectID) REFERENCES Subject(ID)
);
6. Tổng kết
- Thiết kế chuẩn hoá trước, rồi phi chuẩn hoá có chọn lọc khi cần tối ưu hiệu năng.
- Luôn dùng khoá chính - khoá ngoại rõ ràng, tránh “thiết kế theo cảm tính”.
- Với quan hệ N-N, phải có bảng trung gian - không được nhồi
arrayvào 1 cột.
Bạn đang thiết kế hệ thống nào? Hãy thử kiểm tra lại xem cơ sở dữ liệu của bạn đã chuẩn hoá đúng mức chưa, và có cần phi chuẩn hoá hợp lý để tăng tốc không nhé.