Chuyển tới nội dung chính

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ệ

MaDHKhachHangSDTSanPhamGiaSoLuong
1Nguyễn An0901234567iPhone 15, AirPods28990000, 59900001, 2
2Nguyễn An0901234567MacBook Air274900001

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ệuVí dụ
1 – 1 (Một – Một)1 1Nhân viên Hộ chiếu
1 – N (Một – Nhiều)1 NKhách hàng Đơn hàng
N – N (Nhiều – Nhiều)N NSinh 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:**

MaDHKhachHangSanPham
1Nguyễn AniPhone 15, AirPods, Ốp lưng

** Đạt 1NF:**

MaDHKhachHangSanPham
1Nguyễn AniPhone 15
1Nguyễn AnAirPods
1Nguyễ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)

MaDHMaSPTenSPSoLuongDonGia
1SP01iPhone 15128990000
1SP02AirPods25990000

TenSP chỉ phụ thuộc MaSP, không phụ thuộc MaDHphụ thuộc một phần.

** Đạt 2NF:** Tách thành 2 bảng:

Bảng SanPham:

MaSPTenSPDonGia
SP01iPhone 1528990000
SP02AirPods5990000

Bảng ChiTietDH:

MaDHMaSPSoLuong
1SP011
1SP022

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:**

MaNVHoTenMaPBTenPBDiaChiPB
1Nguyễn AnPB01Kỹ thuậtTầng 3
2Trần BìnhPB01Kỹ thuậtTầng 3

TenPBDiaChiPB 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:

MaPBTenPBDiaChiPB
PB01Kỹ thuậtTầng 3

Bảng NhanVien:

MaNVHoTenMaPB
1Nguyễn AnPB01
2Trần BìnhPB01

4. Bảng tóm tắt các dạng chuẩn

Dạng chuẩnQuy tắcGiải quyết vấn đề
1NFMỗi ô chứa 1 giá trịNhiều giá trị trong 1 ô
2NFKhông phụ thuộc một phần vào khoá chínhDữ liệu trùng do khoá chính phức hợp
3NFKhông phụ thuộc bắc cầuDữ 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ọnHành vi
CASCADETự độ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
RESTRICTNgăn xoá/sửa nếu còn dòng con (mặc định)
NO ACTIONGiố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:

MaHDKhachHangSDTDichVuGiaDVNVPhuTrachPhongBan
1Anh An0901234567Cắt tóc, Gội đầu100000, 50000BìnhSalon 1
2Chị Châu0912345678Nhuộm tóc300000BìnhSalon 1
3Anh An0901234567Gội đầu50000DũngSalon 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:

  1. Vẽ sơ đồ ERD (trên giấy hoặc dùng draw.io).
  2. Xác định các quan hệ (1-1, 1-N, N-N).
  3. 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.

  1. Xác định các thực thể và thuộc tính.
  2. Xác định quan hệ giữa các thực thể.
  3. 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