Một danh sách dễ ghi nhưng khó sửa
Xét một **ví dụ âm nhạc hư cấu** mở rộng từ Bài 17. Cần quản lí mỗi bản thu gồm tên bài, nhạc sĩ sáng tác và ca sĩ thể hiện. Bốn bản thu là:
| Mã bản thu | Tên bài | Nhạc sĩ | Ca sĩ |
|---|---|---|---|
| R01 | Mưa đầu mùa | Mai An | Linh Chi |
| R02 | Mưa đầu mùa | Mai An | Quang Minh |
| R03 | Ngày nắng | Mai An | Linh Chi |
| R04 | Đêm yên | Hà Vy | Quang Minh |
Ban đầu có thể lập một bảng `banthuam(idBanthuam, tenBannhac, tenNhacsi, tenCasi)`. `idBanthuam` xác định từng bản thu, nên là **khóa chính**. Mã R01 khác R02 dù cùng bài: mỗi hàng nói về một lần thể hiện theo phạm vi bài toán. Bảng gộp đủ thông tin để đọc, nhưng tên “Linh Chi” và “Quang Minh” bị ghi nhiều lần.
Tách tên ca sĩ, giữ mã để nối
Nếu cần sửa cách ghi tên Linh Chi, bảng gộp phải sửa cả R01 và R03. Sửa sót một hàng sẽ làm dữ liệu không thống nhất. Hãy lập bảng `casi(idCasi, tenCasi)` với C01 = Linh Chi, C02 = Quang Minh. Trong `banthuam`, thay tên ca sĩ bằng `idCasi`: R01/R03 mang C01, R02/R04 mang C02.
`idCasi` ở bảng **casi** là khóa chính; `idCasi` ở bảng **banthuam** là **khóa ngoại** tham chiếu khóa ấy. Khi đọc R03, tra C01 ở casi để biết ca sĩ là Linh Chi. Khi tên cần chỉnh, sửa một hàng C01; các bản thu vẫn nối bằng mã. Việc tách bảng có ích khi mã và quan hệ được nhập, kiểm đúng; chỉ đổi tên cột mà không nối dữ liệu thì chưa giải quyết được vấn đề.
Bài luyện
Trong bảng gộp banthuam, vì sao idBanthuam phù hợp làm khóa chính?
R01–R04 là các mã riêng cho từng hàng.
Hai bản thu cùng bài vẫn là hai hàng khác nhau.
Mã bản thu không chứa tên nhạc sĩ.
Mã bản thu và mã ca sĩ phục vụ hai đối tượng khác nhau.
Lời giải
Khóa chính cần phân biệt từng bản ghi. R01 và R02 là hai bản thu, nên mỗi bản thu dùng một idBanthuam riêng.
Bài luyện
Trong ví dụ, nếu tên Linh Chi cần sửa ở bảng gộp, phải kiểm những hàng nào?
R03 cũng ghi tên Linh Chi.
Cả R01 lẫn R03 có cùng ca sĩ này.
R02/R04 ghi Quang Minh.
R04 ghi Quang Minh.
Lời giải
Tên Linh Chi lặp ở R01 và R03. Nếu chỉ sửa một hàng, cùng một ca sĩ sẽ có hai cách ghi.
Bài luyện
Sau khi tách bảng casi, idCasi ở banthuam có vai trò gì?
Mã ca sĩ không phải tên bài.
idCasi ở casi mới là khóa chính của casi.
Mã ở bản thu tham chiếu hàng ca sĩ.
Hai mã thuộc hai đối tượng, không phải bằng nhau.
Lời giải
idCasi trong banthuam chỉ tới idCasi của casi. Nhờ đó bản thu R03 mang C01 có thể tra ra tên ca sĩ Linh Chi.
Đang học