Apakah ada alasan untuk membangun batasan antar tabel (di dalam SQLserver) saat ini? Jika ya, kapan? Sebagian besar aplikasi di daerah saya dibangun berdasarkan prinsip-prinsip objek dan tabel digabungkan sesuai permintaan. Permintaan didasarkan pada kebutuhan dari aplikasi. Saya tidak akan memuat banyak tabel terbatas untuk pencarian sederhana, yang pada gilirannya (setelah tindakan) saling membutuhkan pencarian sederhana.
Alat ORM seperti EntityContext, Linq2Data, NHibernate juga menangani kendala sendiri, setidaknya Anda tahu tabel apa yang saling membutuhkan. Melakukan kendala di dalam server hanya tentang membuat (memaksa) perubahan yang sama dua kali?
Ini biasanya bukan pertanyaan untuk keputusan, tetapi database ini dirancang sangat berbeda. Desainnya terlihat biasa baik, sebagian besar mencerminkan objek yang digunakan oleh aplikasi. Yang mengganggu saya adalah semua kendala dikonfigurasi di dalam SQLserver dengan "not cascade". Yang berarti bahwa Anda harus bermain "mencari dan menemukan" ketika mengkode permintaan basis data baru. Beberapa case membutuhkan hingga 10 level perintah yang tepat untuk membuat satu penghapusan.
Ini mengejutkan saya dan saya tidak yakin bagaimana menanganinya.
Dalam dunia saya yang sederhana, pengaturan itu membuat kendala kehilangan sebagian besar tujuan. OK jika database diakses dari host tanpa pengetahuan desain.
Bagaimana Anda akan bertindak dalam skenario ini?
Mengapa tidak menghapus semua batasan dari db dan menyimpannya di level aplikasi?
sumber
Jawaban:
Dua alasan umum untuk tidak menghapus hambatan dari DB :
Kasing beton Anda terdengar seperti skema DB mungkin awalnya dibuat oleh alat ORM (atau dirancang oleh seseorang yang tidak terlalu berpengalaman dengan dunia relasional), sehingga suboptimal dari sudut pandang relasional. Mungkin lebih baik untuk menganalisis dan memperbaikinya ke arah desain hubungan yang lebih "alami", sambil tetap konsisten dengan pandangan ORM. Mungkin bermanfaat untuk melibatkan pakar DB dalam analisis ini.
sumber
Aplikasi dapat datang dan pergi tetapi data hidup selamanya. Di perusahaan saya, DB lebih dari 30-40 tahun, itu akan hidup selama perusahaan itu ada. Aplikasi berubah, pengembang datang dan pergi. Lebih baik memiliki integritas dan model data logis yang baik. Dengan cara itu seseorang dapat melihat data dan mendapatkan pemahaman yang berarti tanpa harus melalui basis kode yang kompleks. Ini juga membantu dalam pelaporan secara signifikan. Juga aplikasi dapat dan akan memiliki bug dan kendala DB adalah penjaga terhadap itu. Posisi default saya adalah memiliki banyak kendala (FK dan periksa) sebanyak mungkin.
Satu-satunya alasan untuk tidak memiliki kendala adalah jika pola desain Anda tidak memungkinkan misalnya Tabel-per-hierarki atau masalah kinerja.
sumber
Itu tidak mengganggu saya, itu berarti seseorang telah menunjukkan akal sehat. Penghapusan Cascading seringkali sangat buruk untuk database. Di tempat pertama, kadang-kadang Anda ingin menghapus gagal jika Anda memiliki data di tabel terkait. Misalnya, jika Anda memiliki pelanggan yang memiliki pesanan di masa lalu, Anda tidak ingin dia dihapus atau Anda kehilangan data tentang siapa pesanan itu dan penghapusan kaskade akan menyingkirkan catatan yang akan mengacaukan Anda pelaporan keuangan .
Anda tampaknya berpikir bahwa kemudahan berkembang adalah hal yang paling penting. Dalam dunia basis data, ini tidak benar. Integritas data adalah hal paling kritis pertama diikuti oleh kinerja dan keamanan data. Jika dibutuhkan waktu lebih lama untuk menulis kueri maka jadilah itu.
Basis data biasanya ditindaklanjuti oleh banyak aplikasi = satu situs web atau lebih atau aplikasi desktop, aplikasi pelaporan, layanan web, jendela kueri, proses ETL, dll. Jika Anda tidak menegakkan hambatan pada tingkat basis data, Anda pertama-tama kehilangan integritas data sebagai salah satu aplikasi tersebut mungkin tidak mengikuti semua aturan. Kedua, Anda harus mengkodekan kendala-kendala itu beberapa kali dan menulis ulang jika Anda memutuskan untuk menggunakan aplikasi yang berbeda nanti. Ketiga, Anda tidak dapat mengontrol terlebih dahulu apakah akan perlu melakukan semacam tugas pemeliharaan data yang tidak akan terjadi melalui aplikasi (memperbaiki data dari impor data pelanggan yang buruk misalnya atau mengubah semua 10.000.000 catatan dari satu klien ke klien lain ketika perusahaan dibeli oleh pesaing). Biasanya pengembang aplikasi tidak
sumber
Saya pernah membaca suatu tempat yang pada dasarnya mengatakan: Data adalah kunci dari aplikasi Anda . Jika Anda hanya akan PERNAH mengakses data melalui UI Anda (dan maksud saya , seperti sekarang dan selamanya, untuk selamanya ... atau seumur hidup aplikasi Anda, lagi pula) maka Anda tidak perlu kendala basis data. Tetapi ada kemungkinan bahwa sesuatu selain aplikasi itu sendiri perlu menyentuh data, misalnya layanan web, API publik, tugas rake / SQL job / cron / script otomatis, maka Anda akan menyelamatkan diri sendiri dari banyak potensi masalah di jalan dengan menjaga batasan DB.
Saya sangat yakin ini adalah satu bidang pengembangan perangkat lunak di mana Anda seharusnya tidak menerapkan KERING (dan saya sepenuhnya mengharapkan sekumpulan downvotes untuk pernyataan itu). Data Anda adalah jantung dan jiwa dari aplikasi Anda - jika pernah rusak tidak dapat diperbaiki, itu: game over. Sebaiknya IMO untuk menegakkan kendala di mana pun mereka dibutuhkan. Jika itu berarti dalam bentuk Pemicu dan batasan pada tingkat DB, validasi sisi-server pada middleware, dan Javascript sisi-klien pada UI (untuk aplikasi web), maka IMO adalah kejahatan yang diperlukan untuk memastikan data selalu murni .
sumber
Tahukah Anda apa arti ORM? Pemetaan objek-relasional. Mengutip Wikipedia "teknik untuk mengkonversi data antara sistem tipe yang tidak kompatibel ". Yup, model relasional dan objek tidak cocok satu sama lain. ORM melakukan konversi yang cukup baik, dengan mematuhi aturan kedua sistem tipe. RDBMS diatur sedemikian rupa, sehingga Anda mencapai integritas data dengan menggunakan kendala. Secara umum, integritas adalah hal yang sangat baik untuk dimiliki, sehingga ORM cenderung menggunakannya ketika membuat model data untuk menyimpan data objek. ORM Anda mungkin memiliki alasan yang bagus untuk menggunakan batasan "non cascading". Dan jika ini memaksa Anda untuk membuat pertanyaan yang rumit alih-alih hanya membuat / memperbarui / menjatuhkan objek tertentu, maka ada sesuatu yang salah dengan pengaturan ORM Anda.
Jika Anda menganggap konsep relasional mengganggu, lalu mengapa Anda tidak menggunakan database objek? Beberapa waktu lalu mereka lambat (itulah sebabnya kebanyakan orang masih menggunakan RDBMS) tetapi dari apa yang saya dengar semuanya berubah sedikit. Anda akan menyingkirkan semua nitpicks relasional. Cukup objek masuk, objek keluar.
sumber
Yah itulah yang dilakukan eBay dan mereka mungkin memiliki salah satu basis data terbesar di dunia:
http://www.dba-oracle.com/oracle_news/news_ebay_massive_oracle.htm http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf
Terlepas dari apa yang telah dikatakan di atas tentang kinerja yang ditingkatkan oleh integritas referensial, itu sebenarnya dapat terdegradasi; itulah sebabnya database besar telah menjatuhkan batasan mereka dan melakukan pekerjaan di lapisan aplikasi. Dan sejauh yang saya tahu itu adalah satu-satunya alasan yang sangat bagus.
Dengan menjatuhkan batasan-batasan itu Anda pada dasarnya kehilangan jaring pengaman Anda yang menjaga data tetap bersih, dan itu menimbulkan masalah sendiri. Jadi seperti segala sesuatu itu adalah tindakan penyeimbang. Saya kira secara umum menjaga integritas referensial adalah hal yang benar untuk dilakukan.
Setelah bekerja di lingkungan pengembangan dengan integritas referensial yang kuat, saya tahu bahwa dari sudut pandang pengembang, itu bisa sangat menyakitkan; sering dalam lingkungan pengembangan sedikit data kotor tidak masalah dan mencari cara menghapus baris mungkin memakan waktu satu jam atau lebih. Namun, ini juga bisa sangat berguna, karena kendala membuat skema eksplisit.
sumber
Pertama - jawaban saya: Tidak, Anda tidak harus bergantung pada aplikasi sendirian untuk menjaga data Anda.
Ini menunjuk pada perdebatan yang lebih besar: ORM telah mendorong budaya penghinaan untuk interaksi DB "langsung", seringkali dengan mengorbankan normalisasi / integritas referensial. Tabel secara paksa dipetakan ke hierarki objek yang sewenang-wenang, dengan mengorbankan desain yang tersirat dalam model relasional. Decoupling yang disukai oleh OOP bisa dikorbankan di sini karena aplikasi membuat desainnya terasa dalam struktur data. Sementara ORM telah menunjukkan utilitas yang luar biasa, ORM tampaknya didasarkan pada penyalahgunaan atau ketidakpercayaan SQL.
Paradigma baru muncul (kembali), ambil contoh pemrograman Fungsional. Jika tim dev memutuskan untuk merangkul metodologi pemrograman baru maka implikasi apa yang akan terjadi pada data yang telah terstruktur sesuai dengan persyaratan ORM?
Saya setuju dengan @ Jacek Prucia - Saya pikir ORM cocok untuk RDBMS, saya pribadi akan memilih DBAL di RDBMS, atau menggunakan OODB dengan ORM.
sumber
Kendala adalah satu-satunya jaminan Anda bahwa Anda memiliki konsistensi dan integritas data di tingkat basis data. Tentu, Anda dapat menegakkan batasan menggunakan kode aplikasi Anda, tetapi bagaimana jika, di masa depan, Anda perlu memodifikasi data secara langsung? Anda mungkin mengerti bagaimana menjaga integritas data, tetapi orang lain mungkin tidak. Menjaga kendala pada tingkat data memastikan bahwa integritas dipastikan bahkan ketika seseorang berkeliaran di tempat-tempat yang tidak mereka pahami.
Lebih jauh, katakanlah aplikasi Anda perlu ditulis ulang, tetapi dengan database yang sama. Semua kendala dalam kode hanya meminta bug yang mencegah beberapa entri sementara memungkinkan data yang salah.
Saat berkembang, jagalah agar tetap sederhana. Kendala memungkinkan Anda melakukan itu. (Yang mengatakan, ketika kendala melempar kesalahan, jangan meludah kesalahan yang sama kembali ke pengguna. Buat kesalahan dimengerti.)
(Mengenai masalah kaskade: itu adalah hal yang baik. Saya lebih suka untuk melemparkan kesalahan bahwa beberapa catatan lain harus dihapus terlebih dahulu, daripada mengandalkan kaskade untuk mendapatkan segalanya dengan benar. Cascade bagus secara teori, tetapi tidak harus selalu jadi dalam praktek.)
sumber
Salah satu masalah dengan kendala dalam database adalah mereka memberikan informasi terbatas pada program tentang apa yang gagal dan bagaimana cara memperbaikinya. Ini berarti bahwa, untuk penanganan yang lancar, seringkali perlu untuk mengulang pemeriksaan kendala dalam aplikasi, dan oleh karena itu pemeriksaan kendala basis data merupakan usaha yang sia-sia.
Ini berisiko membahayakan integritas data, jadi kami punya untung di sini. Untuk data penting, memastikan integritas data hampir selalu lebih penting daripada kinerja, dan jauh lebih baik untuk gagal transaksi bahkan jika itu terlihat sewenang-wenang daripada mengacaukan data.
Untuk menghapus kendala dengan aman, maka penting untuk mengamankan akses basis data sehingga tidak ada yang dapat mengubah basis data tanpa memeriksa kendala. Ini tidak dapat diandalkan ketika menulis aplikasi baru atau mencari cara ad hoc untuk menangani data, karena yang diperlukan hanyalah satu kesalahan dan database rusak.
Oleh karena itu, untuk menghilangkan kendala basis data, perlu untuk menetapkan apa yang dapat dan apa yang tidak dapat dilakukan dengan basis data di muka, sehingga semua aplikasi dapat ditulis, ditinjau, dan diuji secara luas. Semua persyaratan basis data harus ditetapkan di muka, dan setiap perubahan pada persyaratan basis data akan membutuhkan pekerjaan yang luas. Ini adalah sesuatu dari metodologi air terjun beku, yang hanya berfungsi dalam kasus yang sangat spesifik. (Mendesain, mengimplementasikan, dan memelihara persyaratan seperti berjalan di atas air. Sesuatu harus dibekukan terlebih dahulu, dan jika tidak dibekukan cukup hasilnya dapat menjadi bencana.)
Salah satu kasus di mana ia berfungsi adalah aplikasi perusahaan besar seperti PeopleSoft dan SAP, di mana aplikasi sudah melakukan segalanya, dan ada cara yang ditentukan dengan hati-hati untuk memperluasnya. Ada kemungkinan lain yang sangat jarang.
Jadi, kecuali Anda bekerja pada proyek perusahaan yang sangat besar (dan saya tidak mau) atau dapat berjalan di atas air cair, tinggalkan kendala itu dalam database.
sumber