Apakah tidak perlu mempelajari jenis struktur data dan objek di dalam sql hanya karena kita menggunakan bahasa lain untuk mengakses db secara tidak langsung?

8

Misalkan kita menggunakan java atau python untuk mengakses database. Lalu apakah itu dianggap pemborosan waktu dan tidak perlu untuk mempelajari jenis struktur data dan objek yang digunakan di dalam sql?

Harap jawab dengan merujuk pada industri perangkat lunak. Silakan coba beri tahu dalam hal apa sebaiknya mengetahui hal-hal seperti itu.

Saya berdebat dengan seseorang yang mengatakan bahwa tidak perlu mempelajari hal-hal seperti itu.

aste123
sumber
11
Siapa pun yang berdebat dengan Anda perlu mempelajari keniscayaan abstraksi yang bocor.
Alternatex
5
@Alternatex - mungkin seharusnya mengaitkan sumber hikmat itu .
Jules
Jika yang Anda tahu adalah bagaimana menggunakan palu, Anda memperlakukan setiap masalah seolah-olah itu paku ....
gbjbaanb

Jawaban:

20

Beberapa tahun yang lalu saya mengerjakan sebuah aplikasi yang ditulis oleh seseorang yang jelas tidak pernah belajar cara kerja database SQL. Saya diberi laporan masalah untuk diperbaiki - halaman ringkasan status utama, yang selalu lambat, sekarang mulai sangat lambat sehingga mencapai batas waktu eksekusi skrip server (3 menit) selama rendering. Tampaknya jumlah klien dalam sistem meningkat, waktu untuk membuat halaman status meningkat secara kuadrat .

Tidak butuh waktu lama bagi saya untuk mengetahui masalahnya, yaitu bahwa halaman tersebut menggunakan kueri yang menggabungkan data dari dua tabel yang berbeda, yang keduanya tidak memiliki indeks . Karena setiap tabel memiliki ukuran yang tumbuh dalam O (n) dengan jumlah klien, kueri mengambil O (n ^ 2) waktu untuk mengeksekusi karena mengambil setiap baris dari tabel pertama, dan untuk setiap baris itu mengambil setiap baris tabel kedua untuk membandingkannya.

Memecahkan masalah membutuhkan waktu beberapa menit, dan siapa pun yang memahami cara kerja database SQL akan dapat melakukannya dengan cepat . Penulis asli tidak, jadi meninggalkan solusi yang sama sekali tidak memadai.

Anda perlu memahami bagaimana (setidaknya secara umum) suatu teknologi bekerja untuk menghindari kesalahan yang mengerikan seperti ini.

Jules
sumber
Bagaimana dengan jenis objek yang SQL akan kembali untuk permintaan tertentu? Apakah perlu mengetahui detail seperti itu? Argumen yang diajukan di depan saya adalah karena bahasa yang menanyakan basis data seperti Java mengubah objek SQL ke bentuk lain sebelum mengembalikannya ke kode panggilan, kita tidak perlu tahu jenis objek yang dikembalikan oleh SQL tanpa tulang.
aste123
2
@ aste123 Sangat penting untuk memahami perbedaan antara tipe data yang digunakan oleh database dan bahasa host Anda, karena mereka dapat menyebabkan kesulitan dalam konversi. Pertimbangkan tanggal, misalnya. Banyak database memiliki rentang tanggal yang jauh lebih kecil yang dapat mereka simpan daripada Java (SQL Server, misalnya, akan menolak tanggal apa pun sebelum tahun 1753, dan MySQL sebelum 1001, sementara keduanya menolak tanggal setelah 9999).
Jules
5

Jangan mengabaikan kemungkinan bahwa Anda harus benar-benar masuk ke database dan meminta secara langsung sebagai bagian dari proses debugging. Jika Anda pernah berakhir melakukan itu, Anda pasti ingin tahu semua tentang teknologi database dan bagaimana database tertentu Anda terstruktur. Mungkin itu tidak akan terjadi. Tetapi jika itu terjadi (dan dalam pengalaman saya itu selalu terjadi di beberapa titik) Anda akan membutuhkan pengetahuan itu.

