Apakah masih ada kebutuhan untuk menulis SQL?


12

Dengan begitu banyak alat ORM untuk sebagian besar bahasa modern, apakah masih ada use case untuk menulis dan mengeksekusi SQL dalam suatu program, dalam bahasa / lingkungan yang mendukungnya? Jika demikian mengapa?

Untuk kejelasan: Saya tidak bertanya apakah programmer perlu tahu SQL, atau apakah saya harus memiliki alat SQL di desktop saya. Saya bertanya secara spesifik mengapa saya mungkin memilikinya dalam kode (atau konfigurasi, atau apa pun) yang bertentangan dengan ORM.


Bisakah ORM menangani kueri dinamis? Saya tahu Anda dapat mengubah klausa mana tanpa banyak masalah (di sebagian besar ORM). Tapi apakah ada satu di mana Anda dapat mengubah seluruh pernyataan sql dengan cepat? Saya tahu beberapa kegunaan di mana itu akan impoten dan di mana sql mentah mungkin akan lebih mudah untuk ditangani.
Tony

jawaban singkat, YA.
gabe.

Jawaban:


35
  • Anda lebih nyaman menulis SQL untuk meminta data daripada menulis kode prosedural.
  • ORM Anda, meski cantik untuk dilihat, menghasilkan SQL lambat yang mengerikan di beberapa area kritis.
  • Anda perlu memanfaatkan fungsionalitas yang diekspos oleh RDBMS Anda yang tidak / tidak dapat disediakan melalui ORM Anda.
  • Setiap kali Anda mengetik SELECT * FROM..., Tuhan membunuh anak kucing. Dan Anda membenci anak kucing.
  • Anda tidak menggunakan ORM, OOP, atau bahasa modern.

8
Semua alasan bagus. Efisiensi akan menjadi nomor satu saya. Situasi tertentu ORM seperti yang Anda katakan menghasilkan SQL yang dapat dioptimalkan dengan tangan dan disesuaikan.
Chris

20
Jika saya sudah tahu apa yang ingin saya katakan dalam bahasa Inggris, mengapa saya harus menulis bahasa Prancis dan mengirimkannya melalui kotak hitam yang akan menerjemahkannya ke bahasa Inggris? Saya lebih suka menulis sendiri dengan fasih daripada memanipulasi bahasa Prancis dengan harapan membuat bahasa Inggris yang benar.
Mike M.

8
die kitty die !!
ubur

3
Saya berbicara bahasa Prancis dan Inggris secara asli. Analogi ini sangat bagus: Anda dapat membawa pesan utama, tetapi nuansa halus akan hilang. Nuansa halus terkadang lebih penting, karena mereka bertindak seperti bahasa tubuh untuk menunjukkan posisi yang tidak diucapkan. Saya lebih suka menulis SQL.
Christopher Mahan

2
Selain abstraksi yang bocor, orang-orang di sini tampaknya lupa bahwa sebagian besar ORM memiliki banyak keunggulan dibandingkan pertanyaan SQL biasa: cache tingkat pertama dan kedua, pemuatan malas (dengan pemuatan yang cepat menjadi pilihan untuk menghindari masalah N +1) dan mampu menyatukan -menguji lapisan akses data (dengan mengganti DBMS untuk basis data dalam memori), hanya untuk menyebutkan beberapa ...
rsenna

15

Menulis SQL yang kompleks

ORM sangat bagus untuk hal-hal dasar. Namun untuk situasi yang kompleks Anda harus menulis SQL.

Jadi singkatnya, pasti ada kebutuhan untuk SQL dan akan selalu begitu.


1
Baru-baru ini saya menulis ulang proyek rekan kerja. Saya mengganti 9 proyek C #-nya (termasuk 2 lapisan akses data) dengan skrip SQL 150 baris tunggal. Menjalankan proyek (yang mengimpor data dari SchemaLogic ke dalam layanan metadata terkelola SharePoint 2010) sekarang membutuhkan waktu 3 menit alih-alih 15. Versi SQL jauh lebih cepat dan lebih pendek sehingga bahkan tidak lucu.
Semut

Seratus persen setuju. Untuk aplikasi bisnis nyata untuk institusi besar, situasi kompleks selalu terjadi.
Rick Henderson

10
  • Tampilan
  • Pemicu
  • Kendala
  • Paket (SSIS, DTS, dll)
  • Kapan saja Anda perlu mengontrol alur eksekusi dengan tepat

