+1 cho Matt Fenwick. Tôi muốn nói thêm rằng bạn muốn cẩn thận một chút với các ràng buộc khóa ngoại của mình. Về cơ bản, bạn có hai tùy chọn, cả hai đều có thể trông khá giống nhau, tùy thuộc vào lựa chọn khóa chính của bạn.
Tùy chọn một là:Quên sự giao nhau đơn giản giữa TEACHER
và INSTRUMENT
và thay thế nó bằng một giao lộ phức tạp bao gồm teacher_id
, instrument_id
và level_id
. Tất cả ba cột này sẽ là khóa chính (ghép) của bảng giao nhau này. Trong tùy chọn này, bạn có các ràng buộc khóa ngoại được xác định trên teacher_id
và instrument_id
(và level_id
nếu đây thực sự là khóa ngoại của LEVEL
bảng chứ không chỉ là một số nguyên hoặc mã chuỗi).
Tùy chọn hai là:Giữ sự giao nhau đơn giản giữa TEACHER
và INSTRUMENT
(chúng ta hãy gọi nó là TEACHER_INSTRUMENT
mặc dù điều đó là không tưởng) và thêm một bảng con xác định các cấp độ có thể dạy. Bảng con này (chúng ta hãy gọi nó là SKILL
) có level_id
và một khóa ngoại cho TEACHER_INSTRUMENT
. Nếu khóa chính của TEACHER_INSTRUMENT
là sự kết hợp của teacher_id
và instrument_id
sau đó là SKILL
bảng sẽ có ba cột giống như trong tùy chọn một. Điều gì làm cho tùy chọn này khác biệt? Ràng buộc khóa ngoài từ SKILL
phải đến bàn giao nhau, không phải TEACHER
và INSTRUMENT
.
Tại sao điều này lại quan trọng? Nếu bạn chọn tùy chọn một, bạn có thể cần thêm một số logic truy vấn để có được một lưới kỹ năng được điền đầy đủ, vì không có ràng buộc toàn vẹn tham chiếu nào mà bạn có thể xác định, điều này sẽ đảm bảo rằng tất cả các cấp độ kỹ năng đều được điền cho mỗi tổ hợp giáo viên / dụng cụ.
Mặt khác, nếu bạn chọn phương án hai, bạn có lợi thế là tách biệt được mối quan tâm giữa ai có thể sử dụng cái gì và họ có thể dạy nó tốt như thế nào.
Những gì bạn muốn tránh là có một bảng chỉ chứa mối quan hệ giáo viên / nhạc cụ và sau đó bảng thứ hai lặp lại mối quan hệ đó nhưng thêm chi tiết cấp độ kỹ năng. Nếu bạn làm điều đó, thì bạn có nguy cơ hai thứ này không đồng bộ với nhau.