**++Họ và Tên:++** Lê Phước Phát **++MSSV:++** 22127322 **++Lớp:++** 22CLC10 **++Ngày:++** 23/03/2024 --- <center><p> <b>TUẦN 08 - ĐỀ ÔN TẬP CUỐI KỲ #2</b> </p><p> <b>Môn: Cơ sở dữ liệu</b> </p></center> Lược đồ CSDL sau được sử dụng cho Câu $1$, $2$ và $3$. Hair Beauty Salon **ABC** cần xây dựng hệ thống quản lý việc yêu cầu làm đẹp từ các khách hàng như cắt tóc, chăm sóc da, ...). Dưới đây là một phần CSDL quản lý các yêu cầu sửa chữa, trong đó mỗi lược đồ quan hệ cho trước các khoá chính (là tập thuộc tính được gạch dưới) và các tập phụ thuộc hàm định nghĩa tương ứng cho từng lược đồ quan hệ. **PHIEU_YEU_CAU** (**++MaPhieu++**, MãKH, HọTên, ĐiệnThoại, ĐịaChỉ, TGLập, TổngTiền) **++Mô tả:++** Mỗi phiếu yêu cầu có một mã phiếu (**MaPhieu**) duy nhất, thời gian lập phiếu (**TGLập**), thực hiện cho một khách hàng nào đó. Mỗi khách hàng cần lưu một mã bao gồm mã khách hàng (**MãKH**), họ tên (**HọTên**), địa chỉ (**ĐịaChỉ**), điện thoại (**ĐiệnThoại**). Mỗi phiếu yêu cầu có tổng tiền (**TổngTiền**) thực hiện và mua sản phẩm của phiếu yêu cầu đó. Tập phụ thuộc hàm được định nghĩa cho lược đồ quan hệ **PHIEU_YEU_CAU** như sau: F1 = { * f11: **MaPhieu $\to$ MãKH, HọTên, ĐiệnThoại, ĐịaChỉ, TGLập, TổngTiền**; * f12: **MãKH $\to$ HọTên, ĐiệnThoại, ĐịaChỉ** } **PHỤ_TRÁCH_DV** (**++MaPhieu, MaDV,++** TênDV, MaNV, TênNV, TGBắtĐầu, TGHoànTất, GiaTienDV) **++Mô tả:++** Mỗi phiếu yêu cầu sẽ có nhiều dịch vụ, với mỗi mã dịch vụ có một tên dịch vụ tương ứng (**TenDV**), sẽ có một nhân viên phụ trách (**mã nhân viên, tên nhân viên**), có thời gian bắt đầu (**TGBắtĐầu**) và thời gian hoàn tất (**TGHoànTất**). Một số tên dịch vụ phổ biến như: “Cắt tóc”, “Gội Đầu” ,... Tập phụ thuộc hàm được định nghĩa cho lược đồ quan hệ **PHỤ_TRÁCH_DV** như sau: F2 = { * f21: **MaPhieu, MaDV $\to$ TênDV, MaNV, TênNV, TGBắtĐầu, TGHoànTất, GiaTienDV**; * f22: **MaDV $\to$ TenDV**; * f23: **MaNV $\to$ TênNV** } **SAN_PHAM** (**++MaSP,++** TênSP, GiáTiền) **++Mô tả:++** Mỗi sản phẩm sẽ có một mã sản phẩm (**MaSP**) duy nhất, tên và giá tiền mặc định tương ứng trên một đơn vị sản phẩm. Tập phụ thuộc hàm được định nghĩa cho lược đồ quan hệ **SAN_PHAM** như sau: F3 = { * f31: **MaSP $\to$ TênSP, GiáTiền** } **CT_SANPHAM** (**++MaPhieu, MaSP,++** SốLượng, GiáTiền, ThànhTiền) **++Mô tả:++** Danh sách sản phẩm được sử dụng mỗi phiếu dịch vụ của khách hàng. Mỗi phiếu yêu cầu có thể sử dụng nhiều sản phẩm với số lượng (**SốLượng**), giá bán (**GiáTiền**) và thành tiền (**ThànhTiền**) tương ứng. Tập phụ thuộc hàm được định nghĩa cho lược đồ quan hệ **CT_SANPHAM** như sau: F4 = { * f41: **MaPhieu, MaSP $\to$ SốLượng, ĐơnGiá, ThànhTiền** } --- ++==**CÂU HỎI:**==++ **Câu 1.** Hãy biểu diễn các yêu cầu truy vấn sau bằng cả $2$ ngôn ngữ đại số quan hệ và SQL *(3.0 điểm)* 1. Cho biết danh sách những phiếu yêu cầu có sử dụng dịch vụ tên **“Cắt tóc”** và có mua sản phẩm có tên **“Dầu gội đầu Dove”**. Xuất ra ++mã phiếu, ngày lập phiếu, họ tên++ và ++điện thoại++ của khách hàng. * Ngôn ngữ SQL: ```sql= select pyc.MaPhieu, pyc.TGLap, pyc.HoTen, pyc.DienThoai from PHIEU_YEU_CAU pyc join PHU_TRACH_DV ptdv on pyc.MaPhieu = ptdv.MaPhieu join CT_SANPHAM ct_sp on ct_sp.MaPhieu = pyc.MaPhieu join SAN_PHAM sp on sp.MaSP = ct_sp.MaSP where ( ptdv.TenDV = N'Cắt tóc' and sp.TenSP = N'Dầu gội đầu Dove' ) ``` * Đại số quan hệ: * ${\bf r_1} \gets \Pi_{\text{MaPhieu}}(\sigma_{\text{TenDV = 'Cắt tóc'}}(\text{PHU_TRACH_DV} \bowtie \text{PHIEU_YEU_CAU}))$ * ${\bf r_2} \gets \Pi_{\text{MaPhieu, MaSP}}({\bf r_1} \bowtie \text{CT_SANPHAM})$ * ${\bf r_3} \gets \Pi_{\text{MaPhieu}}(\sigma_{\text{TenSP = 'Dầu gội đầu Dove'}}({\bf r_2} \bowtie \text{SAN_PHAM}))$ * $\text{KQ} \gets \Pi_{\text{MaPhieu, TGLap, HoTen, DienThoai}}({\bf r_3} \bowtie \text{PHIEU_YEU_CAU})$ 2. Cho biết **số tổng thành tiền** sử dụng sản phẩm của những phiếu yêu cầu sử dụng từ $2$ sản phẩm trở lên, không sử dụng dịch vụ tên **“Cắt tóc”**. Xuất ra ++mã phiếu, thời gian lập phiếu, họ tên, tổng tiền sử dụng++ sản phẩm. * Ngôn ngữ SQL: ```sql= select (pyc.MaPhieu, pyc.TGLap, pyc.HoTen, sum(ct_sp.ThanhTien) as [TongTienSP]) from PHIEU_YEU_CAU pyc join PHU_TRACH_DV ptdv on ptdv.MaPhieu = pyc.MaPhieu join CT_SANPHAM ct_sp on ct_sp.MaPhieu = pyc.MaPhieu where ptdv.TenDV not like N'%Cắt tóc%' group by pyc.MaPhieu, pyc.TGLap, pyc.HoTen having count(ct_sp.MaSP) >= 2 ``` * Đại số quan hệ: * ${\bf r_1} \gets \sigma_{\text{TenDV <> 'Cắt tóc'}}(\text{PHU_TRACH_DV})$ * ${\bf r_2} \gets (\text{PHIEU_YEU_CAU} \bowtie {\bf r_1}) \bowtie \text{CT_SANPHAM}$ * ${\bf r_3}(\text{MaPhieu, TGLap, HoTen, SoSP, TongTienSP}) \gets _{\text{MaPhieu, TGLap, HoTen}}\mathfrak{J}_{\text{COUNT(MaSP), SUM(ThanhTien)}}({\bf r_2})$ * $\text{KQ} \gets \sigma_{\text{SoSP} \geq 2}({\bf r_3})$ **Câu 2.** Hãy xác định bối cảnh, nội dung bằng ngôn ngữ hình thức và bảng tầm ảnh hưởng của RBTV sau *(1.5 điểm)*: **“Thời gian bắt đầu thực hiện của các dịch vụ trong phiếu yêu cầu phải sau thời gian lập phiếu và trước thời gian hoàn tất”** * Loại RBTV: ràng buộc toàn vẹn liên quan hệ liên thuộc tính và liên thuộc tính liên quan đến một quan hệ * Bối cảnh: **PHIEU_YEU_CAU**, **PHU_TRACH_DV** * Nội dung biểu diễn bằng ngôn ngữ hình thức: $$(\forall \text{t})(\text{PHIEU_YEU_CAU(t)} \wedge (\forall \text{s})(\text{PHU_TRACH_DV(s)} $$$$\wedge \text{(s.TGBatDau <= s.TGHoanTat)} $$$$\wedge \text{(s.MaPhieu = t.MaPhieu)} \implies \text{(s.TGBatDau >= t.TGLap)}))$$ * Bảng tầm ảnh hưởng: | IC01 | Thêm | Xóa | Sửa | |:-------------:|:----:|:---:|:-----------------------:| | PHIEU_YEU_CAU | - | - | + (TGLap) | | PHU_TRACH_DV | + | - | + (TGBatDau, TGHoanTat) | **Câu 3.** Đánh giá chất lượng lược đồ CSDL *(1.5 điểm)*: 1. Hãy chỉ ra những điểm trùng lặp dữ liệu trên lược đồ CSDL trên. * Những điềm trùng lặp dữ liệu trên lược đồ CSDL trên là: * Quan hệ **PHIEU_YEU_CAU** có sự trùng lặp vì: **PHIEU_YEU_CAU** trùng lặp trên tập thuộc tính **{MaKH, HoTen, DienThoai, DiaChi}**, do tồn tại một phụ thuộc hàm: **MaKH $\to$ HoTen, DienThoai, DiaChi** * Quan hệ **PHU_TRACH_DV** có sự trùng lắp vì: **PHU_TRACH_DV** trùng lặp trên tập thuộc tính **{MaNV, TenNV}** và **{MADV, TenDV}**, do tồn tại các phụ thuộc hàm: * **MaNV $\to$ TenNV** * **MaDV $\to$ TenDV** 2. Hãy xác định dạng chuẩn của từng lược đồ quan hệ? Giải thích và kết luận dạng chuẩn của lược đồ CSDL. * **PHIEU_YEU_CAU** (**++MaPhieu++**, MãKH, HọTên, ĐiệnThoại, ĐịaChỉ, TGLập, TổngTiền) * Xác định dạng chuẩn của lược đồ quan hệ: dạng chuẩn 2 * Giải thích: do có phụ thuộc hàm bắc cầu vào khóa **(MaPhieu $\to$ MaKH ; MaKH $\to$ HoTen, DienThoai, DiaChi)** * **PHỤ_TRÁCH_DV** (**++MaPhieu, MaDV,++** TênDV, MaNV, TênNV, TGBắtĐầu, TGHoànTất, GiaTienDV) * Xác định dạng chuẩn của lược đồ quan hệ: dạng chuẩn 1 * Giải thích: do vi phạm chuẩn 2, do có phụ thuộc hàm không phụ thuộc đầy đủ vào khóa **(MaDV $\to$ TenDV)** * **SAN_PHAM** (**++MaSP,++** TênSP, GiáTiền) * Xác định dạng chuẩn của lược đồ quan hệ: dạng chuẩn BCNF * Giải thích: theo định nghĩa, lược đồ chỉ có 1 phụ thuộc hàm và vế trái là khóa / siêu khóa **(MaSP $\to$ TenSP, GiaTien)** * **CT_SANPHAM** (**++MaPhieu, MaSP,++** SốLượng, GiáTiền, ThànhTiền) * Xác định dạng chuẩn của lược đồ quan hệ: dạng chuẩn BCNF * Giải thích: theo định nghĩa, lược đồ chỉ có 1 phục thuộc hàm và vế trái là khóa / siêu khóa **(MaPhieu, MaSP $\to$ SoLuong, DonGia, ThanhTien)** * **Kết luận của lược đồ CSDL trên:** * Xác định dạng chuẩn của lược đồ quan hệ: dạng chuẩn 1 * Giải thích: do dạng chuẩn thấp nhất trong 4 bảng là dạng chuẩn 1 **(PHU_TRACH_DV)** 3. Hãy chuẩn hóa các lược đồ quan hệ để lược đồ CSDL đạt được dạng chuẩn BCNF. * Chuẩn hóa các lược đồ dạng chuẩn thấp (từ thấp nhất đến cao nhất) * Chuẩn hóa quan hệ **PHIEU_YEU_CAU**: dùng phương pháp tách bảng * PHIEU_YEU_CAU(**++MaPhieu++**, MaKH, TGLap, TongTien) * Xác định dạng chuẩn: dạng chuẩn BCNF * Giải thích: theo định nghĩa, lược đồ chỉ có 1 phụ thuộc hàm và vế trái là khóa / siêu khóa (**MaPhieu $\to$ MaKH, TGLap, TongTien**) * KHACH_HANG(**++MaKH++**, HoTen, DienThoai, DiaChi) * Xác định dạng chuẩn: dạng chuẩn BCNF * Giải thích: theo định nghĩa, lược đồ chỉ có 1 phụ thuộc hàm và vế trái là khóa / siêu khóa (**MaKH $\to$ HoTen, DienThoai, DiaChi**) * Chuẩn hóa quan hệ **PHU_TRACH_DV**: dùng phương pháp tách bảng * PHU_TRACH_DV(**++MaPhieu++**, **++MaDV++**, MaNV, TGBatDau, TGHoanTat, GiaTienDV) * Xác định dạng chuẩn: dạng chuẩn BCNF * Giải thích: theo định nghĩa, lược đồ chỉ có 1 phụ thuộc hàm và vế trái là khóa / siêu khóa (**MaPhieu, MaDV $\to$ MaNV, TGBatDau, TGHoanTat, GiaTienDV**) * DICH_VU(**++MaDV++**, TenDV) * Xác định dạng chuẩn: dạng chuẩn BCNF * Giải thích: theo định nghĩa, lược đồ chỉ có 1 phụ thuộc hàm và vế trái là khóa / siêu khóa (**MaDV $\to$ TenDV**) * NHANVIEN(**++MaNV++**, TenNV) * Xác định dạng chuẩn: dạng chuẩn BCNF * Giải thích: theo định nghĩa, lược đồ chỉ có 1 phụ thuộc hàm và vế trái là khóa / siêu khóa (**MaNV $\to$ TenNV**) * Sau khi tách bảng, mỗi lược đồ quan hệ còn 1 phụ thuộc hàm và thỏa điều kiện của dạng chuẩn BCNF * Lược đồ CSDL đạt BCNF vì tất cả lược đồ quan đạt dạng chuẩn BCNF.