ORM tidak membantu Anda membangun, menyetel, atau mengotomatisasi basis data. Itu hanya memberi Anda cara alternatif untuk berinteraksi dengan database setelah Anda melakukan semua hal itu.


Saya setuju, tetapi pertanyaannya adalah apakah perlu ada SQL dalam kode C # (misalnya) saya, bukan tentang apakah pekerjaan DB perlu dilakukan. ORM akan berbohong atas sebagian besar hal ini.
C. Ross

@ c. ross Ya, dan tentu saja ini bukan kasus umum, saya punya alasan untuk membangun / mengubah / mem-parsing semua ini melalui kode pada titik-titik dalam karier saya. Jika Anda tidak memiliki alasan untuk melakukan hal-hal itu dalam kode maka Anda tidak melakukannya, tetapi saya tidak mengetahui ORM yang melakukan pekerjaan yang sangat baik pada operasi skema. Kontrol yang tepat dari aliran eksekusi adalah kasus yang lebih umum bagi kebanyakan orang, tetapi ada kasus di mana hal itu tidak diperlukan juga. Anda juga benar bahwa ORM bisa berbohong, dan saya akan berpikir itu benar dalam banyak kasus selama Anda tidak mengubah skema yang cukup untuk membuat ORM marah.
Bill

4

Tentu:

  • Umumnya ORM merangkum banyak, tetapi pada akhirnya Anda harus tahu apa yang terjadi di balik layar. Ini sangat penting untuk kinerja dan skalabilitas. Meskipun di dalam aplikasi saya tidak menulis banyak SQL tapi saya tahu kira-kira bagaimana SQL atau DDL terlihat.
  • SQL langsung seringkali baik untuk menulis kueri baca-saja. Jauh lebih mudah untuk merumuskannya dalam bahasa permintaan ORM dan Anda juga dapat membatasi hasil yang ditetapkan (misalnya 'pilih id dari .....').
  • ORM seharusnya tidak membuat Anda jauh dari SQL sama sekali. Saya menggunakan SQL banyak untuk permintaan ad-hoc langsung pada DB-client (seperti mysql-client). Ini memberi Anda antarmuka seragam yang sangat bagus dan fungsi pengelompokan.

4

ORM ada karena ketidakcocokan impedansi antara implementasi DB relasional bersama kami dan fitur bahasa OO kami. Mereka hanya sebuah jembatan, namun kebanyakan orang memperlakukan SQL seperti keju Limburger di lemari es.

Jika Anda dapat mengatakan bahwa Anda akan selalu menggunakan ORM atau lapisan akses data abstrak lainnya alih-alih memperlakukan SQL / prosedur tersimpan / tampilan sebagai antarmuka kelas satu, maka kemungkinan Anda akan lebih baik tanpa menyentuh SQL.

Dalam praktiknya, saya belum pernah melihat proyek murni ORM yang tidak memerlukan setidaknya SQL untuk meminta database untuk validasi akhir.


3

ORM adalah alat dalam kotak alat pemrogram. Mereka memiliki masalah sendiri. Beberapa contoh adalah:

  • Tidak dapat mengontrol sql
  • Menderita masalah n +1

2
Apa itu "N + 1 masalah"? Saya tidak terbiasa ...
RationalGeek

Saya pikir ini adalah ini: stackoverflow.com/questions/97197/…
Axe

2
Tidak yakin saya setuju. ORM yang baik harus memungkinkan Anda menjalankan SQL mentah bila perlu, dan masalah N +1 biasanya kesalahan pemula (misalnya loop bersarang atas koleksi malas-dimuat) yang dapat dengan mudah dihindari.
richeym

@richeym: Di situlah hal-hal pertama yang muncul di pikiran saya. Namun jawaban yang lain mendukung saya. Intinya adalah ORM hanyalah alat, ada kasus di mana sql mentah lebih disukai.
Tony

3

Jika Anda tahu apa yang Anda lakukan, Anda dapat secara efektif menggunakan ORM untuk mengganti banyak kode jenis CRUD Anda. Mereka tidak seefektif untuk hal-hal yang kompleks, mereka sulit untuk menyempurnakan kinerja (Anda tahu bahwa kinerja adalah salah satu bagian penting dari desain database, bukan meniru objek) dan mereka benar-benar mengerikan dan berbahaya di tangan seseorang yang tidak bisa mengerti atau menulis SQL sendiri.

