Cách xác định primary key của quan hệ n-n?
Em có:
ChuyenNganh(MaCN, TenCN)
MonHoc(MaMH, TenMH)
1 chuyên ngành có nhiều môn học, 1 môn học lại thuộc nhiều chuyên ngành. Ví dụ ngành CNTT có môn Kỹ thuật vi xử lý, môn này học vào học kỳ 1 năm 3, ngành ATTT cũng có môn Kỹ thuật vi xử lý nhưng lại được học vào học kỳ 2 năm 3. Tuy nhiên đó là chương trình dạy của 10 năm trước, hiện giờ nhà trường đã thay đổi, ngành CNTT sẽ học KTVXL vào kỳ 2 năm 2, rồi ngành ATTT thì học vào kỳ 1 năm 3.
Do là quan hệ nhiều nhiều nên em sinh ra 1 table mới là KeHoachGiang(MaCN, MaMH, KyHoc, NamHoc, NgayApDung), trong đó KyHoc và NamHoc sẽ cho biết môn đấy của chuyên ngành đấy sẽ học vào kỳ nào năm nào, còn NgayApDung thì cho biết 10 năm trước kế hoạch học tập các môn như thế nào, và hiện tại thì như thế nào, thậm chí tương lai sẽ thay đổi ra sao…
Em có 1 điều thắc mắc là primary key của table KeHoachGiang này sẽ là cái gì, em nghĩ nếu chỉ là khóa tổ hợp MaCN, MaMH thì sẽ không đủ, bởi vì có trường hợp vẫn là môn học đó, vẫn là chuyên ngành đó nhưng kỳ học và năm học lại bị thay đổi, thì khi đó nhập dữ liệu sẽ báo trùng primary key.
Từ đây em nảy ra ý nghĩ là cho rằng primary key của KeHoachGiang chính là tổ hợp 4 fields MaCN, MaMH, KyHoc, NamHoc. Nhưng đến đây thì lại nảy sinh vấn đề là có khi 10 năm trước học như vậy, 10 năm sau đổi khác, rồi 10 năm sau nữa lại thay đổi y chang như ban đầu thì lúc này lại tiếp tục trùng primary key. Cuối cùng em đi đến quyết định là cho rằng primary key của KeHoachGiang là tổ hợp của 3 fields MaCN, MaMH, NgayApDung
Không biết có chỗ nào không ổn không ạ? Do em cũng vừa mới học về SQL nên thấy khó quá, vả lại search Google cũng không ra, toàn là kiểu primary key của quan hệ n-n mà chỉ có 2 fields thì quá đơn giản rồi.
Lý thuyết CSDL làm như bạn là đúng.
Tuy nhiên, chỉ cần thêm cột id làm khoá chính. Mấy cột khác cho nullable. Nếu có thể thì thêm 2
cột createdAt và updateAt sẽ tiện về sau.
Làm như vậy tức là các ràng buộc phải kiểm tra ở app.
Kế hoạch giảng của giáo viên gần giống thời khoá biểu của sinh viên. Nó gần như là 1 entity riêng chứ không phải chỉ là bảng liên kết n-n. Nên ràng buộc kiểm tra trên app để phù hợp với quy định của phòng đào tạo.