Bài 1: Giới thiệu về Trình quản lý quảng cáo
Thực hành: Quản lý đơn hàng của cửa hàng bán lẻ
Bảng dữ liệu ban đầu (chưa chuẩn hóa - UNF)
Giả sử ta có bảng lưu thông tin đơn hàng như sau:
| Mã đơn hàng | Ngày đặt | Mã khách | Tên khách | Địa chỉ | Mã SP | Tên SP | Số lượng | Đơn giá | Tổng tiền |
|---|---|---|---|---|---|---|---|---|---|
| DH001 | 01/08 | KH001 | Nguyễn A | Hà Nội | SP001 | Laptop Dell | 1 | 15,000 | 15,000 |
| DH001 | 01/08 | KH001 | Nguyễn A | Hà Nội | SP002 | Chuột Logitech | 2 | 500 | 1,000 |
| DH002 | 02/08 | KH002 | Trần B | TP.HCM | SP001 | Laptop Dell | 1 | 15,000 | 15,000 |
| DH002 | 02/08 | KH002 | Trần B | TP.HCM | SP003 | Bàn phím cơ | 1 | 1,500 | 1,500 |
| DH003 | 03/08 | KH003 | Hoàng C | Đà Nẵng | SP004 | iPhone 13 | 1 | 20,000 | 20,000 |
📌 Vấn đề:
- Lặp dữ liệu khách hàng: Nếu khách hàng đặt nhiều sản phẩm trong một đơn, thông tin khách bị lặp.
- Lặp dữ liệu sản phẩm: Mỗi đơn hàng có nhiều sản phẩm, nhưng phải ghi lại tên SP, đơn giá nhiều lần.
- Dễ gây lỗi cập nhật: Nếu khách thay đổi địa chỉ, phải sửa nhiều dòng.
1️⃣ Chuẩn hóa về dạng 1NF (Loại bỏ lặp trong cùng ô)
Bảng không có chứa dữ liệu lặp trong 1 ô => Đã đạt chuẩn 1NF
2️⃣ Chuẩn hóa về 2NF (Loại bỏ phụ thuộc không khóa)
Hiện tại, mỗi đơn hàng có thể chứa nhiều sản phẩm, gây trùng lặp. Chúng ta tách bảng thành:
Bảng KhachHang (Thông tin khách hàng)
| Mã khách | Tên khách | Địa chỉ |
|---|---|---|
| KH001 | Nguyễn A | Hà Nội |
| KH002 | Trần B | TP.HCM |
| KH003 | Hoàng C | Đà Nẵng |
Bảng SanPham (Thông tin sản phẩm)
| Mã SP | Tên SP | Đơn giá |
|---|---|---|
| SP001 | Laptop Dell | 15,000 |
| SP002 | Chuột Logitech | 500 |
| SP003 | Bàn phím cơ | 1,500 |
| SP004 | iPhone 13 | 20,000 |
Bảng DonHang (Thông tin đơn hàng)
| Mã đơn hàng | Ngày đặt | Mã khách |
|---|---|---|
| DH001 | 01/08 | KH001 |
| DH002 | 02/08 | KH002 |
| DH003 | 03/08 | KH003 |
Bảng ChiTietDonHang (Chi tiết sản phẩm của đơn hàng)
| Mã đơn hàng | Mã SP | Số lượng | Thành tiền |
|---|---|---|---|
| DH001 | SP001 | 1 | 15,000 |
| DH001 | SP002 | 2 | 1,000 |
| DH002 | SP001 | 1 | 15,000 |
| DH002 | SP003 | 1 | 1,500 |
| DH003 | SP004 | 1 | 20,000 |
- Trong bảng
ChiTietDonHang, giá của sản phẩm phụ thuộc vàoMã SP, không phụ thuộc vàoMã đơn hàng. - Chuyển
Đơn giásang bảngSanPham, tránh dư thừa.
3️⃣ Chuẩn hóa về 3NF (Loại bỏ phụ thuộc bắc cầu)
- Nếu có bảng lưu
Nhà cung cấp, thì thông tin nhà cung cấp không nên nằm trongSanPham, mà tách thành bảng riêng. - Bảng
SanPhamchỉ chứaMã NCClàm khóa ngoại, tránh phụ thuộc bắc cầu.
✅ Kết quả cuối cùng (Chuẩn hóa 3NF)
Bảng KhachHang
| Mã khách | Tên khách | Địa chỉ |
|---|---|---|
| KH001 | Nguyễn A | Hà Nội |
| KH002 | Trần B | TP.HCM |
| KH003 | Hoàng C | Đà Nẵng |
Bảng SanPham
| Mã SP | Tên SP | Đơn giá | Mã NCC |
|---|---|---|---|
| SP001 | Laptop Dell | 15,000 | NCC01 |
| SP002 | Chuột Logitech | 500 | NCC02 |
| SP003 | Bàn phím cơ | 1,500 | NCC02 |
| SP004 | iPhone 13 | 20,000 | NCC03 |
Bảng NhaCungCap
| Mã NCC | Tên NCC | Địa chỉ |
|---|---|---|
| NCC01 | Dell VN | Hà Nội |
| NCC02 | Logitech | TP.HCM |
| NCC03 | Apple VN | Đà Nẵng |
Bảng DonHang
| Mã đơn hàng | Ngày đặt | Mã khách |
|---|---|---|
| DH001 | 01/08 | KH001 |
| DH002 | 02/08 | KH002 |
| DH003 | 03/08 | KH003 |
Bảng ChiTietDonHang
| Mã đơn hàng | Mã SP | Số lượng | Thành tiền |
|---|---|---|---|
| DH001 | SP001 | 1 | 15,000 |
| DH001 | SP002 | 2 | 1,000 |
| DH002 | SP001 | 1 | 15,000 |
| DH002 | SP003 | 1 | 1,500 |
| DH003 | SP004 | 1 | 20,000 |
🎯 Kết quả đạt được:
✅ Không còn trùng lặp thông tin khách hàng, sản phẩm.
✅ Dễ dàng cập nhật dữ liệu mà không ảnh hưởng đến các bảng khác.
✅ Đảm bảo tính toàn vẹn và tối ưu hiệu suất khi truy vấn dữ liệu.
Bài tập thực hành: Quản lý phòng khám tư nhân
Một phòng khám tư nhân muốn tổ chức dữ liệu bệnh nhân, bác sĩ và lịch khám bệnh sao cho tối ưu, tránh trùng lặp thông tin và dễ dàng truy vấn.
1. Dữ liệu ban đầu (chưa chuẩn hóa - UNF)
| Mã phiếu khám | Ngày khám | Mã bệnh nhân | Tên bệnh nhân | Địa chỉ | Mã bác sĩ | Tên bác sĩ | Chuyên khoa | Bệnh chẩn đoán | Mã thuốc | Tên thuốc | Liều lượng | Đơn giá | Tổng tiền |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| PK001 | 05/08 | BN001 | Trần Văn A | Hà Nội | BS001 | Nguyễn Văn B | Nội khoa | Cảm cúm | TH001 | Paracetamol | 2 viên/ngày | 5,000 | 10,000 |
| PK001 | 05/08 | BN001 | Trần Văn A | Hà Nội | BS001 | Nguyễn Văn B | Nội khoa | Cảm cúm | TH002 | Vitamin C | 1 viên/ngày | 3,000 | 3,000 |
| PK002 | 06/08 | BN002 | Lê Thị C | TP.HCM | BS002 | Phạm Thị D | Da liễu | Dị ứng da | TH003 | Loratadine | 1 viên/ngày | 7,000 | 7,000 |
| PK003 | 07/08 | BN003 | Nguyễn Văn E | Đà Nẵng | BS001 | Nguyễn Văn B | Nội khoa | Viêm họng | TH001 | Paracetamol | 2 viên/ngày | 5,000 | 10,000 |
2. Yêu cầu chuẩn hóa dữ liệu
- Xác định vấn đề trùng lặp dữ liệu.
- Xác định khóa chính (PK) và khóa ngoại (FK) phù hợp.
- Phân tách dữ liệu thành các bảng chuẩn hóa (tối thiểu chuẩn 3NF).
3. Nộp bài bằng cách soạn trực tiếp hoặc file word