Saya juga ingin menunjukkan bahwa pelaporan yang kompleks tidak mudah dilakukan secara efektif dengan ORM. Dan lebih jauh lagi jika Anda tidak belajar SQL sederhana dalam hal-hal sederhana, bagaimana Anda akan sampai pada titik di mana Anda dapat menulis SQL kompleks untuk pelaporan? Saya tidak pernah bekerja dalam aplikasi yang tidak memiliki kebutuhan pelaporan dan seringkali yang cukup rumit.

ORM juga tidak berguna untuk proses BI atau ETL untuk sebagian besar. Mereka juga tidak berguna untuk permintaan admin basis data atau untuk menemukan informasi dalam tabel audit dan membatalkan serangkaian perubahan basis data tertentu. Ada banyak banyak hal yang masih paling efektif dilakukan dengan SQL. Aplikasi yang meminta basis data adalah sebagian kecil dari apa yang dibutuhkan untuk menanyakannya dalam lingkungan Perusahaan.

Saya juga melihat banyak pertanyaan tentang bagaimana melakukan sesuatu menggunakan ORM yang sudah diketahui poster itu di SQL. Sangat menyenangkan untuk mempelajari hal-hal baru, tetapi ketika mereka menyebabkan waktu dan usaha ekstra tanpa keuntungan nyata dari metode asli (dan seringkali kehilangan kinerja yang nyata), mengapa Anda menggunakannya selain mereka "modis" saat ini.


2

Terkadang klien hanya ingin permintaan cepat dan mudah untuk mengembalikan data untuk laporan, ekspor, datadump, dll dan ingin menunggu seluruh program dikembangkan.

Juga, seorang programmer SQL yang baik selalu dapat menulis lebih cepat, SQL yang lebih efisien daripada ORM yang saya gunakan. Juga, saya telah menemukan banyak orang hanya memiliki poin ORM untuk prosedur tersimpan - benar-benar mengabaikan manfaat dari ORM karena ORM tidak bagus untuk proses yang kompleks.

Juga, ketika menggunakan database seperti Oracle dengan bahasa prosedur yang sangat kaya dan kuat, Anda dapat melakukan banyak hal tanpa pernah membutuhkan "program". PL / SQL on Oracle di tangan kanan sangat cepat dan efisien.


1
PL / SLQ singkatan dari "Bahasa Prosedural / Bahasa Query Terstruktur" jadi bagaimana itu bukan "program"?
Christopher Mahan

Christopher Mahan: Tepat. Produk utama perusahaan tempat saya bekerja terdiri dari ~ 5 kali lebih banyak kode PL / SQL daripada Java Code (LOC).
user281377

0

Jika Anda ingin menggunakan database sendiri, ya. Sebagian besar ORM yang saya coba gunakan tidak cukup atau tidak mencakup basis data saya. Selain itu, bagaimana Anda akan memecahkan masalah atau menulis kueri khusus yang tidak tercakup?


0

Masih diperlukan untuk pemicu penulisan dan prosedur tersimpan. Prosedur yang tersimpan mungkin tidak disukai saat ini, tetapi masih sangat berguna dalam beberapa situasi. SQL mungkin juga diperlukan untuk beberapa sambungan multi-tabel yang sangat berbulu.


0

Ya, Anda dapat menghindari menulis SQL. Tetapi Anda akhirnya akan menulis HQL (atau Linq, atau DQL ...)!

Serius, saya penggemar berat ORM, dan saya pikir orang mungkin menghindari menggunakan SQL murni sebagian besar waktu. Tetapi kita harus ingat bahwa ORM hanyalah satu abstraksi besar, dan semua abstraksi besar bocor ...

(Tetapi tentang masalah N + 1: ini berkaitan dengan pemuatan malas, dan sebagian besar alat ORM memiliki beberapa cara untuk meminta pemuatan dengan cepat, sehingga menghindari masalah tertentu.)


0

ORM hanya akan membuat Anda sampai pada titik tertentu. Tetapi ada beberapa kasus ketika Anda harus menjalankan kueri yang sangat rumit, dengan penggabungan yang rumit, subkueri, serikat pekerja, minus, fungsi analitik dll. Saat itulah Anda membutuhkan SQL. Tetapi bagaimana Anda seharusnya menulis pertanyaan yang rumit ketika Anda menyerahkan semua pertanyaan sederhana ke ORM?


0

