Giải Tin Học trang 90
Lời giải chi tiết SGK Lớp 11 · Môn Tin Há»c · Trang 90–91
Mình đã đọc kỹ hai trang sách (thực tế ảnh là trang 89 và 90 của bài 18 – Thực hành xác định cấu trúc bảng và các trường khoá chính). Dưới đây là tóm tắt lý thuyết và lời giải chi tiết các bài tập nhé.
Tóm tắt lý thuyết
Bài học nói về việc tổ chức lại CSDL website âm nhạc thành 4 bảng có quan hệ với nhau:
casi(idCasi, tenCasi)
nhacsi(idNhacsi, tenNhacsi)
bannhac(idBannhac, tenBannhac, idNhacsi)
banthuam(idBanthuam, idBannhac, idCasi)
(Trường gạch chân là khoá chính.)
Các loại khoá:
- Khoá chính (Primary Key): mỗi bảng có một khoá chính, định danh duy nhất cho từng bản ghi.
- Khoá ngoài (Foreign Key):
bannhac.idNhacsitham chiếu đếnidNhacsitrong bảngnhacsi.banthuam.idBannhactham chiếu đếnidBannhactrong bảngbannhac.banthuam.idCasitham chiếu đếnidCasitrong bảngcasi.- Khoá cấm trùng lặp (Unique): cặp
(tenBannhac, idNhacsi)và cặp(idBannhac, idCasi)không được trùng lặp.
Về kiểu dữ liệu:
- Trường khoá chính thường có kiểu
INTvàAUTO_INCREMENT(tự động tăng). - Các trường tên (
tenNhacsi,tenCasi,tenBannhac) chọn kiểuVARCHAR(255).
Lợi ích chính của cách tổ chức này: tránh dư thừa dữ liệu, dễ cập nhật, tránh sai sót, đảm bảo tính nhất quán.
Câu hỏi giữa bài: Lợi ích của việc tổ chức CSDL âm nhạc theo các bảng
Lợi ích khi tách thành nhiều bảng có quan hệ:
- Tránh trùng lặp, dư thừa dữ liệu: tên nhạc sĩ, ca sĩ chỉ lưu một lần ở bảng riêng, các bảng khác chỉ tham chiếu bằng id.
- Tiết kiệm bộ nhớ vì lưu số (id) thay vì lặp lại chuỗi tên dài.
- Dễ cập nhật, sửa đổi: khi đổi tên một nhạc sĩ chỉ cần sửa ở một chỗ trong bảng
nhacsi. - Đảm bảo tính nhất quán, toàn vẹn dữ liệu nhờ ràng buộc khoá ngoài và khoá cấm trùng lặp.
- Hỗ trợ truy vấn, tìm kiếm và thống kê thuận lợi hơn (quan hệ nhiều–nhiều giữa bài hát và ca sĩ được mô tả qua bảng
banthuam).
Luyện tập
Bài 1: Thêm thông tin ngày sinh của nhạc sĩ, ca sĩ
Đề: Có thể có những nhạc sĩ, ca sĩ trùng tên nên người ta muốn quản lí thêm thông tin ngày sinh của các nhạc sĩ, ca sĩ. Để làm được việc đó, CSDL cần thay đổi như thế nào?
Lời giải:
Chỉ cần thêm một trường ngày sinh vào hai bảng nhacsi và casi, không cần tạo bảng mới (vì mỗi nhạc sĩ/ca sĩ có đúng một ngày sinh).
Cấu trúc mới:
nhacsi(idNhacsi, tenNhacsi, ngaysinhNhacsi)
casi(idCasi, tenCasi, ngaysinhCasi)
- Trường ngày sinh nên dùng kiểu dữ liệu
DATE. - Khi đó, hai nhạc sĩ (hoặc ca sĩ) trùng tên vẫn phân biệt được nhờ id và ngày sinh.
Giải thích: Ngày sinh là thuộc tính riêng phụ thuộc trực tiếp vào từng nhạc sĩ/ca sĩ, nên đặt ngay trong bảng tương ứng là hợp lý nhất, không gây dư thừa.
Bài 2: Thêm thông tin nơi sinh (tên tỉnh/thành phố)
Đề: Nếu muốn quản lí thêm thông tin nơi sinh của nhạc sĩ, ca sĩ (tên tỉnh/thành phố), CSDL cần thay đổi như thế nào?
Lời giải:
Có hai cách, nhưng cách tốt hơn là tách riêng bảng tỉnh/thành phố.
Cách 1 (đơn giản nhưng dễ dư thừa): thêm thẳng trường noisinh kiểu VARCHAR vào bảng nhacsi và casi. Nhược điểm: tên tỉnh bị lặp nhiều lần, dễ nhập sai chính tả, khó cập nhật đồng bộ.
Cách 2 (khuyến nghị – đúng tinh thần bài học): tạo thêm một bảng tinhthanh rồi tham chiếu bằng khoá ngoài.
tinhthanh(idTinhthanh, tenTinhthanh)
nhacsi(idNhacsi, tenNhacsi, idTinhthanh)
casi(idCasi, tenCasi, idTinhthanh)
nhacsi.idTinhthanhvàcasi.idTinhthanhlà khoá ngoài tham chiếu đếnidTinhthanhtrong bảngtinhthanh.
Giải thích: Một tỉnh/thành phố có thể là nơi sinh của rất nhiều người. Nếu lưu trực tiếp tên tỉnh sẽ lặp lại và dễ sai sót. Tách thành bảng riêng giúp tránh dư thừa, dễ cập nhật và đảm bảo nhất quán – đúng nguyên tắc tổ chức CSDL đã học.
Vận dụng
Đề: Thực hiện các bước phân tích để thiết lập mô hình dữ liệu cho một bài toán quản lí thực tế, ví dụ quản lí danh sách tên quận/huyện của các tỉnh thành phố.
Lời giải gợi ý:
Phân tích bài toán: một tỉnh/thành phố có nhiều quận/huyện, nhưng mỗi quận/huyện chỉ thuộc một tỉnh/thành phố (quan hệ một–nhiều).
Bước 1 – Xác định các thực thể:
- Tỉnh/thành phố
- Quận/huyện
Bước 2 – Thiết kế các bảng:
tinhthanh(idTinhthanh, tenTinhthanh)
quanhuyen(idQuanhuyen, tenQuanhuyen, idTinhthanh)
Bước 3 – Xác định khoá:
- Khoá chính:
idTinhthanh,idQuanhuyen(kiểuINT,AUTO_INCREMENT). - Khoá ngoài:
quanhuyen.idTinhthanhtham chiếu đếnidTinhthanhtrong bảngtinhthanh. - Khoá cấm trùng lặp: cặp
(tenQuanhuyen, idTinhthanh)nên là Unique (trong cùng một tỉnh không có hai quận/huyện trùng tên).
Bước 4 – Kiểu dữ liệu các trường tên: VARCHAR(255).
Ví dụ minh hoạ:
| idTinhthanh | tenTinhthanh |
|---|---|
| 1 | Hà Nội |
| 2 | Hải Phòng |
| idQuanhuyen | tenQuanhuyen | idTinhthanh |
|---|---|---|
| 1 | Ba Đình | 1 |
| 2 | Hoàn Kiếm | 1 |
| 3 | Hồng Bàng | 2 |
Mô hình này áp dụng đúng các nguyên tắc đã học: tách bảng theo thực thể, dùng khoá ngoài để biểu diễn quan hệ và tránh dư thừa dữ liệu.
Nếu bạn gửi đúng ảnh trang 91 (phần còn lại của bài), mình sẽ bổ sung lời giải cho các nội dung trên trang đó nhé.