Tapi mari kita asumsikan bahwa Anda tidak perlu melihat langsung dalam database untuk alasan apa pun. Katakanlah Anda menggunakan ORM dengan cara yang konsisten dengan semua praktik terbaik yang ditetapkan oleh komunitas. Anda bisa membuat aplikasi berkinerja tanpa kesalahan besar / bottleneck / inefisiensi wrt ke data. Tetapi jika Anda tidak benar-benar memahami database yang mendasarinya, Anda tidak akan benar-benar mengerti mengapa Anda melakukan hal-hal seperti Anda. Lebih buruk lagi, Anda tidak akan benar-benarmemahami bagaimana praktik terbaik berlaku untuk kasus penggunaan khusus Anda. Fakta-fakta ini seharusnya menabur keraguan bahwa Anda menciptakan solusi optimal. Solusi Anda mungkin berhasil, tetapi Anda tidak akan bisa mengatakan "ini adalah solusi terbaik" dengan kepercayaan diri yang nyata. Jika Anda tidak bisa mengatakan itu, Anda bukan aset besar di mata perusahaan Anda dan jika Anda mengatakan itu dan Anda salah, itu akan tampak buruk bagi Anda.

Di luar hanya masalah filosofis yang saya miliki tentang tidak mempelajari dasar-dasar tumpukan teknologi Anda, saya berurusan dengan alasan nyata untuk mengetahui tumpukan Anda dari atas ke bawah setiap hari. Di perusahaan saya, kami memiliki monolit besar yang menangani data dalam jumlah besar. Berbagai hal dimodelkan dengan baik, tetapi ada puluhan jenis objek dalam aplikasi dan hubungan di antara mereka adalah web luar biasa dari kunci asing dan tabel asosiasi. Terus terang, jika Anda tidak pernah melihat dalam SQL dan hanya menyelam ke dalam aplikasi (meskipun semuanya dimodelkan dengan benar dalam aplikasi dan menggunakan ORM dan menetapkan praktik terbaik untuk ORM itu), mencari tahu bagaimana mendapatkan sedikit informasi yang diberikan bit ini lainnya di sini bisa menjadi tugas yang hampir mustahil. Tetapi jika Anda bisa terjun ke DB, Anda bisa melihat semua bidang di setiap model, ikuti koneksi antar tabel, mencari jalan dari satu bagian ke yang lain, mengujinya dengan kueri, lalu cari model yang tepat untuk melakukannya melalui ORM dengan cepat dan efisien. Saya tidak akan menjadi setengah dari aset di perusahaan saya jika saya tidak memiliki tingkat kenyamanan yang tinggi dengan SQL bare-metal.

Jon Swanson
sumber
5

Hanya sampai titik tertentu

Sebagai pengembang perangkat lunak, Anda mungkin harus meminta dan memperbarui database, dan mengetahui bagaimana operasi DB sangat penting untuk menghindari pertanyaan yang buruk, bergabung tidak efisien dan sebagainya. Anda mungkin memiliki DBA khusus yang dapat memutuskan di mana harus menambahkan indeks dan mempartisi basis data, tetapi Anda tidak dapat mengandalkannya, tidak di perusahaan kecil dan tidak selalu di yang besar juga.

Namun

Meskipun Anda harus tahu apa itu indeks dan bagaimana mereka harus digunakan, Anda mungkin tidak perlu tahu bagaimana mereka bekerja secara internal. Detail implementasi internal hanya itu - detail implementasi.

