Ketika saya meninjau model database untuk RDBMS, saya biasanya terkejut menemukan sedikit atau tidak ada kendala (selain PK / FK). Misalnya, persentase sering disimpan dalam kolom tipe int
(sementara tinyint
akan lebih tepat) dan tidak ada CHECK
kendala untuk membatasi nilai ke kisaran 0,100. Demikian pula pada SE.SE, jawaban yang menyarankan kendala pemeriksaan sering menerima komentar yang menunjukkan bahwa database adalah tempat yang salah untuk kendala.
Ketika saya bertanya tentang keputusan untuk tidak menerapkan kendala, anggota tim merespons:
Entah mereka bahkan tidak tahu bahwa fitur seperti itu ada di database favorit mereka. Dapat dimengerti dari pemrogram yang hanya menggunakan ORM, tetapi jauh lebih sedikit dari DBA yang mengklaim memiliki pengalaman 5+ tahun dengan RDBMS yang diberikan.
Atau bahwa mereka menegakkan batasan seperti itu di tingkat aplikasi, dan menduplikasi aturan-aturan itu dalam database bukanlah ide yang baik, melanggar SSOT.
Baru-baru ini, saya melihat semakin banyak proyek di mana bahkan kunci asing tidak digunakan. Demikian pula, saya telah melihat beberapa komentar di sini di SE.SE yang menunjukkan bahwa pengguna tidak terlalu peduli dengan integritas referensial, membiarkan aplikasi menanganinya.
Ketika bertanya kepada tim tentang pilihan untuk tidak menggunakan FK, mereka mengatakan bahwa:
Ini PITA, misalnya ketika seseorang harus menghapus elemen yang direferensikan di tabel lain.
Batu NoSQL, dan tidak ada kunci asing di sana. Karena itu, kami tidak membutuhkannya di RDBMS.
Ini bukan masalah besar dalam hal kinerja (konteksnya biasanya aplikasi web intranet kecil yang bekerja pada set data kecil, jadi memang, bahkan indeks tidak akan terlalu penting; tidak ada yang akan peduli jika kinerja permintaan yang diberikan melewati 1,5 dtk . hingga 20 ms.)
Ketika saya melihat aplikasi itu sendiri, saya secara sistematis melihat dua pola:
Aplikasi membersihkan data dengan benar dan memeriksanya sebelum mengirimnya ke database. Misalnya, tidak ada cara untuk menyimpan nilai
102
sebagai persentase melalui aplikasi.Aplikasi ini mengasumsikan bahwa semua data yang berasal dari basis data benar-benar valid. Artinya, jika
102
datang sebagai persentase, entah sesuatu, suatu tempat akan macet, atau itu hanya akan ditampilkan sebagaimana adanya kepada pengguna, yang mengarah ke situasi aneh.Sementara lebih dari 99% kueri dilakukan oleh satu aplikasi, seiring waktu, skrip mulai muncul — skrip dijalankan dengan tangan saat dibutuhkan, atau pekerjaan cron. Beberapa operasi data juga dilakukan dengan tangan pada database itu sendiri. Skrip dan kueri SQL manual memiliki risiko tinggi untuk memasukkan nilai yang tidak valid.
Dan inilah pertanyaan saya:
Apa alasan untuk memodelkan basis data relasional tanpa kendala pemeriksaan dan akhirnya bahkan tanpa kunci asing?
Untuk apa nilainya, pertanyaan ini dan jawaban yang saya terima (terutama diskusi yang menarik dengan Thomas Kilian) mendorong saya untuk menulis artikel dengan kesimpulan saya tentang masalah keterbatasan basis data .
sumber
Jawaban:
Penting untuk membedakan antara berbagai kasus penggunaan untuk basis data.
Basis data bisnis tradisional diakses oleh beberapa aplikasi dan layanan independen dan mungkin langsung oleh pengguna yang berwenang. Sangat penting untuk memiliki skema dan kendala yang dipikirkan dengan matang di tingkat basis data, sehingga bug atau kekeliruan dalam satu aplikasi tidak merusak database. Basis data adalah bisnis-kritis yang berarti data yang tidak konsisten atau korup dapat memberikan hasil yang merusak bagi bisnis. Data akan hidup selamanya saat aplikasi datang dan pergi. Ini adalah tempat-tempat yang mungkin memiliki DBA khusus untuk memastikan konsistensi dan kesehatan database.
Tetapi ada juga sistem di mana basis data terintegrasi dengan satu aplikasi. Aplikasi yang berdiri sendiri atau aplikasi web dengan satu database tertanam. Selama database secara eksklusif diakses oleh satu aplikasi, Anda dapat mempertimbangkan kendala yang berlebihan - selama aplikasi berfungsi dengan benar. Sistem ini sering dikembangkan oleh pemrogram dengan fokus pada kode aplikasi dan mungkin bukan pemahaman yang mendalam tentang model relasional. Jika aplikasi menggunakan ORM, kendala mungkin dideklarasikan pada level ORM dalam bentuk yang lebih akrab bagi pemrogram aplikasi. Pada akhirnya kami memiliki aplikasi PHP menggunakan MySQL, dan untuk waktu yang lama MySQL tidak mendukung kendala dasar sama sekali, jadi Anda harus bergantung pada lapisan aplikasi untuk memastikan konsistensi.
Ketika pengembang dari berbagai latar belakang ini bertemu, Anda mendapatkan bentrokan budaya.
Ke dalam campuran ini kita mendapatkan gelombang baru dari database "penyimpanan cloud" yang didistribusikan. Sangat sulit untuk menjaga database terdistribusi konsisten tanpa kehilangan manfaat kinerja, sehingga database ini sering menghindari pemeriksaan konsistensi di tingkat database dan pada dasarnya memungkinkan para programmer menanganinya di tingkat aplikasi. Aplikasi yang berbeda memiliki persyaratan konsistensi yang berbeda, dan sementara mesin pencari Google memprioritaskan ketersediaan di seluruh server mereka, saya berani bertaruh sistem penggajian mereka berjalan pada basis data relasional dengan banyak kendala.
sumber
Semakin banyak sistem saat ini yang berjalan di lingkungan terdistribusi, di cloud dan mengadopsi teknik untuk "meningkatkan", bukannya "meningkatkan". Itu bahkan lebih penting jika Anda berurusan dengan aplikasi online yang menghadap internet, seperti aplikasi e-commerce.
Yang sedang berkata, semua aplikasi yang seharusnya skala dibatasi oleh Teorema CAP , di mana Anda harus memilih 2 dari 3: Konsistensi, Ketersediaan dan Toleransi Partisi (toleransi kesalahan jaringan).
Dengan mempelajari Teorema CAP Anda akan melihat bahwa tidak ada banyak pilihan, tetapi memilih untuk kehilangan Ketersediaan atau Konsistensi, karena Anda TIDAK PERNAH benar-benar percaya pada Jaringan 100% dari waktu.
Secara umum, beberapa aplikasi mungkin tidak konsisten untuk beberapa waktu yang wajar, tetapi tidak mampu tidak tersedia bagi pengguna. Misalnya, garis waktu yang sedikit tidak berurutan di Facebook atau Twitter lebih baik daripada tidak memiliki akses ke garis waktu sama sekali.
Dengan demikian, beberapa aplikasi memilih untuk melepaskan kendala basis data relasional, karena basis data relasional benar-benar bagus di Konsistensi, tetapi dengan biaya ketersediaan.
Catatan pribadi: Saya sudah kuno juga, dan saya telah bekerja dengan beberapa sistem keuangan yang sangat tua di mana konsistensi data merupakan persyaratan kelas paling sering, dan saya penggemar berat kendala database. Kendala basis data adalah garis pertahanan terakhir terhadap tahun-tahun perkembangan buruk dan tim pengembang yang datang dan pergi.
"Est modus dalam rebus". Mari kita terus menggunakan konsistensi DB "tingkat rendah" di mana konsistensi adalah persyaratan kelas satu. Namun terkadang, melepaskannya bukanlah dosa besar.
-- SUNTING: --
Karena ada suntingan kecil dalam pertanyaan, ada alasan lain yang sah untuk menghilangkan batasan dalam database, IMO. Jika Anda mendesain produk dari awal, di mana Anda mendesain sistem Anda untuk mendukung teknologi multi-database, Anda dapat menerima denominator yang paling tidak umum di antara database yang didukung, dan pada akhirnya tidak menggunakan semua kendala sama sekali, meninggalkan semua logika kontrol untuk aplikasi Anda.
Meskipun itu sah, ini juga merupakan area abu-abu bagi saya, karena saya tidak dapat menemukan mesin database hari ini yang tidak mendukung kendala sederhana seperti yang diusulkan dalam pertanyaan awal.
sumber
Pertama mari kita perjelas bahwa saya berbicara di sini hanya tentang RDBM, bukan tentang database no-SQL.
Saya telah melihat beberapa database tanpa FK atau PK, apalagi memeriksa kendala tetapi jujur mereka adalah minoritas. Mungkin karena saya bekerja di perusahaan besar.
Dalam pengalaman saya selama bertahun-tahun saya dapat mengatakan bahwa beberapa alasan mungkin:
1,2 or 3
nilai, atau bahwa kolom "usia" harus>= 0
adalah "memiliki logika bisnis dalam database" . Bahkan klausa standar dianggap oleh beberapa orang sebagai logika bisnis yang bukan milik database, seperti yang Anda lihat dalam beberapa pertanyaan dan jawaban terbaru di situs ini. Pengembang ini yang begitu mempertimbangkan, jelas akan menggunakan kendala sesedikit mungkin dan akan melakukan segalanya dalam kode, bahkan integritas referensial dan / atau unicity. Saya pikir ini adalah posisi yang ekstrem.Yang mengatakan, saya ingin menyatakan bahwa RDBMS adalah perangkat lunak yang sangat canggih yang telah dibangun di atas bahu raksasa dan telah terbukti sangat efisien untuk banyak persyaratan bisnis, membebaskan para programmer dari tugas-tugas duniawi menegakkan integritas referensial pada serangkaian file biner atau file teks. Seperti yang selalu saya katakan, "kita tidak lagi hidup di dunia satu-aplikasi-satu-basis data" . Paling tidak klien SQL akan mengeluarkan DML di samping "aplikasi". Jadi database harus mempertahankan diri dari kesalahan manusia atau pemrograman sampai batas yang wajar
Dalam jenis persyaratan yang terkenal di mana RDBMS tidak akan skala baik, dengan segala cara merangkul teknologi no-SQL . Tetapi mengkhawatirkan proliferasi basis data relasional tanpa kendala di mana ribuan baris kode (dibuat atau diketik) dikhususkan untuk menegakkan apa yang seharusnya ditegakkan oleh RDBMS untuk Anda dengan cara yang lebih efisien.
sumber
Ada kendala eksternal yang mendorong keputusan teknologi. Hanya ada beberapa situasi di mana Anda memiliki kebutuhan dan atau kemewahan menggunakan kendala bidang basis data secara teratur.
Banyak tim pengembangan tidak ingin memberikan terlalu banyak kendali kepada pengembang db. Anda beruntung jika mendapat lebih dari satu, jadi liburan sangat menyenangkan. Tidak banyak yang memerlukan kontrol mutlak atas domain basis data dan bertanggung jawab atas setiap kueri, aturan bisnis, kinerja, ketersediaan, keamanan, dan data apa yang masuk ke RAID apa. Berikut adalah prosedur tersimpan yang diizinkan untuk Anda lakukan. Selamat bersenang-senang. Jangan pernah berpikir untuk menyentuh meja.
sumber
Ini adalah masalah yang saya telah berjuang dengan semua karir saya (hampir 40 tahun) dan juga ketika menulis DBMS saya. Penjelasan tentang titik akhir saya ada di sini: http://unibase.zenucom.com . Jadi inilah pemikiran saya.
sumber
Kendala basis data mungkin merupakan ide yang cerdas, tetapi bagaimana dengan penggunaan praktis untuknya? Ambil batasan persentase Anda. Jika Anda menerapkannya, DB Anda akan dengan senang hati menolak persentase yang tidak valid. Lalu? Anda akan memerlukan logika bisnis untuk menangani pengecualian. Yang sebenarnya berarti logika bisnis yang menulis persentase yang salah sudah gagal di tempat lain. Jadi singkatnya: satu-satunya kendala praktis yang tersisa adalah yang Anda lihat (seperti PK / FK).
sumber
Percentage
kelas, atau ada kesalahan dalam validasi itu sendiri), yang bertentangan dengan kasus luar biasa (seperti koneksi jaringan turun). Bagi saya, pelanggaran harus mengarah ke HTTP 500 untuk aplikasi web atau crash untuk aplikasi desktop, dan kemudian harus dicatat dan diperbaiki.Lebih sering hari-hari ini, orang menggunakan perangkat lunak (misalnya Entity Framework) untuk menghasilkan tabel dan kolom secara otomatis. Idenya adalah bahwa mereka tidak memerlukan keterampilan SQL, membebaskan kapasitas otak.
Harapan bahwa perangkat lunak akan "menyelesaikan masalah" seringkali tidak realistis, dan itu tidak menciptakan kendala seperti yang manusia lakukan.
Untuk hasil terbaik, buat tabel menggunakan SQL dan tambahkan batasan secara manual, tetapi terkadang orang tidak bisa melakukan ini.
sumber