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 .