Dalam pengalaman saya, banyak proyek yang saya baca di masa lalu tidak memiliki definisi hubungan dalam database, sebaliknya mereka hanya mendefinisikannya dalam kode sumber. Jadi saya bertanya-tanya apa kelebihan / kekurangan dari mendefinisikan hubungan antara tabel dalam database dan dalam kode sumber? Dan pertanyaan yang lebih luas adalah tentang fitur-fitur canggih lainnya dalam database modern seperti kaskade, pemicu, prosedur ... Ada beberapa poin dalam pikiran saya:
Dalam database:
Koreksi data dari desain. Cegah kesalahan aplikasi yang dapat menyebabkan data tidak valid.
Kurangi round trip jaringan ke aplikasi saat memasukkan / memperbarui data karena aplikasi harus membuat lebih banyak kueri untuk memeriksa integritas data.
Dalam kode sumber:
Lebih fleksibel.
Lebih baik ketika melakukan penskalaan ke banyak basis data, karena terkadang hubungannya bisa lintas basis data.
Lebih banyak kontrol atas integritas data. Basis data tidak harus memeriksa setiap kali aplikasi memodifikasi data (kompleksitasnya bisa O (n) atau O (n log n) (?)). Sebaliknya, itu didelegasikan ke aplikasi. Dan saya pikir menangani integritas data dalam aplikasi akan menyebabkan lebih banyak pesan kesalahan verbose daripada menggunakan database. Misalnya: ketika Anda membuat server API, jika Anda menentukan hubungan dalam database, dan ada yang salah (seperti entitas yang direferensikan tidak ada), Anda akan mendapatkan SQL Exception dengan pesan. Cara sederhana adalah mengembalikan 500 ke klien bahwa ada "kesalahan server internal" dan klien tidak akan tahu apa yang salah. Atau server dapat mem-parsing pesan untuk mencari tahu apa yang salah, yang merupakan cara yang jelek dan rawan menurut saya. Jika Anda membiarkan aplikasi menangani ini,
Apakah ada hal lain?
Sunting: seperti yang ditunjukkan Kilian, poin saya tentang kinerja & integritas data sangat keliru. Jadi saya mengedit untuk memperbaiki maksud saya di sana. Saya benar-benar mengerti bahwa membiarkan basis data mengatasinya akan menjadi pendekatan yang lebih efisien dan kuat. Silakan periksa pertanyaan yang diperbarui dan berikan beberapa pemikiran tentangnya.
Sunting: terima kasih semuanya. Jawaban yang saya terima semuanya menunjukkan bahwa kendala / hubungan harus didefinisikan dalam database. :) Saya punya satu pertanyaan lagi, karena cukup di luar cakupan pertanyaan ini, saya baru saja mempostingnya sebagai pertanyaan terpisah: Menangani kesalahan basis data untuk server API . Silakan tinggalkan beberapa wawasan.