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.idNhacsi tham chiếu đến idNhacsi trong bảng nhacsi.
  • banthuam.idBannhac tham chiếu đến idBannhac trong bảng bannhac.
  • banthuam.idCasi tham chiếu đến idCasi trong bảng casi.
  • 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 INTAUTO_INCREMENT (tự động tăng).
  • Các trường tên (tenNhacsi, tenCasi, tenBannhac) chọn kiểu VARCHAR(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 nhacsicasi, 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 nhacsicasi. 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.idTinhthanhcasi.idTinhthanh là khoá ngoài tham chiếu đến idTinhthanh trong bảng tinhthanh.

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ểu INT, AUTO_INCREMENT).
  • Khoá ngoài: quanhuyen.idTinhthanh tham chiếu đến idTinhthanh trong bảng tinhthanh.
  • 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ạ:

idTinhthanhtenTinhthanh
1Hà Nội
2Hải Phòng
idQuanhuyentenQuanhuyenidTinhthanh
1Ba Đình1
2Hoàn Kiếm1
3Hồng Bàng2

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é.

Chế độ đọc sách →