Saya memiliki 4 tabel terkait seperti ini (ini contohnya):
Company:
ID
Name
CNPJ
Department:
ID
Name
Code
ID_Company
Classification:
ID
Name
Code
ID_Company
Workers:
Id
Name
Code
ID_Classification
ID_Department
Misalkan saya punya classification
dengan id = 20, id_company = 1
. Dan department
yang memiliki id_company = 2
(yang mewakili perusahaan lain).
Ini akan memungkinkan penciptaan pekerja yang berasal dari dua perusahaan karena klasifikasi dan departemen terkait dengan perusahaan secara terpisah. Saya tidak ingin itu terjadi, jadi saya pikir saya memiliki masalah dengan hubungan saya dan saya tidak tahu bagaimana menyelesaikannya.
database-design
constraint
77Anon
sumber
sumber
classification
analog dengan posisi yaitu sekretaris, petugas kebersihan, tuan, dll.Jawaban:
Masalah Anda berasal dari kenyataan bahwa ada jenis entitas yang hilang dari model Anda. Pertimbangkan ERD berikut:
Perhatikan bahwa saya telah menambahkan jenis entitas persimpangan antara
DEPARTMENT
danCLASSIFICATION
. Jenis entitas baru ini:POSITION
memberikan informasi yang tersirat dalam model Anda, bahwa departemen tertentu memiliki serangkaian pekerjaan dari berbagai klasifikasi.Menambahkan
POSITION
ke model Anda sebagai entitas eksplisit memiliki beberapa keuntungan.WORKER
kemungkinan ditugaskan ke departemen dan klasifikasi di perusahaan yang berbeda.WORKER
posisi saat ini, yang merupakan informasi yang sangat berguna.Perhatikan bahwa untuk menghindari masalah posisi yang ditetapkan untuk departemen dan klasifikasi yang ada di perusahaan yang berbeda, saya telah memperluas kunci keduanya
DEPARTMENT
danCLASSIFICATION
, yang bagus untuk alasan yang dapat Anda baca panjang lebar dalam jawaban Todd Everett.WASPADALAH Model di atas menganggap penyederhanaan. Secara khusus, diasumsikan bahwa setiap posisi dicatat hanya sekali. Ini mungkin atau mungkin tidak cocok dengan aturan bisnis Anda. Jika Anda memerlukan banyak
POSITION
catatan untuk departemen dan klasifikasi yang sama dalam suatu perusahaan, maka Anda bisa memasukkan kunci penggantiPOSITION
.sumber
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
danMicrosoft
.IBM
dapat memilikiSoftware Development
departemen, dan Microsoft dapat memilikiDesktop Software
departemen. IBM dapat memilikiSoftware Engineer
klasifikasi, dan Microsoft dapat memilikiSoftware Developer
klasifikasi. Sekarang, karena Anda memiliki kunci pengganti untukDepartment
danClassification
, fakta bahwa ituSoftware Development
adalahIBM
departemen danDesktop Software
merupakanMicrosoft
departemen hilang untuk hubungan anak di masa depan. Ini juga terjadi denganClassification
. Oleh karena itu mudah untuk secara tidak sengaja menugaskanHarlan Mills
, yang merupakanIBM
karyawan diSoftware Development
departemen, klasifikasiSoftware 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 mewakiliMicrosoft
. Saya telah menyoroti dalam warna merah skenario di manaHarlan Mills
danBill 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 denganDepartment
danClassification
anak tabel. TheDepartment
danClassification
meja sekarang memiliki PK dariCompany Id
ditambah Sequence Number atau Nama untuk membedakan mereka. Kemudian, hubungan dariDepartment
danClassification
keWorker
juga menjadiidentifying
dan dengan demikian PK dariWorker
menjadiCompany Id
, ditambahDepartment Number
(saya menggunakan nomor urut dalam contoh ini), ditambahClassification Number
. Hasilnya hanya adaone
Company Id
diWorker
tabel. Sekarang tidak mungkin untuk menetapkanWorker
keDepartment
dalam satuCompany
dan keClassification
dalam yang lainCompany
.Mengapa ini tidak mungkin? Hal ini mungkin karena skema menerapkan integritas referensial antara
Worker
danDepartment
danClassification
. Jika dilakukan usaha untuk menyisipkanWorker
untukDepartment
dalam satuCompany
dan danClassification
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 suatuCompany
kebutuhan harus ditetapkanClassification
danDepartment
samaCompany
. Tetapi, jika di dunia nyataMicrosoft
memiliki departemen yang disebutDesktop Software
tetapi pengguna database menegaskan departemen itu sebagai gantinyaSoftware Development
DBMS tidak dapat melakukan apa pun kecuali menganggapnya telah diberikan fakta yang sebenarnya.sumber
Cara saya memahami pertanyaannya adalah, bidang ID_Classification dari tabel 'Pekerja' seharusnya hanya memungkinkan klasifikasi yang ditentukan untuk masing-masing perusahaan pekerja. Oleh karena itu, memvalidasi (dengan melampirkan ATURAN atau melalui PEMICU) informasi yang disisipkan / diperbarui ke bidang Pekerja.ID_Klasifikasi memadai untuk memenuhi persyaratan ini.
sumber
Dari bacaan saya, saya masih tidak mengerti apa Klasifikasi ini dan mengapa perlu memiliki ID_Company . Jika itu seperti posisi sebagai seseorang yang disebutkan di sini, saya pikir tabel statis untuk memuat semua posisi akan lebih baik.
Jika Anda melakukan ini agar dapat dengan mudah menemukan klasifikasi / posisi di sebuah perusahaan, silakan tambahkan permintaan / tampilan sederhana untuk menghubungkan departemen-pekerja-departemen dan mengambil id perusahaan dari klasifikasi.
saat ini, ada pandangan atau teknologi yang lebih cerdas seperti pandangan terwujud dan bergabung dengan indeks, jadi jika masalah Anda adalah kinerja permintaan, gunakanlah.
sumber