Bài 9: Thiết Kế Cơ Sở Dữ Liệu & Chuẩn Hoá
Giai đoạn 3 – Nâng Cao · Mục tiêu: Biết cách thiết kế CSDL đúng chuẩn, vẽ sơ đồ ERD, và áp dụng các dạng chuẩn hoá (1NF → 3NF).
1. Tại sao cần thiết kế CSDL?
CSDL thiết kế tệ
| MaDH | KhachHang | SDT | SanPham | Gia | SoLuong |
|---|---|---|---|---|---|
| 1 | Nguyễn An | 0901234567 | iPhone 15, AirPods | 28990000, 5990000 | 1, 2 |
| 2 | Nguyễn An | 0901234567 | MacBook Air | 27490000 | 1 |
Vấn đề:
- Dữ liệu trùng lặp: Tên và SDT khách hàng lặp lại mỗi đơn.
- Nhiều giá trị trong 1 ô: SanPham, Gia chứa nhiều giá trị.
- Khó cập nhật: Đổi SDT phải sửa nhiều dòng.
- Khó truy vấn: Không thể dễ dàng tìm đơn hàng chứa "iPhone".
CSDL thiết kế tốt
→ Tách thành nhiều bảng liên kết với nhau bằng khoá ngoại.
2. Sơ đồ ERD (Entity-Relationship Diagram)
ERD là sơ đồ mô tả thực thể (bảng), thuộc tính (cột) và mối quan hệ giữa các bảng.
Các loại quan hệ
| Quan hệ | Ký hiệu | Ví dụ |
|---|---|---|
| 1 – 1 (Một – Một) | 1 1 | Nhân viên Hộ chiếu |
| 1 – N (Một – Nhiều) | 1 N | Khách hàng Đơn hàng |
| N – N (Nhiều – Nhiều) | N N | Sinh viên Môn học |
Quan hệ 1 – N (Một – Nhiều)
Một khách hàng có nhiều đơn hàng, nhưng mỗi đơn hàng chỉ thuộc một khách hàng.
-- Bảng "1" (cha)
CREATE TABLE KhachHang (
MaKH INT AUTO_INCREMENT PRIMARY KEY,
HoTen VARCHAR(100) NOT NULL
);
-- Bảng "N" (con) - chứa FOREIGN KEY
CREATE TABLE DonHang (
MaDH INT AUTO_INCREMENT PRIMARY KEY,
MaKH INT NOT NULL,
NgayDat DATE,
FOREIGN KEY (MaKH) REFERENCES KhachHang(MaKH)
);
Quan hệ N – N (Nhiều – Nhiều)
Một sinh viên học nhiều môn, một môn có nhiều sinh viên → Cần bảng trung gian.
-- Bảng Sinh Viên
CREATE TABLE SinhVien (
MaSV INT AUTO_INCREMENT PRIMARY KEY,
HoTen VARCHAR(100) NOT NULL
);
-- Bảng Môn Học
CREATE TABLE MonHoc (
MaMH INT AUTO_INCREMENT PRIMARY KEY,
TenMH VARCHAR(100) NOT NULL,
SoTinChi INT
);
-- Bảng trung gian: DangKy
CREATE TABLE DangKy (
MaSV INT,
MaMH INT,
HocKy VARCHAR(20),
Diem DECIMAL(4, 2),
PRIMARY KEY (MaSV, MaMH), -- Khoá chính gồm 2 cột
FOREIGN KEY (MaSV) REFERENCES SinhVien(MaSV),
FOREIGN KEY (MaMH) REFERENCES MonHoc(MaMH)
);
3. Chuẩn hoá dữ liệu (Normalization)
Chuẩn hoá là quá trình tổ chức lại cấu trúc bảng để:
- Loại bỏ dữ liệu trùng lặp.
- Đảm bảo tính toàn vẹn dữ liệu.
- Dễ bảo trì và mở rộng.
3.1. Dạng chuẩn 1 (1NF) – Mỗi ô chứa 1 giá trị
Quy tắc: Mỗi ô trong bảng chỉ chứa một giá trị duy nhất (nguyên tử).
** Vi phạm 1NF:**
| MaDH | KhachHang | SanPham |
|---|---|---|
| 1 | Nguyễn An | iPhone 15, AirPods, Ốp lưng |
** Đạt 1NF:**
| MaDH | KhachHang | SanPham |
|---|---|---|
| 1 | Nguyễn An | iPhone 15 |
| 1 | Nguyễn An | AirPods |
| 1 | Nguyễn An | Ốp lưng |
3.2. Dạng chuẩn 2 (2NF) – Loại bỏ phụ thuộc một phần
Quy tắc: Đạt 1NF + Mọi cột không phải khoá phải phụ thuộc vào toàn bộ khoá chính.
** Vi phạm 2NF:** (Khoá chính: MaDH + MaSP)
| MaDH | MaSP | TenSP | SoLuong | DonGia |
|---|---|---|---|---|
| 1 | SP01 | iPhone 15 | 1 | 28990000 |
| 1 | SP02 | AirPods | 2 | 5990000 |
→ TenSP chỉ phụ thuộc MaSP, không phụ thuộc MaDH → phụ thuộc một phần.
** Đạt 2NF:** Tách thành 2 bảng:
Bảng SanPham:
| MaSP | TenSP | DonGia |
|---|---|---|
| SP01 | iPhone 15 | 28990000 |
| SP02 | AirPods | 5990000 |
Bảng ChiTietDH:
| MaDH | MaSP | SoLuong |
|---|---|---|
| 1 | SP01 | 1 |
| 1 | SP02 | 2 |
3.3. Dạng chuẩn 3 (3NF) – Loại bỏ phụ thuộc bắc cầu
Quy tắc: Đạt 2NF + Không có cột không phải khoá phụ thuộc vào cột không phải khoá khác.
** Vi phạm 3NF:**
| MaNV | HoTen | MaPB | TenPB | DiaChiPB |
|---|---|---|---|---|
| 1 | Nguyễn An | PB01 | Kỹ thuật | Tầng 3 |
| 2 | Trần Bình | PB01 | Kỹ thuật | Tầng 3 |
→ TenPB và DiaChiPB phụ thuộc vào MaPB (không phải khoá chính) → phụ thuộc bắc cầu.
** Đạt 3NF:** Tách thành 2 bảng:
Bảng PhongBan:
| MaPB | TenPB | DiaChiPB |
|---|---|---|
| PB01 | Kỹ thuật | Tầng 3 |
Bảng NhanVien:
| MaNV | HoTen | MaPB |
|---|---|---|
| 1 | Nguyễn An | PB01 |
| 2 | Trần Bình | PB01 |
4. Bảng tóm tắt các dạng chuẩn
| Dạng chuẩn | Quy tắc | Giải quyết vấn đề |
|---|---|---|
| 1NF | Mỗi ô chứa 1 giá trị | Nhiều giá trị trong 1 ô |
| 2NF | Không phụ thuộc một phần vào khoá chính | Dữ liệu trùng do khoá chính phức hợp |
| 3NF | Không phụ thuộc bắc cầu | Dữ liệu trùng do phụ thuộc gián tiếp |
:::tip Trong thực tế Hầu hết CSDL chỉ cần chuẩn hoá đến 3NF là đủ. Chuẩn hoá quá mức (4NF, 5NF) có thể khiến truy vấn phức tạp và chậm vì phải JOIN quá nhiều bảng. :::
5. FOREIGN KEY nâng cao
ON DELETE và ON UPDATE
CREATE TABLE DonHang (
MaDH INT AUTO_INCREMENT PRIMARY KEY,
MaKH INT,
NgayDat DATE,
FOREIGN KEY (MaKH) REFERENCES KhachHang(MaKH)
ON DELETE CASCADE -- Xoá khách → xoá luôn đơn hàng
ON UPDATE CASCADE -- Sửa MaKH → tự động cập nhật
);
Các tuỳ chọn ON DELETE / ON UPDATE
| Tuỳ chọn | Hành vi |
|---|---|
CASCADE | Tự động xoá/cập nhật dòng con theo |
SET NULL | Đặt cột khoá ngoại = NULL |
SET DEFAULT | Đặt về giá trị mặc định |
RESTRICT | Ngăn xoá/sửa nếu còn dòng con (mặc định) |
NO ACTION | Giống RESTRICT |
-- Ví dụ: Xoá khách hàng → đơn hàng set MaKH = NULL
FOREIGN KEY (MaKH) REFERENCES KhachHang(MaKH)
ON DELETE SET NULL
ON UPDATE CASCADE;
6. Quy trình thiết kế CSDL
Bước 1: Xác định thực thể
Liệt kê các đối tượng chính cần quản lý:
- Khách hàng
- Sản phẩm
- Đơn hàng
- Nhân viên
Bước 2: Xác định thuộc tính
Mỗi thực thể cần những thông tin gì?
- Khách hàng: MaKH, HoTen, SDT, Email, DiaChi
- Sản phẩm: MaSP, TenSP, Gia, SoLuongTon, DanhMuc
Bước 3: Xác định quan hệ
- Khách hàng 1 – N Đơn hàng
- Đơn hàng N – N Sản phẩm (qua ChiTietDonHang)
- Nhân viên 1 – N Đơn hàng (nhân viên xử lý đơn)
Bước 4: Vẽ ERD
Bước 5: Chuẩn hoá (1NF → 3NF)
Bước 6: Viết SQL tạo bảng
Bài tập thực hành
Bài 1: Nhận diện vi phạm chuẩn hoá
Cho bảng sau, hãy xác định vi phạm dạng chuẩn nào và đề xuất cách sửa:
| MaHD | KhachHang | SDT | DichVu | GiaDV | NVPhuTrach | PhongBan |
|---|---|---|---|---|---|---|
| 1 | Anh An | 0901234567 | Cắt tóc, Gội đầu | 100000, 50000 | Bình | Salon 1 |
| 2 | Chị Châu | 0912345678 | Nhuộm tóc | 300000 | Bình | Salon 1 |
| 3 | Anh An | 0901234567 | Gội đầu | 50000 | Dũng | Salon 2 |
Bài 2: Thiết kế CSDL Quản Lý Thư Viện
Yêu cầu:
- Quản lý Sách: mã, tên, tác giả, nhà xuất bản, năm, thể loại, số lượng.
- Quản lý Độc giả: mã, họ tên, CMND, điện thoại, địa chỉ.
- Quản lý Phiếu mượn: ai mượn sách gì, ngày mượn, ngày trả, trạng thái.
- Một sách có thể thuộc nhiều thể loại (Văn học + Lịch sử).
Hãy:
- Vẽ sơ đồ ERD (trên giấy hoặc dùng draw.io).
- Xác định các quan hệ (1-1, 1-N, N-N).
- Viết SQL tạo tất cả các bảng với đầy đủ ràng buộc.
Bài 3: Thiết kế CSDL Quản Lý Bệnh Viện
Quản lý: Bệnh nhân, Bác sĩ, Khoa, Phòng khám, Lịch hẹn, Đơn thuốc.
- Xác định các thực thể và thuộc tính.
- Xác định quan hệ giữa các thực thể.
- Viết SQL tạo CSDL chuẩn 3NF.
Quay lại: Roadmap · Bài tiếp: Bài 10 – View, Index & Tối Ưu