Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Liên kết một bảng thứ ba với một bảng cầu nối trong một liên kết nhiều đến nhiều

+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 TEACHERINSTRUMENT và thay thế nó bằng một giao lộ phức tạp bao gồm teacher_id , instrument_idlevel_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_idinstrument_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 TEACHERINSTRUMENT (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_idinstrument_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 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python:Làm cách nào để lấy thời gian từ đối tượng datetime.timedelta?

  2. Máy chủ 'tên máy chủ' bị chặn vì nhiều lỗi kết nối; bỏ chặn với 'mysqladmin flush-hosts'

  3. Cách tìm kiếm trường ngày cho một chuỗi bằng API tiêu chí JPA

  4. Mysql cải thiện tốc độ CHỌN

  5. Truy cập mysql chạy trên localhost từ minikube