### **++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