Saya tidak berpikir Anda memiliki masalah dengan hubungan. Saya pikir sebagai gantinya masalahnya adalah bahwa dengan menggunakan kunci pengganti (yaitu Id) untuk setiap tabel, basis data yang dihasilkan tidak dapat mencegah Pekerja dimasukkan yang Departemennya merupakan satu Perusahaan sementara Klasifikasi adalah yang lain dan sebaliknya. Cara yang baik untuk memahami ini adalah memvisualisasikan skema menggunakan alat Diagram ER. Saya akan menggunakan alat Oracle Data Modeler yang merupakan unduhan gratis.
Diagram ER
Seperti berdiri, Anda dapat memiliki 2 perusahaan - katakan IBM
dan Microsoft
. IBM
dapat memiliki Software Development
departemen, dan Microsoft dapat memiliki Desktop Software
departemen. IBM dapat memiliki Software Engineer
klasifikasi, dan Microsoft dapat memiliki Software Developer
klasifikasi. Sekarang, karena Anda memiliki kunci pengganti untuk Department
dan Classification
, fakta bahwa itu Software Development
adalah IBM
departemen dan Desktop Software
merupakan Microsoft
departemen hilang untuk hubungan anak di masa depan. Ini juga terjadi dengan Classification
. Oleh karena itu mudah untuk secara tidak sengaja menugaskan Harlan Mills
, yang merupakan IBM
karyawan di Software Development
departemen, klasifikasi Software Developer
yang adalah aMicrosoft
klasifikasi! Demikian juga, pekerja dapat diberikan klasifikasi yang benar dan departemen yang salah! Berikut adalah diagram yang menunjukkan contoh pertama:
1 Id mewakili IBM
, dan 2 Id mewakili Microsoft
. Saya telah menyoroti dalam warna merah skenario di mana Harlan Mills
dan Bill Gates
ditugaskan ke departemen yang salah, yang divisualisasikan oleh 10 departemen terkait dengan 200 klasifikasi ID dan sebaliknya.
Opsi untuk Diselesaikan
Jadi apa saja pilihan untuk mencegahnya terjadi? Ada dua opsi langsung. Yang pertama adalah menyadari bahwa dengan menggunakan kunci pengganti untuk setiap tabel masalah ini ada dan memperkenalkan pemrograman tambahan untuk memverifikasi itu tidak terjadi. Ini dapat dilakukan dalam aplikasi, tetapi jika memasukkan dan memperbarui dapat terjadi di luar aplikasi maka asosiasi yang salah masih dapat terjadi. Pendekatan yang lebih baik adalah membuat pemicu yang menyala saat memasukkan dan memperbarui seorang karyawan untuk memastikan bahwa departemen yang ditugaskan adalah perusahaan yang sama dengan klasifikasi yang ditugaskan, dan jika tidak gagal memasukkan atau memperbarui.
Opsi kedua adalah tidak menggunakan kunci pengganti untuk setiap tabel. Sebaliknya, gunakan tombol pengganti hanya untuk Company
meja, yang mendasar dan tidak memiliki orang tua, dan kemudian membuat mengidentifikasi hubungan dengan Department
dan Classification
anak tabel. The Department
dan Classification
meja sekarang memiliki PK dari Company Id
ditambah Sequence Number atau Nama untuk membedakan mereka. Kemudian, hubungan dari Department
dan Classification
ke Worker
juga menjadi identifying
dan dengan demikian PK dari Worker
menjadi Company Id
, ditambah Department Number
(saya menggunakan nomor urut dalam contoh ini), ditambah Classification Number
. Hasilnya hanya ada one
Company Id
di Worker
tabel. Sekarang tidak mungkin untuk menetapkanWorker
ke Department
dalam satu Company
dan ke Classification
dalam yang lain Company
.
Mengapa ini tidak mungkin? Hal ini mungkin karena skema menerapkan integritas referensial antara Worker
dan Department
dan Classification
. Jika dilakukan usaha untuk menyisipkan Worker
untuk Department
dalam satu Company
dan dan Classification
dari yang lain, kombinasi yang tidak ada dalam tabel induk yang sesuai akan memicu pelanggaran integritas referensial dan insert tidak akan bekerja.
Berikut adalah diagram yang diperbarui dari implementasi opsi kedua:
Opsi Pilihan
Dari dua opsi, saya benar-benar lebih suka yang kedua - menggunakan hubungan identifikasi dan kunci cascading - karena dua alasan. Pertama, opsi ini mencapai aturan yang diinginkan tanpa pemrograman tambahan. Mengembangkan pemicu bukanlah hal sepele. Itu harus dikodekan, diuji, dan dipelihara. Memastikan logika pemicu optimal agar tidak berdampak kinerja juga tidak sepele. Buku Matematika Terapan untuk Profesional Basis Data menyediakan banyak detail tentang kerumitan solusi semacam itu. Kedua, aturan menyiratkan bahwa Departemen dan Klasifikasi tidak dapat eksis di luar konteks Company
, dan skema sekarang lebih akurat mencerminkan dunia nyata.
Ini adalah pertanyaan yang bagus karena menunjukkan mengapa hanya mengasumsikan setiap tabel memerlukan kunci pengganti adalah ide yang buruk. Fabian Pascal memiliki postingan blog yang luar biasa tentang topik ini yang menunjukkan bahwa bukan hanya kunci pengganti yang dapat menjadi ide buruk dari sudut pandang integritas data, juga dapat membuat proses pengambilan lebih lambatpada tingkat fisik justru karena gabungan diperlukan bahwa, seandainya kunci telah dijuntai dengan benar, tidak perlu. Topik menarik lainnya yang diungkapkan oleh pertanyaan ini adalah bahwa basis data tidak dapat memastikan bahwa semua data yang dimasukkan ke dalamnya akurat berkenaan dengan dunia nyata. Sebagai gantinya, itu hanya dapat memastikan bahwa data yang dimasukkan ke dalamnya konsisten dengan aturan yang dideklarasikan kepadanya. Dalam hal ini kita dapat melakukan yang terbaik dengan menggunakan pendekatan kunci kaskade untuk memastikan DBMS dapat menjaga data konsisten sehubungan dengan aturan bahwa a Worker
dari suatu Company
kebutuhan harus ditetapkan Classification
dan Department
sama Company
. Tetapi, jika di dunia nyata Microsoft
memiliki departemen yang disebut Desktop Software
tetapi pengguna database menegaskan departemen itu sebagai gantinyaSoftware Development
DBMS tidak dapat melakukan apa pun kecuali menganggapnya telah diberikan fakta yang sebenarnya.