Mã định danh, mã tham chiếu và cặp không trùng
Mỗi bảng có một khóa chính theo mã của đối tượng: `casi.idCasi`, `nhacsi.idNhacsi`, `bannhac.idBannhac`, `banthuam.idBanthuam`. Khóa ngoại đi từ bảng giữ mã sang bảng có khóa chính: `bannhac.idNhacsi → nhacsi.idNhacsi`; `banthuam.idBannhac → bannhac.idBannhac`; `banthuam.idCasi → casi.idCasi`. Ví dụ R04 mang K03/C02; cả K03 và C02 phải tồn tại trong bảng được tham chiếu.
Trong **phạm vi bài toán này**, mỗi tên bài của cùng một nhạc sĩ chỉ ghi một hàng, nên cặp `(tenBannhac, idNhacsi)` ở bannhac không được trùng. SGV còn quy ước một ca sĩ chỉ có một bản thu cho cùng một bài; vì thế cặp `(idBannhac, idCasi)` ở banthuam không được trùng. Đó là quy tắc của mô hình đang học, không phải quy luật âm nhạc: nếu cần lưu nhiều lần thu của cùng cặp bài–ca sĩ, phải thêm thông tin phân biệt như mã phiên bản hoặc ngày thu trước khi đặt ràng buộc.
Kiểu dữ liệu phải khớp ý nghĩa
SGK gợi ý dùng `INT` cho mã tự tăng và `VARCHAR(255)` cho tên. Đó là **một cách triển khai**, không bắt buộc mọi CSDL đều dùng đúng kiểu hay độ dài ấy. Ví dụ ở đây dùng mã dễ đọc K01/C01/N01/R01 nên khi tạo bảng thật phải chọn kiểu chuỗi phù hợp như `VARCHAR(3)` và bảo đảm khóa ngoại cùng kiểu với mã được tham chiếu; không thể khai báo mã K01 là `INT` rồi nhập chữ K.
Khóa chính không được trống và không được trùng. Khóa ngoại dùng để giữ quan hệ đúng nếu hệ QTCSDL thực thi ràng buộc. `UNIQUE` trên hai trường là kiểm **cặp giá trị**, không đòi mỗi cột riêng lẻ duy nhất: K01/C01 và K01/C02 đều hợp lệ, còn thêm một bản thu khác cũng K01/C01 sẽ trái quy ước của bài. Trước khi tạo bảng ở Bài 19–20, phải thống nhất mã, kiểu và quy tắc; ảnh SGK89 có một mã nhạc sĩ sai so với bảng nhacsi, nên không chép mã ấy vào dữ liệu thực hành.
Bài luyện
Ở bảng banthuam, trường nào là khóa ngoại trỏ đến bảng bannhac?
idBanthuam là khóa chính của bản thu.
idBannhac nối bản thu với bài hát.
idCasi trỏ đến bảng casi.
banthuam sau tách không giữ tên bài.
Lời giải
banthuam.idBannhac tham chiếu bannhac.idBannhac; đó là đường từ một bản thu tới bài hát.
Bài luyện
Theo quy ước mỗi ca sĩ chỉ có một bản thu cho cùng bài, cặp nào cần không trùng trong banthuam?
idBanthuam đã riêng cho từng hàng nên cặp này không diễn đạt quy ước.
idBanthuam đã riêng cho từng hàng.
Cặp bài–ca sĩ xác định một bản thu trong phạm vi giả định.
Cặp này thuộc bannhac, không thuộc banthuam.
Lời giải
UNIQUE(idBannhac, idCasi) chặn một bản thu thứ hai có cùng bài và cùng ca sĩ theo quy ước SGV. Nếu bài toán đổi, phải đổi quy tắc.
Bài luyện
Ví dụ dùng mã K01/C01/N01 dạng chữ và số. Cách chọn kiểu nào nhất quán khi tạo bảng?
K01 là chuỗi; kiểu ở hai đầu liên kết cần tương thích.
INT không lưu nguyên mã chữ K01.
Ngày thu là một thuộc tính khác, không phải kiểu của mã.
Mã K01 ở khóa chính và khóa ngoại cần tương thích.
Lời giải
SGK dùng mã số tự tăng như một ví dụ. Với mã K01, chọn kiểu chuỗi phù hợp cho cả bannhac.idBannhac và banthuam.idBannhac.
Đang học