### **++Câu 1++**:
**KHACHHANG(++MaKH++, HoTen, NgaySInh, DiaChi, DienThoai, MaShop)**
**SANPHAM(++MaSP, DanhMuc++, TenSP, DonGia, SoLuongTon, KhuyenMai, MaShop)**
++FK:++
DanhMuc $\longrightarrow$ DANHMUC(MaDM)
**DANHMUC(++MaDM++, TenDanhMuc, DanhMucCha)**\
++FK:++
DanhMucCha $\longrightarrow$ DANHMUC(MaDM)
**DONHANG(++MaDH, MaKH++, NgayMua, TinhTrangThanhToan, DaGiao)**
++FK:++
MaKH $\longrightarrow$ KHACHHANG(MaKH)
**CT_DONHANG(++MaDH, MaKH++, MaSP, MaDM, SoLuong, DonGia)**
++FK:++
MaDH $\longrightarrow$ DONHANG(MaDH)
MaKH $\longrightarrow$ DONHANG(MaKH)
MaSP $\longrightarrow$ SANPHAM(MaSP)
MaDM $\longrightarrow$ DANHMUC(MaDM)
**THEODOIDH(++MaDH++, MaKH, ThoiGian, TinhTrang)**
++FK:++
MaDH $\longrightarrow$ CT_DONHANG(MaDH)
MaKH $\longrightarrow$ CT_DONHANG(MaKH)
### **++Câu 2:++**
**a. (SQL) Cho biết khách hàng (MaKH, HoTen, DiaChi, DienThoai) mua sản phẩm "IPhone 13" trong tháng này.**
```sql=
select kh.MaKH, kh.HoTen, kh.DiaChi, kh.DienThoai
from KhachHang kh
join DonHang dh on kh.MaKH = dh.MaKH
join CT_DonHang ct on dh.MaDH = ct.MaDH
join SanPham sp on (ct.MaSP = sp.MaSP and ct.MaDM = sp.DanhMuc)
where (sp.TenSP = N'IPhone 13' and GETMONTH(dh.NgayMua) = GETMONTH(GETDATE()))
```
**b. (SQL) Cho biết sản phẩm (MaSP, TenSP) hoặc thuốc tính danh mục chưa có danh mục cha hoặc được nhiều khách hàng có mã shop yêu thích là "ShopHoaDao" mua nhất**
```sql=
select sp1.MaSP, sp1.TenSP
from SanPham sp1
join DanhMuc dm1 on dm1.MaDM = sp1.DanhMuc
where dm1.DanhMucCha is null or (
select kh.MaKH
from KhachHang kh
join DonHang dh on kh.MaKH = dh.MaKH
join CT_DonHang ct on (ct.MaDH = dh.MaDH and ct.MaKH = dh.MaKH)
join SanPham sp on (sp.MaSP = ct.MaSP and sp.DanhMuc = ct.MaDM)
where kh.MaShop = N'ShopHoaDao'
group by kh.MaKH
having count(distinct sp.MaSP) >= ALL(
select count(distinct sp2.MaSP)
from KhachHang kh2
join DonHang dh2 on kh2.MaKH = dh2.MaKH
join CT_DonHang ct2 on (ct2.MaDH = dh2.MaDH and ct2.MaKH = dh2.MaKH)
join SanPham sp2 on (sp2.MaSP = ct2.MaSP and sp2.DanhMuc = ct2.MaDM)
where kh2.MaShop = N'ShopHoaDao'
group by kh2.MaKH
)
)
```
**c. (DSQH) Cho biết danh sách đơn hàng đặt trong tuần này, đã thanh toán hoặc chưa được thanh toán**
$\text{R1} \leftarrow \sigma_{\text{TinhTrangThanhToan = 0} \vee \text{TinhTrangThanhToan = 1}}\text{(DONHANG)}$
**d. (DSQH) Cho biết tên khách hàng mua tất cả sản phẩm chưa được ai mua**
$\text{R1(MaSP, SL_Mua)} \leftarrow _{\text{MaSP}}\xi_{\text{count(MaKH)}}(\text{SANPHAM} \bowtie \text{CT_DONHANG})$
$\text{R2} \leftarrow \Pi_{\text{MaSP}}(\sigma_{\text{SL_Mua = 1}}\text{(R1)})$
$\text{R3} \leftarrow \text{KHACHHANG} \bowtie \text{CT_DONHANG} \bowtie \text{SANPHAM}$
$\text{R4} \leftarrow \Pi_{\text{HoTen}}(\text{R3} \div \text{R2})$
### **++Câu 3:++**
**a. Khách hàng chỉ được mua tối đa 5 sản phẩm đang được khuyến mãi**
Bối cảnh: CT_DONHANG, SANPHAM
Nội dung:
$\text{R1} \leftarrow \sigma_{\text{KhuyenMai = 1}}\text{(SANPHAM)}$
$\text{R2(MaKH, SL)} \leftarrow _{\text{MaKH}}\xi_{\text{ count(MaSP)}}\text{(CT_DONHANG * R1)}$
$(\forall t)(\text{R2(t)} \land \text{t.SL} \leq 5)$
Bảng tầm ành hưởng:
|IC01|T|X|S|
|:-:|:-:|:-:|:-:|
|CT_DONHANG|+|-|+(MaKH, MaSP)|
|SANPHAM|-|-|+(KhuyenMai)|
**b. Thuộc tính DaGiao trong DONHANG là 1 khi TinhTrang theo dõi đơn hàng là "đã giao"**
Bối cảnh: DONHANG, THEODOIDH
Nội dung:
$(\forall t)(\text{DONHANG(t)} \land (\exists s)(\text{THEODOIDH(s)} \land \text{t.MaDH = s.MaDH} \land \text{s.TinhTrang = 1} \Rightarrow \text{t.DaGiao = 1})$
Bảng tầm ảnh hưởng:
|IC02|T|X|S|
|:-:|:-:|:-:|:-:|
|DONHANG|+|-|+(TinhTrang)|
|THEODOIDH|-|+|+(DaGiao)|
### **++Câu 4:++**
**GIAODICHNGANHANG(MaKH, TenKH, DiaChi, ++SoTaiKhoan++, SoDuTaiKhoan, NgayMoTaiKhoan, ++ThoiGianGiaoDich++, LoaiGiaoDich, SoTienGiaoDich)**
F = { MaKH $\rightarrow$ TenKH, DiaChi;
SoTaiKhoan $\rightarrow$ SoDuTaiKhoan, MaKH, NgayMoTaiKhoan
SoTaiKhoan, ThoiGianGiaoDich $\rightarrow$ LoaiGiaoDich, SoTienGiaoDich}
GIAODICHNGANHANG(MaKH, TenKH, DiaChi, ++SoTaiKhoan++, SoDuTaiKhoan, NgayMoTaiKhoan, ++ThoiGianGiaoDich++, LoaiGiaoDich, SoTienGiaoDich): đạt dạng chuẩn 1 vì tồn tại phụ thuộc hàm không phụ thuộc hoàn toàn vào khóa (MaKH $\rightarrow$ TenKH; SoTaiKhoan $\rightarrow$ SoDuTaiKhoan, MaKH, NgayMoTaiKhoan; SoTaiKhoan, ThoiGianGiaoDich $\rightarrow$ LoaiGiaoDich, SoTienGiaoDich)
Chuẩn hóa lược đồ có dạng chuẩn thấp
Chuẩn hóa GIAODICHNGANHANG: tách bảng
KHACHHANG (++MaKH++, TenKH, DiaChi) → BCNF
STK (MaKH, ++SoTaiKhoan++, SoDuTaiKhoan, NgayMoTaiKhoan) → BCNF
GIAODICH (++SoTaiKhoan, ThoiGianGiaoDich++, LoaiGiaoDich, SoTienGiaoDich) → BCNF
$\Rightarrow$ Lược đồ CSDL đạt dạng chuẩn BCNF vì tất cả lược đồ quan hệ đạt dạng chuẩn BCNF