Bahkan jika Anda tidak perlu menuliskannya dalam kode Anda, cukup berguna untuk dapat menggunakannya ketika Anda memiliki akses terminal ke server database.

Juga, sebagian besar dari apa yang membuat pemrograman tantangan bekerja dalam batasan bahwa hidup set kita-sering kita sedang bekerja dengan kode lama, atau versi lama dari database dan tidak memiliki kesempatan untuk menginstal perpustakaan ORM terbaru untuk bahasa apapun kita bekerja dengan. Dalam situasi itu Anda akan membutuhkan alat apa pun yang Anda inginkan.

Sisa waktu Anda mungkin tidak perlu SQL untuk hal-hal CRUD Anda, tetapi ada banyak lagi untuk SQL daripada pertanyaan SELECT, INSERT, UPDATE, dan JOIN dasar sederhana. Anda dapat melakukan hal-hal yang sangat pintar dengannya dan meskipun Anda mungkin tidak sering menggunakannya, penting untuk mengetahui apa itu.

Semakin, saya pikir kita akan menemukan diri kita di dunia pasca SQL, namun- sebagian besar layanan Cloud menggunakan penyimpanan tabel non-sql dan untuk jenis pekerjaan CRUD sederhana, kekuatan penuh SQL tidak diperlukan. Tetapi itu tidak berarti tidak akan ada nilai dalam memahaminya.

Juga, tentu saja, seseorang harus cukup tahu untuk menulis sistem ORM yang lebih baik jika yang sekarang tidak terlalu banyak. Ini akan membantu mereka jika mereka tahu SQL ...


Tepat: setelah menulis mesin pelaporan dan laporan mewah dari lingkungan data warehouse oracle, saya dapat dengan tegas memberi tahu Anda bahwa mengetahui SQL tidak sama dengan mengetahui bagaimana menggunakan ORM.
Christopher Mahan

0

Untuk membangun aplikasi web skala besar itu sama sekali tidak perlu dan dapat membuat hal-hal jauh lebih menegangkan dan membuang waktu daripada yang seharusnya. Alasan untuk ini adalah bahwa setiap aplikasi skala besar harus menggunakan lapisan ketekunan memori (dalam RAM) yang harus menjadi bagian caching memori dari DB yang sering digunakan.

Jika Anda harus melakukan sesuatu dengan perangkat seluler, dll. Yang tidak memiliki banyak memori untuk bekerja, di mana aplikasi yang sedang diprogram dijalankan sebagai "klien" atau aplikasi mandiri di perangkat seluler, tablet, dll. hal-hal seperti menggunakan SQL masih umum dan penting karena memori pada perangkat sangat kecil sehingga Anda tidak dapat menyimpan banyak hal dalam memori.


2
"Aplikasi skala besar apa pun harus menggunakan lapisan persistensi memori (dalam RAM) yang seharusnya merupakan bagian cache memori dari DB yang sering digunakan." - Setiap basis data yang layak akan melakukan ini juga.
Matius Frederick

Android dan iPhoneOS keduanya menggunakan SQLite, sistem database yang sesuai dengan SQL-92. Lihat stackoverflow.com/questions/2011724/…
Christopher Mahan

0

Kompleksitas dan jumlah SQL yang saya tulis tidak cukup untuk membuat mengaitkan kerangka kerja ORM secara wajar.

(Saya menulis SQL mungkin sebulan sekali, jika)


0

Saya telah menemukan banyak korps besar dengan DBA yang secara aktif takut dev menggunakan alat ORM.

Mereka adalah DBA yang terlibat dalam penyetelan dan kinerja.

Dan ya, alat ORM dapat dikelola untuk melakukan hal-hal seperti ini, tetapi saya telah melihat tempat-tempat di mana mereka hanya akan menerima prosedur tersimpan (Sql Server) dan akan menanyai Anda tentang apa yang Anda lakukan di dalamnya.

Juga, alat ORM dapat disalahgunakan dengan buruk dan menghasilkan Sql yang sama buruknya dengan menulis Sql sendiri.


Saya kira DBA yang khawatir tentang dev menggunakan ORM sama dengan dev yang mengkhawatirkan seorang analis / manajer / pelanggan diberi alat yang memungkinkan mereka menulis kode!
gbjbaanb

0

Satu masalah besar - migrasi DDL & basis data. Terkadang Anda perlu menjahit tangan barang-barang itu untuk memperbarui sesuatu tanpa merusak data yang ada.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.