Saya sangat baru dengan subjek database jadi ini mungkin terdengar bodoh, tapi saya ingin tahu mengapa kunci harus dibuat eksplisit dalam sebuah tabel. Apakah ini terutama untuk memberi tahu pengguna bahwa nilai kolom yang diberikan (semoga) dijamin unik di setiap baris? Keunikannya harus tetap ada meskipun tidak disebutkan.
primary-key
unique-constraint
dsaxton
sumber
sumber
Jawaban:
Anda jelas menyarankan bahwa
CONSTRAINT
s di dalam basis data harus diberlakukan oleh aplikasi yang mengakses basis data itu?Ada banyak alasan mengapa ini adalah ide yang buruk (buruk, buruk ...).
1) Jika Anda sedang membangun "roll-your-own" engine "engine" (yaitu dalam kode aplikasi Anda), maka Anda hanya meniru apa yang Oracle / SQL Server / MySQL / PostgreSQL / <. Siapa pun ...> telah menghabiskan tahun menulis. Kode CONSTRAINT mereka telah diuji selama bertahun-tahun oleh jutaan pengguna akhir.
2) Dengan segala hormat kepada Anda dan tim Anda, Anda tidak akan memperbaikinya bahkan dalam hitungan tahun - dari sini , kode MySQL saja menelan biaya 40 Juta dolar. Dan MySQL adalah yang termurah dari 3 server di atas, dan mereka bahkan tidak mengimplementasikan CHECK CONSTRAINTs. Jelas, mendapatkan RI (Integritas Referensial) sepenuhnya benar itu sulit.
Saya sering mengunjungi forum Oracle dan saya tidak bisa memberi tahu Anda berapa kali manajer / programmer yang buruk memiliki proyek yang disodorkan kepadanya di mana si jenius yang memiliki pekerjaannya sebelumnya memiliki ide "cemerlang" untuk melakukan apa yang Anda sarankan .
Jonathan Lewis (dia menulis buku setebal 550 halaman tentang dasar-dasar optimiser Oracle ) memberi sebagai tidak. 2 dari Bencana Desain di buku lain (" Tales of the Oak Table " - the Oak Table adalah sekelompok ahli Oracle) adalah
3) Bahkan jika dengan beberapa keajaiban Anda dapat menerapkan RI dengan benar, Anda harus sepenuhnya mengimplementasikannya berulang kali untuk setiap aplikasi yang menyentuh database itu - dan jika data Anda penting, maka aplikasi baru akan melakukannya. Memilih ini sebagai sebuah paradigma akan membawa Anda dan rekan programmer Anda (belum lagi staf pendukung dan penjualan) ke kehidupan yang terus-menerus memadamkan api dan kesengsaraan.
Anda dapat membaca lebih lanjut tentang mengapa menerapkan data CONSTRAINT pada tingkat aplikasi tidak kurang gila di sini , di sini dan di sini .
Untuk secara khusus menjawab pertanyaan Anda:
Alasan bahwa
KEY
s (baikPRIMARY
,FOREIGN
,UNIQUE
atau hanya biasaINDEX
es) dinyatakan adalah bahwa, sementara itu tidak benar-benar diperlukan untuk database untuk memiliki mereka untuk itu berfungsi, itu benar-benar diperlukan bagi mereka untuk dinyatakan untuk itu untuk fungsi dengan baik .sumber
Saat Anda membuat kunci dalam database, mesin DBMS memberlakukan batasan keunikan pada atribut kunci. Ini melayani setidaknya tiga tujuan terkait:
sumber
Saya akan menambahkan satu aspek ke jawaban luar biasa yang ada: Dokumentasi. Seringkali penting untuk melihat jenis kunci apa yang dapat Anda gunakan untuk mengidentifikasi suatu entitas. Kombinasi kolom unik apa pun adalah kunci kandidat.
Kunci utama cenderung menjadi konsep yang sangat berguna dalam praktik.
Apakah Anda menerapkan kunci atau tidak (Anda mungkin harus) dokumentasi itu berharga dalam dirinya sendiri.
sumber
FOREIGN KEY
definisi untuk mendapatkan rasakan untuk sistem ". Permintaan saya mengembalikan zip !!! Yakin bahwa SQL saya salah, saya menyebutkan ini ke salah satu programmer senior. Dengan bangga (tidak kurang) dia mengumumkan (seolah-olah dia sedang menghadirkan putra yang baru lahir) bahwa sistem tidak memiliki FK karena "semua pencarian sedang dilakukanPRIMARY KEY
" - (tidak relevan). <Doh ...> ala Homer Simpson!Alasan lain mengapa Anda harus menggunakan CONSTRAINTs alih-alih beberapa kode aplikasi-dalam:
Apa yang terjadi jika pengembang / dba menggunakan pernyataan insert / update / delete untuk mengubah data secara langsung dalam DB? Dalam hal ini semua integritas referensial berbasis aplikasi yang bagus Anda tidak akan berguna. Saya tahu, beberapa pengembang menyukai kemungkinan untuk mengubah data secara langsung tanpa harus repot dengan RI karena mereka tahu apa yang mereka lakukan - setidaknya yang paling banyak waktu (tetapi tidak selalu)
PS: Tentu saja Anda bisa membuat pemicu, tetapi biasanya lambat sekali (dibandingkan dengan CONSTRAINTS).
sumber