REKAM TENTANG JAWABAN LAINNYA
Berikut ini ringkasan singkat dari apa yang orang lain katakan di sini sebelumnya.
Kebijakan pro perusahaan:
- Memungkinkan untuk melacak dependensi antara objek basis data dan ikhtisar bagaimana perubahan yang direncanakan memengaruhi skema;
- Tim DBA dapat meninjau dan mengendalikan hak akses aplikasi;
- Tim DBA mampu memprediksi dampak perubahan kinerja;
- Memisahkan basis data dari kode aplikasi;
- Teori jendela rusak ... artinya begitulah cara mereka mengatur kode mereka, dan melanggar konsistensi akan membuat infrastruktur lebih sulit untuk dipahami oleh pendatang baru, yang akan membuat mereka lebih sedikit menghargai dan mengusahakan kualitas;
- Anda mendapatkan gaji Anda untuk melakukan apa yang diminta Anda lakukan. Ini adalah kebijakan perusahaan dan saat ini Anda tidak memiliki wewenang untuk mengubahnya, jadi lebih baik hidup dengannya.
Kebijakan perusahaan yang kontra:
- Pola pikir perusahaan ini sangat kaku dan dogmatis, dan kebijakan ini membuat pekerjaan pengembang menjadi tidak praktis. Sayangnya, lihat poin terakhir di bagian Pro;
- Karena back2dos menyebutnya dengan mengatakan "Untuk setiap permintaan yang dibuat ke database, Anda harus mencari prosedur yang tersimpan" , kebijakan khusus-sprocs sering menghasilkan duplikasi kode, karena pengembang yang berbeda tidak tahu sprocs mana yang dapat digunakan kembali untuk database mereka. masalah yang dihadapi;
- Ironisnya, kebalikan dari kasus sebelumnya juga menimbulkan masalah, ketika beberapa aplikasi memiliki sproc, lalu aplikasi lain menggunakannya kembali, lalu yang pertama memperbaruinya tanpa sepengetahuan siapa lagi yang mulai mengandalkannya. DBA melacak dependensi tidak lebih jauh dari dinding ruang server DB, jadi jangan berharap mereka peduli apa yang bergantung pada aplikasi apa di luar itu. Jika tim aplikasi tidak melacak di antara mereka sendiri itu masalah mereka, DBA dicakup.
MEREKA 2 CENTS
Pertama, banyak jawaban di sini menggunakan kata standar . Praktek melarang permintaan langsung dan hanya mengizinkan sprocs tidak disebut sebagai standar. Ini kebijakan (lihat jawaban jzd ).
Kedua, spesifik untuk masalah Anda: argumen kontra utama saya terhadap kebijakan pembatasan seperti menggunakan prosedur tersimpan secara eksklusif adalah bahasa SQL itu sendiri , dan tidak harus infrastruktur repositori logika bisnis terpusat yang dipromosikannya (meskipun itu juga memiliki argumen-kontra) .
SQL adalah bahasa yang agak kaku dan tidak dapat digabungkan, dengan daya ekspresif yang sangat terbatas . Ini berarti bahwa Anda akan menemui jalan buntu sangat awal berkaitan dengan penggunaan kembali kode . Salah satu alasan kekakuan ini adalah bahwa tidak ada cara untuk melewati fungsi kelas satu dengan cara apa pun (seperti dengan bahasa OOP menggunakan polimorfisme), yang membatasi kompabilitas secara signifikan. Yang paling dekat Anda bisa mendapatkan bahwa dalam kekuatan ekspresif adalah dengan menulis query SQL dinamis yang dibangun menggunakan penggabungan string. Bukan hal yang rapi. Kueri dinamis mengalahkan beberapa poin di bagian "pro", seperti ketergantungan pelacakan antara objek DB, dan biasanya memiliki kinerja yang lebih buruk, rawan kesalahan, sulit untuk debug, dan meningkatkanrisiko serangan injeksi SQL . Sayangnya, dengan SQL Anda akan menemukan bahwa Anda tidak bisa jauh dengan mengekstraksi logika umum yang dapat digunakan kembali antara sprocs tanpa mengenai dinding dan dipaksa untuk menggunakan kueri yang dieksekusi secara dinamis.
PEMBARUAN: Keterbatasan besar lain dari prosedur tersimpan, selain hal fungsi kelas satu, adalah lewat dan kembalinya tipe data komposit sebagai argumen, apakah itu daftar, set, catatan, atau pasangan nilai kunci. Ini juga sangat menyakitkan kompabilitas.
Akhirnya, saya tidak perlu setuju dengan salah satu poin pro di atas, "decoupling DB from application" oleh Jorge : Prinsip utama yang saya rasa berlaku di sini adalah untuk lebih memilih struktur data primitif dengan serangkaian besar operasi yang dapat digunakan kembali dan dapat dikomposisikan secara umum, daripada bekerja dengan API khusus . Sprocs adalah API khusus semacam itu di sini, yang berdiri di antara pengguna dan data relasional primitif untuk menanyakannya menggunakan primitif manipulasi data komposabel ( pilih, gabung, di mana, kelompokkan menurut, dll). Sekarang SQL itu sendiri bukan pilihan ideal untuk menjadi DSL untuk primitif manipulasi data yang dapat dikomposit, karena kekakuan yang disebutkan di atas, tetapi dengan pilihan bahasa yang lebih masuk akal (seperti. NET Linq ... atau Lisp / Clojure!) Anda dapat menjalankan logika terhadap Daftar sederhana dengan cara yang sama seperti melawan DB ResultSet. Jelas, itu membuatnya mudah diuji, yang merupakan Good Thing. Saya katakan lebih suka menyimpan data Anda menjadi sederhana dan primitif, sehingga dapat dihilangkan dengan CSV biasa. Seperti yang Anda lihat, model ini memisahkan DB dari aplikasi juga, hanya itu menarik garis pada tingkat abstraksi yang lebih rendah.
APA YANG HARUS DILAKUKAN SELANJUTNYA?
Ini agak tidak terkait dengan pertanyaan, tetapi saya mendorong Anda untuk melihat Datomic , yang memiliki pendekatan baru yang menarik untuk menyimpan dan menanyakan data, sejalan dengan beberapa pengamatan di atas. (Jelas, maksud saya melihat itu benar-benar di luar lingkungan kerja pertama ... pasti JANGAN pergi ke kantor CTO pada hari berikutnya dan berkata "Hei teman-teman saya menulis ulang beberapa sprocs Anda di Datomic dan menyebarkannya di server prod mengkilap ini melalui di sana, itu benar-benar keren lihat! " Mereka mungkin tidak menghargai kegembiraan yang benar-benar dimengerti;)