Mengetahui cara memeriksa paket kueri SQL dan membuat kode Anda sesuai dengan itu adalah bagian dari API yang ditampilkan oleh DB Anda. Mengetahui algoritma internal dan struktur data yang digunakannya untuk mencapainya? Tidak. Banyak. Sebagai analogi, saya harus tahu implikasi kinerja menyimpan file ke disk. Saya tidak perlu peduli tentang bagaimana sistem file saya diimplementasikan.

Namun untuk Namun

Jika, seperti yang diperlihatkan oleh komentar yang diklarifikasi, pertanyaannya adalah tentang memahami akses DB vs hanya mengandalkan ORM dan abstraksi kode lainnya, jawabannya sangat "ya, Anda harus tahu akses DB". Tidak setiap proyek menggunakan atau dapat menggunakan ORM, dan ORM tidak ideal untuk tugas-tugas tertentu (laporan, sisipan massal, dan banyak lagi).

Avner Shahar-Kashtan
sumber
Bagaimana dengan jenis objek yang SQL akan kembali untuk permintaan tertentu? Apakah perlu mengetahui detail seperti itu? Argumen yang diajukan di depan saya adalah karena bahasa yang menanyakan basis data seperti Java mengubah objek SQL ke bentuk lain sebelum mengembalikannya ke kode panggilan, kita tidak perlu tahu jenis objek yang dikembalikan oleh SQL tanpa tulang.
aste123
@ aste123 inilah contoh mengapa Anda peduli: berapa kisaran tanggal yang bisa Anda masukkan ke dalam kolom datetime SQL? Berapa kisaran tanggal yang bisa Anda masukkan ke dalam variabel datetime Java yang dapat dibaca dari DB? Jika keduanya tidak persis sama, Anda bisa berakhir dengan masalah yang Anda tidak tahu cara memperbaikinya. Tapi, tentu saja, programmer rata-rata tidak perlu peduli, tetapi programmer hebat selalu, selalu ..
gbjbaanb
@Jules baik saya tidak pernah! ... tetap saja, orang-orang hebat ... mungkin memiliki gangguan yang berkaitan dengan waktu yang sama :-)
gbjbaanb
3

Ini benar-benar sepadan dengan waktu! Menjadi pengembang tumpukan penuh memungkinkan Anda menghasilkan solusi bernilai tambah secara efisien. Saya sudah terlalu sering melihat gangguan komunikasi dan pengembangan silo'd Tiga kali lipat waktu pengembangan dan setengah kualitas.

Pada akhirnya, semakin banyak keterampilan yang Anda miliki, semakin berharga Anda.

John Cappelletti
sumber
3

Jika Anda mengaku tidak tahu apa-apa tentang mobil , apakah saya akan senang dengan Anda memperbaiki rem mobil saya? Saya pikir tidak.

Database terasa berbeda dari struktur data yang Anda gunakan untuk bekerja dalam pemrograman. Mereka memiliki keanehan dan keanehan mereka sendiri dan hal-hal lain yang akan menggigit Anda dalam Kinerja Aplikasi jika Anda tidak memahami mereka.

Saya telah bertemu orang-orang dengan mentalitas "Saya tidak perlu tahu Database"; kebanyakan dari mereka menganggap Database sebagai tidak lebih dari Spreadsheets dan menghasilkan aplikasi yang berkinerja buruk sebagai hasilnya.

Karena itu, Anda tidak perlu tahu bagaimana database bekerja secara internal .

Apakah mengenal hal-hal yang logis; Tabel, Indeks, Tampilan dan sejenisnya.

Jangan terjebak dalam detail implementasi tentang bagaimana DBMS tertentu menangani hal-hal ini; mereka semua melakukannya secara berbeda satu sama lain (dan kadang-kadang antara versi mereka sendiri !), sehingga "gambaran umum" umum akan memberikan yang terbaik bagi Anda.

Phill W.
sumber
2

