Menegakkan integritas basis data

19

Apakah ini masuk akal untuk memiliki aplikasi menegakkan integritas database daripada memiliki kunci asing, memeriksa kendala, dll?

Berapa banyak peningkatan kinerja yang bisa diharapkan untuk tidak menegakkan integritas database melalui alat basis data internal?

Renats Stozkovs
sumber

Jawaban:

24

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.

Berikan Fritchey
sumber
2
Itu hampir sepanjang apa yang saya pikirkan dan harapkan. Saya tahu bahwa DBA pada pekerjaan saya sebelumnya salah tentang hal itu, hanya ingin mendapatkan pendapat independen tentang hal itu. Terima kasih!
Renats Stozkovs
17

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?

Mike Sherrill 'Cat Recall'
sumber
5
+1. Itu pada dasarnya itu. Anda mengganti sistem terpusat dan teruji dengan baik dengan banyak programer yang harus dipatuhi. Setiap saat. Tidak akan terjadi - jadi Anda mendapatkan basis data dengan data buruk dari waktu ke waktu.
TomTom
13

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).

Thomas Stringer
sumber
-1. Sudah lama orang-orang menaruh logika aplikasi ke dalam basis data, yang paling sulit dan paling mahal untuk menskalakan seluruh tumpukan - bagi saya basis data adalah tempat penyimpanan dengan logika dijalankan oleh aplikasi. BILANG ITU: Integritas referensial adalah tentang integritas tingkat basis data dan sangat berguna.
TomTom
5
@TomTom Menulis ulang logika integritas data dalam aplikasi Anda sedang mengulang pekerjaan yang sudah dilakukan di RDBMSes. Simpan logika data dalam database.
Thomas Stringer
@TomTom - "Data teoritis yang tidak benar tidak pernah menyentuh database, tetapi integritas adalah garis pertahanan terakhir." Sepakat. Bentuk AJAX yang mewah itu akan menghemat banyak sakit kepala pengguna akhir Anda dengan memvalidasi input mereka di muka. Demikian juga, batasan-batasan basis data itu akan menghemat bisnis Anda dan teknisi Anda sama banyaknya dengan waktu, uang, dan energi yang hilang karena kode yang buruk .
Nick Chammas
6

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.

OMG Ponies
sumber
1
+1. Perhatikan bahwa ini adalah kasus khusus, meskipun - pada umumnya laod data tidak melakukan pemrosesan apa pun dan menganggap data itu benar dan akan tetap meledak pada langkah indeks buat ulang. Ini adalah teknik tingkat data warehos.
TomTom
3

Ada beberapa kali ketika kendala menghalangi:

  1. 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.

  2. 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.

Neil McGuigan
sumber