+1 untuk Matt Fenwick. Saya ingin menambahkan bahwa Anda ingin sedikit berhati-hati dengan batasan kunci asing Anda. Anda pada dasarnya memiliki dua opsi, yang keduanya dapat terlihat sangat mirip, tergantung pada pilihan kunci utama Anda.
Opsi satu adalah:Lupakan perpotongan sederhana antara TEACHER
dan INSTRUMENT
dan ganti dengan persimpangan kompleks yang menyertakan teacher_id
, instrument_id
dan level_id
. Ketiga kolom ini akan menjadi kunci utama (gabungan) dari tabel persimpangan ini. Dalam opsi ini, Anda memiliki batasan kunci asing yang ditentukan di teacher_id
dan instrument_id
(dan level_id
jika ini sebenarnya adalah kunci asing ke LEVEL
tabel dan bukan hanya kode integer atau string).
Opsi dua adalah:Pertahankan persimpangan sederhana antara TEACHER
dan INSTRUMENT
(sebut saja TEACHER_INSTRUMENT
meskipun itu tidak imajinatif) dan tambahkan tabel sub-anak yang mendefinisikan level yang bisa diajarkan. Tabel sub-anak ini (sebut saja SKILL
) memiliki level_id
dan kunci asing untuk TEACHER_INSTRUMENT
. Jika kunci utama TEACHER_INSTRUMENT
adalah kombinasi dari teacher_id
dan instrument_id
lalu SKILL
tabel akan memiliki tiga kolom yang sama seperti pada opsi satu. Apa yang membuat opsi ini berbeda? Batasan kunci asing dari SKILL
harus ke meja persimpangan, bukan ke TEACHER
dan INSTRUMENT
.
Mengapa ini penting? Jika Anda memilih opsi satu, Anda mungkin perlu memiliki beberapa logika kueri tambahan untuk mendapatkan kisi keterampilan yang terisi penuh, karena tidak ada batasan integritas referensial yang dapat Anda tentukan yang akan memastikan bahwa semua tingkat keterampilan diisi untuk setiap kombinasi guru/instrumen.
Di sisi lain, jika Anda memilih opsi dua, Anda memiliki keuntungan pemisahan kekhawatiran antara siapa yang dapat menggunakan apa dan seberapa baik mereka dapat mengajarkannya.
Apa yang ingin Anda hindari adalah memiliki satu tabel yang hanya berisi hubungan guru/instrumen dan kemudian tabel kedua yang (secara independen) mengulangi hubungan itu tetapi menambahkan detail tingkat keterampilan. Jika Anda melakukannya, Anda berisiko mengalami dua hal ini menjadi tidak sinkron.