Anda benar-benar perlu tahu. Misalnya, jika database Anda menyimpan tanggal, Anda perlu tahu presisi seperti apa yang dapat Anda harapkan. Jika Anda menyimpan stempel waktu di DATEbidang, Anda harus tahu apakah basis data akan memotong nilai Anda ke detik terdekat (atau lebih buruk, hari terdekat). Anda juga harus tahu bahwa nilai-nilai yang berasal dari NUMBER(9,2)kolom harus disimpan dalam variabel titik-mengambang, sedangkan nilai-nilai dalam a NUMBER(15,0)dapat disimpan sebagai bilangan bulat. Anda mungkin juga merasa mudah untuk mengetahui sedikit keanehan seperti CHARkolom Oracle diisi dengan panjang yang ditentukan, sedangkan VARCHAR2kolom tidak. Dan LONGtipe data mereka sebenarnya menyimpan string panjang variabel, bukan angka.

Setiap database memiliki kebiasaan mereka, dan Anda harus tahu apa itu (atau setidaknya apa yang harus dicari).

TMN
sumber
1

Memahami cara kerja berbagai hal di bawah tenda akan membantu Anda men-debug pertanyaan Anda untuk pertimbangan kinerja & penyimpanan.

Misalnya, kueri rentang akan berkinerja lebih baik dengan tipe indeks B-tree. Dan saat melakukan penggabungan, Anda dapat menambahkan petunjuk ke mesin kueri tentang apakah akan menggunakan gabungan HASH atau MERGE. Dan di sisi fisik, Anda dapat mendistribusikan tabel dalam satu database ke partisi disk fisik yang berbeda untuk meminimalkan pertentangan kepala (mungkin masih cocok bahkan dengan SSD).

Bon Ami
sumber
0

Pertama, Anda harus jelas tentang apa itu SQL dan apa yang tidak. SQL adalah bahasa query dan bahasa manipulasi data yang digunakan untuk mengakses dan memanipulasi data dalam database relasional. Tetapi skema dan objek data (tabel, kolom, indeks, batasan) dalam database tidak "dalam SQL", SQL hanyalah salah satu bahasa yang mungkin untuk query dan memanipulasi data.

Agar dapat bekerja secara efektif dengan database relasional, Anda perlu memahami tabel, kolom, tipe data, kunci primer, kunci asing, dan indeks. Anda juga perlu memahami dasar-dasar kueri: proyeksi, filter, gabungan. Anda perlu memahami dasar-dasar normalisasi.

Tetapi tidak satu pun dari hal-hal ini pada prinsipnya mengharuskan Anda untuk menyentuh SQL. Anda mungkin bisa mendesain skema database dalam desainer GUI, dan Anda mungkin bisa menulis pertanyaan dan pembaruan dalam beberapa bahasa lain seperti SqlAlchemy untuk Python atau Linq untuk .net. Beberapa bahkan berpendapat bahwa bahasa-bahasa ini adalah representasi yang lebih murni dari model relasional daripada SQL.

Jadi secara teori teman Anda benar - Anda tidak perlu belajar SQL. Tetapi Anda masih perlu mempelajari cara kerja database relasional, dan ketika Anda tahu itu, SQL cukup mudah dipelajari, karena itu hanya beberapa sintaks.

Meskipun tidak perlu, cukup mudah untuk mengetahui SQL, karena Anda dapat meminta database apa pun secara langsung dalam SQL tanpa perlu lapisan terjemahan yang terpisah. Dan karena semua tutorial, buku, dan contoh menggunakan SQL, akan sulit untuk menghindari mempelajarinya.

JacquesB
sumber
-1

Saya mengalami masalah di mana nomor seri disimpan sebagai angka desimal 10-digit dalam database, dan membaca bilangan bulat 32-bit di Jawa. Ini baik-baik saja sampai kami mencapai nomor seri pertama kami yang lebih besar dari 2G, sehingga tidak dapat diwakili dalam integer bertanda 32-bit Java. Memahami tipe data DB mungkin telah mencegah masalah ini.

Eliot Topher
sumber