Sejujurnya, tidak hanya Anda tidak akan melihat banyak kehilangan kinerja karena memiliki kendala kunci asing dalam database, tetapi Anda akan melihat peningkatan kinerja. Pengoptimal permintaan SQL Server dibangun di sekitar konsep kunci primer dan foriegn serta jenis kendala data lainnya. Jika ini ada dan diberlakukan, pengoptimal dapat memanfaatkannya untuk membuat Anda mendapatkan kinerja yang lebih baik. Berikut adalah posting blog dengan contoh sederhana yang menunjukkannya dalam tindakan.
Jika Anda berada dalam kasus tepi di mana Anda benar-benar memiliki lebih banyak sisipan daripada bacaan (dan pembaruan & penghapusan membutuhkan bacaan, sehingga biasanya berakhir dengan menambah jumlah baca), maka mungkin masuk akal untuk menghilangkan kendala dari data untuk kinerja, mungkin . Tetapi karena sebagian besar basis data berorientasi pada baca, Anda mengorbankan kinerja, bukan meningkatkannya.
Dan tidak satu pun dari ini menyebutkan fakta bahwa integritas data lebih baik ditangani di database karena Anda hanya perlu membuatnya sekali ketika seolah-olah Anda melakukan semua pekerjaan dalam kode, Anda mungkin harus melakukannya berkali-kali untuk beberapa aplikasi (kecuali jika Anda mendesain lapisan akses data Anda dengan hati-hati dan mengharuskan setiap aplikasi mengakses db untuk melewati lapisan yang sama).
Jika Anda menggunakan sistem basis data relasional, saya katakan, mengapa tidak benar-benar menggunakannya. Jika Anda tidak memerlukan data relasional, pergilah dengan Hadoop atau yang lainnya.
Banyak pengembang aplikasi berpikir demikian.
Ketika Anda tergoda untuk mendelegasikan integritas data ke kode aplikasi, pikirkan "Setiap programmer dan setiap aplikasi yang menyentuh basis data ini dari sekarang sampai akhir waktu harus melakukannya dengan benar, setiap waktu."
Apa peluangnya?
sumber
Bahkan jika ada keuntungan kinerja, itu dapat diabaikan dibandingkan dengan mengembalikan integritas referensial dan integritas data umum.
Lama pergi adalah hari-hari di mana database adalah penyimpanan data bodoh. Manfaatkan kekuatan yang ditawarkan RDBMS.
Keuntungan kinerja bukanlah segalanya, terutama dalam skala sekecil ini. Tetapi ketika Anda mengetahui bahwa Anda memiliki hubungan kunci asing yang seharusnya diterapkan oleh aplikasi Anda, dan ternyata itu bukan kunci utama dalam tabel referensi maka Anda tidak akan terlalu peduli dengan peningkatan kinerja (jika ada, saya bisa dapat berbicara tentang hal itu).
sumber
Ini adalah praktik umum untuk menghilangkan batasan (kunci asing, PERIKSA, dll) dan indeks jika Anda melakukan beban data yang cukup besar, dan mengaktifkan kembali / mengimplementasikan kendala & indeks setelahnya. Validasi itu memiliki biaya waktu. Itu dengan asumsi Anda tidak dapat menggunakan sintaks beban massal basis data khusus (termasuk meminimalkan penebangan).
Tidak mungkin untuk mengatakan berapa banyak peningkatan kinerja yang diharapkan - setiap situasi adalah unik (tipe data, desain, dll). Satu-satunya cara untuk benar-benar tahu adalah dengan menguji.
sumber
Ada beberapa kali ketika kendala menghalangi:
Saat Anda perlu menggunakan Single Table Inheritance (STI). Bayangkan Anda menjual kepada individu dan organisasi. Anda akan membutuhkan tabel "Pesta" tunggal yang barisnya adalah individu atau org. IMS berarti Anda memerlukan beberapa bidang yang dapat dibatalkan yang tidak boleh nol. Class Table Inheritance memecahkan ini, tetapi ini lebih sulit untuk beberapa ORM. ActiveRecord Ruby hanya mendukung IMS, misalnya.
Saat Anda perlu mendukung versi konsep suatu entitas, itu mungkin tidak sepenuhnya valid. Anda dapat menyimpan konsep sebagai json, tetapi kemudian lebih sulit untuk menggunakan kembali pengidentifikasi yang sama pada klien - bayangkan itu telah disimpan dengan id = 5, diedit menjadi tidak valid, dan disimpan otomatis sebagai draftid = 99. Dalam hal ini semua bidang Anda mungkin harus nullable.
sumber