Apa yang harus diketahui setiap pengembang tentang basis data? [Tutup]

206

Apakah kita suka atau tidak, banyak atau tidak sebagian besar dari kita pengembang baik secara teratur bekerja dengan database atau mungkin harus bekerja dengan satu hari nanti. Dan mempertimbangkan jumlah penyalahgunaan dan penyalahgunaan di alam liar, dan volume pertanyaan terkait basis data yang muncul setiap hari, wajar untuk mengatakan bahwa ada konsep tertentu yang harus diketahui pengembang - bahkan jika mereka tidak merancang atau bekerja dengan basis data hari ini. Begitu:



Apa konsep penting yang harus diketahui oleh pengembang dan profesional perangkat lunak lain tentang basis data?


Pedoman untuk Tanggapan:


Buat daftar singkat.
Satu konsep per jawaban adalah yang terbaik.

Lebih spesifik .
"Pemodelan data" mungkin merupakan keterampilan yang penting , tetapi apa artinya tepatnya?

Jelaskan alasan Anda.
Mengapa konsep Anda penting? Jangan hanya mengatakan "gunakan indeks." Jangan jatuh ke dalam "praktik terbaik." Yakinkan audiens Anda untuk belajar lebih banyak.

Suara positif jawaban yang Anda setujui.
Baca dulu jawaban orang lain. Satu jawaban berperingkat tinggi adalah pernyataan yang lebih efektif daripada dua jawaban peringkat rendah. Jika Anda memiliki lebih banyak untuk ditambahkan, tambahkan komentar atau referensi yang asli.

Jangan downvote sesuatu hanya karena itu tidak berlaku untuk Anda secara pribadi.
Kita semua bekerja di domain yang berbeda. Tujuannya di sini adalah untuk memberikan arahan bagi para pemula basis data untuk mendapatkan pemahaman yang beralasan, pemahaman yang lengkap tentang desain basis data dan pengembangan yang digerakkan oleh basis data, bukan untuk bersaing memperebutkan gelar yang paling penting.

Aaronaught
sumber
15
Mengapa memilih untuk menutup ini ?? Ini adalah Wikia Komunitas dan karenanya sesuai.
David
5
Saya akan memilih untuk membuka kembali jika ditutup ... Saya juga ingin melihat daftar hal-hal yang seharusnya (tetapi tidak) DBA ketahui tentang OOP dan desain / aplikasi Perangkat Lunak Sistem ..
Charles Bretana
7
@ layanan: Kata "subyektif" dalam konteks itu mengacu pada pertanyaan yang sepenuhnya merupakan masalah pendapat. "Apa pendapatmu tentang buku Joe Celko?" - itu pertanyaan subyektif. Pertanyaan ini meminta informasi obyektif, kebetulan bahwa tidak ada jawaban "benar" tunggal. Saya pikir penting untuk mengambil langkah mundur dan bertanya, "apakah ini hanya olok-olok kosong, atau berguna untuk beberapa pengembang?" Lagi pula, dua sen saya - tidak seperti saya mendapatkan poin perwakilan untuk ini. :-)
Aaronaught
6
Secara pribadi, saya benci pertanyaan ini. Mereka hampir selalu berjumlah tumpukan pendapat pribadi, ringan pada informasi yang dapat digunakan dan berat pada deklarasi subjektif. Tetapi saya tidak mau menutupnya hanya karena alasan itu saja; itu bisa setengah jalan, Aaron, jika Anda menetapkan beberapa pedoman untuk respons: jawaban satu topik (apa yang harus Anda ketahui dan mengapa Anda harus mengetahuinya), tanpa duplikat, pilih suara yang Anda setujui ... dan sebagian besar penting, pindahkan opini Anda sendiri ke jawaban yang menunjukkan hal ini. Seperti berdiri, ini berbunyi seperti posting blog, atau diskusi forum, yang tidak memiliki bisnis di SO.
Shog9
4
Saya menemukan ini agak menarik: "Ini adalah Wiki Komunitas dan karenanya tepat." Bagaimana bisa seorang CW membuatnya pantas? Entah pertanyaan itu sesuai atau tidak, dan saya pikir pertanyaan ini adalah cara subjektif untuk membantu jika seseorang mencari jawaban. Mungkin menarik, tetapi itu bukan satu-satunya karakteristik yang harus dimiliki sebuah pertanyaan.
Georg Schölly

Jawaban:

106

Hal pertama yang harus diketahui pengembang tentang basis data adalah ini: untuk apa basis data ? Bukan bagaimana cara kerjanya, atau bagaimana Anda membangunnya, atau bahkan bagaimana Anda menulis kode untuk mengambil atau memperbarui data dalam database. Tapi untuk apa mereka?

Sayangnya, jawaban untuk yang ini adalah target yang bergerak. Dalam heydey of databases, tahun 1970-an hingga awal 1990-an, database adalah untuk berbagi data. Jika Anda menggunakan database, dan Anda tidak membagikan data, Anda terlibat dalam proyek akademik atau Anda menyia-nyiakan sumber daya, termasuk diri Anda sendiri. Menyiapkan database dan menjinakkan DBMS adalah tugas yang sangat monumental sehingga hasilnya, dalam hal data dieksploitasi beberapa kali, harus sangat besar untuk mencocokkan investasi.

Selama 15 tahun terakhir, basis data telah digunakan untuk menyimpan data persisten yang terkait dengan hanya satu aplikasi. Membangun database untuk MySQL , atau Access , atau SQL Server telah menjadi sangat rutin sehingga database hampir menjadi bagian rutin dari aplikasi biasa. Terkadang, misi terbatas awal itu didorong ke atas oleh creep misi, karena nilai nyata dari data menjadi jelas. Sayangnya, database yang dirancang dengan tujuan tunggal sering gagal secara dramatis ketika mereka mulai didorong ke peran yang luas dan misi perusahaan yang kritis.

Hal kedua yang perlu dipelajari pengembang tentang basis data adalah seluruh tampilan data sentris dunia. Tampilan dunia data sentris lebih berbeda dari proses pandangan dunia sentris daripada apa pun yang pernah dipelajari sebagian besar pengembang. Dibandingkan dengan kesenjangan ini, kesenjangan antara pemrograman terstruktur dan pemrograman berorientasi objek relatif kecil.

Hal ketiga yang perlu dipelajari pengembang, setidaknya dalam tinjauan umum, adalah pemodelan data, termasuk pemodelan data konseptual, pemodelan data logis, dan pemodelan data fisik.

Pemodelan data konseptual adalah benar-benar analisis kebutuhan dari sudut pandang data sentris.

Pemodelan data logis umumnya adalah penerapan model data spesifik untuk persyaratan yang ditemukan dalam pemodelan data konseptual. Model relasional digunakan jauh lebih banyak daripada model spesifik lainnya, dan pengembang perlu mempelajari model relasional dengan pasti. Merancang model relasional yang kuat dan relevan untuk kebutuhan nontrivial bukan tugas sepele. Anda tidak dapat membangun tabel SQL yang baik jika Anda salah memahami model relasional.

Pemodelan data fisik umumnya adalah DBMS spesifik, dan tidak perlu dipelajari secara mendetail, kecuali pengembangnya juga pembuat basis data atau DBA. Apa yang perlu dipahami pengembang adalah sejauh mana desain basis data fisik dapat dipisahkan dari desain basis data logis, dan sejauh mana pembuatan basis data kecepatan tinggi dapat dicapai hanya dengan mengutak-atik desain fisik.

Hal berikutnya yang perlu dipelajari pengembang adalah bahwa sementara kecepatan (kinerja) penting, ukuran lain dari kebaikan desain bahkan lebih penting , seperti kemampuan untuk merevisi dan memperluas cakupan basis data di jalan, atau kesederhanaan pemrograman.

Akhirnya, siapa pun yang mengacaukan basis data perlu memahami bahwa nilai data sering kali lebih lama dari sistem yang menangkapnya .

Wah!

Walter Mitty
sumber
Ditulis dengan sangat baik! Dan perspektif historisnya bagus untuk orang-orang yang tidak melakukan pekerjaan basis data pada waktu itu (yaitu saya).
Aaronaught
6
Ditulis dengan baik. Dan saya pikir poin terakhir Anda terlalu sering diabaikan oleh orang-orang yang mencoba 'menyelesaikannya'.
DaveE
1
Ada hubungan antara apa yang saya tulis dan topik seperti Jelaskan Rencana, Pengindeksan, dan Normalisasi Data. Saya ingin membahas hubungan itu secara lebih mendalam di semacam forum diskusi. SO bukan forum seperti itu.
Walter Mitty
1
Jika Anda menemukan membaca monster ini melintas, bayangkan bagaimana rasanya menulisnya! Saya tidak berangkat untuk menulis esai. Begitu saya mulai, sepertinya mengalir. Siapa pun yang menambahkan huruf tebal sangat membantu para pembaca, IMO.
Walter Mitty
3
@Walter Anda memberikan penjelasan untuk semua poin Anda kecuali untuk yang ini: "Hal kedua yang perlu dipelajari pengembang tentang database adalah seluruh tampilan data sentris dunia. Tampilan data centric world lebih berbeda dari proses centric world view daripada apa pun yang sebagian besar pengembang pernah pelajari. Dibandingkan dengan kesenjangan ini, kesenjangan antara pemrograman terstruktur dan pemrograman berorientasi objek relatif kecil. " Bisakah Anda menguraikan ini? Anda menyatakan bahwa kesenjangannya besar, tapi saya rasa saya ingin benar-benar memahami tampilan data-sentris dan bagaimana hal itu dipisahkan dari tampilan proses.
jedd.ahyoung
73

Pertanyaan bagus. Berikut ini adalah beberapa pemikiran tanpa urutan tertentu:

  1. Normalisasi, setidaknya untuk bentuk normal kedua, sangat penting.

  2. Integritas referensial juga penting, dengan menghapus cascading yang tepat dan memperbarui pertimbangan.

  3. Penggunaan kendala pemeriksaan yang baik dan tepat. Biarkan database melakukan pekerjaan sebanyak mungkin.

  4. Jangan sebarkan logika bisnis dalam database dan kode tingkat menengah. Pilih satu atau yang lain, lebih disukai di kode tingkat menengah.

  5. Putuskan pendekatan yang konsisten untuk kunci utama dan kunci yang dikelompokkan.

  6. Jangan over index. Pilih indeks Anda dengan bijak.

  7. Penamaan tabel dan kolom yang konsisten. Pilih standar dan patuhi itu.

  8. Batasi jumlah kolom dalam database yang akan menerima nilai nol.

  9. Jangan terbawa oleh pemicu. Mereka memiliki penggunaannya tetapi dapat mempersulit hal-hal dengan tergesa-gesa.

  10. Hati-hati dengan UDF. Mereka hebat tetapi dapat menyebabkan masalah kinerja ketika Anda tidak menyadari seberapa sering mereka dipanggil dalam permintaan.

  11. Dapatkan buku Celko tentang desain basis data. Pria itu sombong tetapi tahu barang-barangnya.

Randy Minder
sumber
1
peduli untuk menguraikan item 4. Ini topik yang selalu menggelitik saya.
Brad
9
@ David: Saya selalu lebih suka meletakkannya di kedua tempat. Dengan begitu Anda terlindungi dari bug dan juga kesalahan pengguna. Tidak ada alasan untuk membuat setiap kolom nullable, atau untuk memungkinkan nilai di luar rentang 1-12 untuk dimasukkan ke dalam Monthkolom. Aturan bisnis yang kompleks, tentu saja, adalah cerita lain.
Aaronaught
1
@Brad - Sebagian besar aplikasi kami di tempat kerja dilakukan dengan baik sebelum proses pemrograman yang solid dilakukan. Karenanya, kita punya logika bisnis yang tersebar di mana-mana. Beberapa di UI, beberapa di tingkat menengah dan beberapa di database. Ini berantakan. IMO, logika bisnis termasuk di tingkat menengah.
Randy Minder
2
@ David - Jika ini merupakan kepastian mutlak bahwa modifikasi database hanya akan terjadi pada aplikasi, maka Anda mungkin benar. Namun, ini mungkin sangat jarang. Karena pengguna kemungkinan akan memasukkan data secara langsung ke dalam basis data, itu praktik yang baik untuk menempatkan validasi dalam basis data juga. Selain itu, beberapa jenis validasi hanya dilakukan secara lebih efisien dalam database.
Randy Minder
1
Poin # 8 memang penting. Cara mendapatkan jenis kolom yang benar secara umum, adalah hal yang sangat penting untuk diketahui.
Chris Vest
22

Pertama, pengembang perlu memahami bahwa ada sesuatu yang perlu diketahui tentang database. Mereka bukan hanya perangkat ajaib tempat Anda meletakkan SQL dan keluar set hasil, tetapi potongan perangkat lunak yang sangat rumit dengan logika dan kebiasaan mereka sendiri.

Kedua, bahwa ada pengaturan basis data yang berbeda untuk tujuan yang berbeda. Anda tidak ingin pengembang membuat laporan historis dari basis data transaksional on-line jika ada data warehouse yang tersedia.

Ketiga, pengembang perlu memahami SQL dasar, termasuk gabungan.

Melewati ini, itu tergantung pada seberapa dekat pengembang terlibat. Saya telah bekerja di pekerjaan di mana saya adalah pengembang dan de facto DBA, di mana para DBA berada di ujung jalan, dan di mana para DBA berada di daerah mereka sendiri. (Saya tidak suka yang ketiga.) Dengan asumsi para pengembang terlibat dalam desain database:

Mereka perlu memahami normalisasi dasar, setidaknya tiga bentuk normal pertama. Lebih dari itu, dapatkan DBA. Bagi mereka yang memiliki pengalaman dengan ruang sidang AS (dan acara televisi acak dihitung di sini), ada mnemonik "Tergantung pada kunci, seluruh kunci, dan hanya kunci, jadi bantu Anda Codd."

Mereka perlu memiliki petunjuk tentang indeks, yang maksud saya mereka harus tahu indeks apa yang mereka butuhkan dan bagaimana mereka akan mempengaruhi kinerja. Ini berarti tidak memiliki indeks yang tidak berguna, tetapi tidak takut menambahkannya untuk membantu kueri. Apa pun lebih jauh (seperti saldo) harus dibiarkan untuk DBA.

Mereka perlu memahami kebutuhan akan integritas data, dan dapat menunjukkan ke mana mereka memverifikasi data dan apa yang mereka lakukan jika mereka menemukan masalah. Ini tidak harus ada dalam database (di mana akan sulit untuk mengeluarkan pesan kesalahan yang berarti bagi pengguna), tetapi harus ada di suatu tempat.

Mereka harus memiliki pengetahuan dasar tentang cara mendapatkan rencana, dan cara membacanya secara umum (setidaknya cukup untuk mengetahui apakah algoritma tersebut efisien atau tidak).

Mereka harus tahu secara samar apa pemicu itu, apa itu pandangan, dan bahwa mungkin untuk memecah-mecah basis data. Mereka tidak memerlukan detail apa pun, tetapi mereka perlu tahu untuk bertanya kepada DBA tentang hal-hal ini.

Mereka tentu saja harus tahu untuk tidak ikut campur dengan data produksi, atau kode produksi, atau semacamnya, dan mereka harus tahu bahwa semua kode sumber masuk ke dalam VCS.

Saya pasti lupa sesuatu, tetapi pengembang rata-rata tidak perlu menjadi DBA, asalkan ada DBA nyata di tangan.

David Thornley
sumber
19

Pengindeksan Dasar

Saya selalu terkejut melihat tabel atau seluruh database tanpa indeks, atau indeks arbitrer / tidak berguna. Sekalipun Anda tidak mendesain database dan hanya perlu menulis beberapa pertanyaan, masih sangat penting untuk dipahami, setidaknya:

  • Apa yang diindeks dalam database Anda dan apa yang tidak:
  • Perbedaan antara jenis pemindaian, bagaimana pemindaiannya, dan bagaimana cara Anda menulis kueri dapat memengaruhi pilihan itu;
  • Konsep liputan (mengapa Anda tidak hanya menulis SELECT *);
  • Perbedaan antara indeks berkerumun dan tidak berkerumun;
  • Mengapa indeks lebih / lebih besar belum tentu lebih baik;
  • Mengapa Anda harus mencoba menghindari membungkus kolom filter dalam fungsi.

Desainer juga harus mengetahui indeks umum anti-pola, misalnya:

  • Anti-pola Access (mengindeks setiap kolom, satu per satu)
  • Anti-pola Catch-All (satu indeks masif pada semua atau sebagian besar kolom, tampaknya dibuat di bawah kesan yang salah bahwa itu akan mempercepat setiap permintaan yang mungkin melibatkan setiap kolom itu).

Kualitas pengindeksan basis data - dan apakah Anda memanfaatkannya dengan kueri yang Anda tulis - sejauh ini merupakan bagian dari kinerja yang paling signifikan. 9 dari 10 pertanyaan yang diposting di SO dan forum lain mengeluh tentang kinerja yang buruk selalu berubah karena pengindeksan yang buruk atau ekspresi yang tidak mahal.

Aaronaught
sumber
Bisakah Anda menguraikan "cakupan"? Saya bisa melihat mengapa SELECT * bukan kebiasaan yang baik untuk masuk, tetapi saya tidak tahu arti dari "liputan" dan bertanya-tanya apakah itu menyinggung alasan lain untuk menghindari SELECT *.
Edmund
1
@ Edmund: Indeks mencakup kueri jika semua bidang output adalah bagian dari indeks (baik sebagai kolom yang diindeks atau INCLUDEkolom di SQL Server). Jika satu-satunya indeks yang tersedia untuk kueri yang diberikan adalah non-mencakup, maka semua baris harus diambil, satu per satu, yang merupakan operasi yang sangat lambat, dan sebagian besar waktu pengoptimal kueri akan memutuskan bahwa itu bukan tidak sia-sia dan melakukan pemindaian indeks / tabel penuh sebagai gantinya. Itu sebabnya Anda tidak menulis SELECT *- itu sebenarnya menjamin bahwa tidak ada indeks yang akan menutupi permintaan.
Aaronaught
Terima kasih! Meskipun sebagai pengguna PostgreSQL saya tidak perlu khawatir tentang hal-hal seperti itu (belum?): Indeks tidak mengandung informasi visibilitas sehingga tupel tabel selalu perlu dipindai juga. Secara umum, sepertinya faktor yang cukup penting.
Edmund
@ Edmund: PostgreSQL mungkin tidak memiliki INCLUDEkolom (saya tidak bisa mengatakan dengan pasti), tetapi itu tidak berarti Anda tidak dapat memasukkan kolom yang ingin Anda bahas dalam data indeks aktual. Itulah yang harus kami lakukan kembali dalam SQL Server 2000 hari. Cakupan masih penting, apa pun DBMS Anda.
Aaronaught
16

Normalisasi

Itu selalu membuat saya sedih melihat seseorang yang berjuang untuk menulis permintaan yang terlalu rumit yang akan sepenuhnya langsung dengan desain yang dinormalisasi ("Tunjukkan saya total penjualan per wilayah.").

Jika Anda memahami hal ini sejak awal dan merancang yang sesuai, Anda akan menghemat banyak rasa sakit nanti. Sangat mudah untuk mendenormalisasi kinerja setelah Anda menjadi normal; itu tidak mudah untuk menormalkan database yang tidak dirancang seperti itu sejak awal.

Paling tidak, Anda harus tahu apa itu 3NF dan bagaimana menuju ke sana. Dengan sebagian besar basis data transaksional, ini adalah keseimbangan yang sangat baik antara membuat kueri mudah ditulis dan mempertahankan kinerja yang baik.

Aaronaught
sumber
14

Bagaimana Indeks Bekerja

Ini mungkin bukan yang paling penting, tapi pasti topik yang paling diremehkan.

Masalah dengan pengindeksan adalah bahwa tutorial SQL biasanya tidak menyebutkannya sama sekali dan bahwa semua contoh mainan berfungsi tanpa indeks apa pun.

Bahkan pengembang yang lebih berpengalaman dapat menulis SQL yang cukup bagus (dan kompleks) tanpa mengetahui lebih banyak tentang indeks daripada " Suatu indeks membuat kueri cepat ".

Itu karena database SQL melakukan pekerjaan yang sangat baik sebagai kotak hitam:

Katakan padaku apa yang kamu butuhkan (beri SQL), aku akan membereskannya.

Dan itu bekerja dengan sempurna untuk mengambil hasil yang benar. Penulis SQL tidak perlu tahu apa yang dilakukan sistem di belakang layar - sampai semuanya menjadi sangaaaat slooooow .....

Saat itulah pengindeksan menjadi topik. Tapi itu biasanya sangat terlambat dan seseorang (beberapa perusahaan?) Sudah menderita masalah nyata.

Itu sebabnya saya percaya pengindeksan adalah topik No. 1 yang tidak boleh dilupakan ketika bekerja dengan basis data . Sayangnya, sangat mudah untuk melupakannya.

Penolakan

Argumen dipinjam dari kata pengantar eBook gratis saya " Use The Index, Luke ". Saya menghabiskan banyak waktu untuk menjelaskan bagaimana indeks bekerja dan bagaimana menggunakannya dengan benar.

Markus Winand
sumber
12

Saya hanya ingin menunjukkan sebuah pengamatan - yaitu sepertinya mayoritas respon menganggap database dapat dipertukarkan dengan basis data relasional. Ada juga database objek, database file datar. Penting untuk menilai kebutuhan proyek perangkat lunak yang ada. Dari perspektif programmer keputusan database dapat ditunda sampai nanti. Pemodelan data di sisi lain dapat dicapai sejak dini dan membawa banyak kesuksesan.

Saya pikir pemodelan data adalah komponen kunci dan merupakan konsep yang relatif lama namun merupakan salah satu yang telah dilupakan oleh banyak orang di industri perangkat lunak. Pemodelan data, terutama pemodelan konseptual, dapat mengungkapkan perilaku fungsional suatu sistem dan dapat diandalkan sebagai peta jalan untuk pengembangan.

Di sisi lain, jenis database yang dibutuhkan dapat ditentukan berdasarkan banyak faktor yang berbeda untuk memasukkan lingkungan, volume pengguna, dan perangkat keras lokal yang tersedia seperti ruang harddisk.

FernandoZ
sumber
Maksud Anda seperti melakukan diagram entitas-hubungan?
crosenblum
Ya ... apakah saya lupa menyebutkan ERD? :-)
FernandoZ
+1 ... Tetapi Anda harus menyadari bahwa Anda berada di SO: rumah tukang ledeng menghabiskan hari-hari mereka memperbaiki ketidakcocokan ORM impedansi sehingga semua yang mereka tahu, makan dan pikirkan bukan hanya berhubungan tetapi juga "SQL" :)
SyntaxT3rr0r
11

Menghindari injeksi SQL dan cara mengamankan basis data Anda

iChaib
sumber
9

Setiap pengembang harus tahu bahwa ini salah: "Membuat profil operasi basis data sama sekali berbeda dengan kode profil."

Ada Big-O yang jelas dalam pengertian tradisional. Ketika Anda melakukan EXPLAIN PLAN(atau yang setara) Anda melihat algoritma. Beberapa algoritma melibatkan loop bersarang dan O ( n ^ 2). Algoritma lain melibatkan pencarian B-tree dan O ( n log n ).

Ini sangat, sangat serius. Sangat penting untuk memahami mengapa indeks penting. Ini penting untuk memahami pengorbanan kecepatan normalisasi-normalisasi. Sangat penting untuk memahami mengapa gudang data menggunakan skema bintang yang tidak dinormalisasi untuk pembaruan transaksional.

Jika Anda tidak jelas tentang algoritma yang digunakan lakukan hal berikut. Berhenti. Jelaskan rencana Eksekusi Kueri. Sesuaikan indeks sesuai.

Juga, akibatnya: Indeks Lebih Banyak Tidak Lebih Baik.

Terkadang indeks yang difokuskan pada satu operasi akan memperlambat operasi lainnya. Bergantung pada rasio dari dua operasi, menambahkan indeks mungkin memiliki efek yang baik, tidak ada dampak keseluruhan, atau merusak kinerja keseluruhan.

S.Lott
sumber
Saya memiliki perasaan yang akan diambil dengan cara yang salah. Yang saya maksud dengan "tradisional" adalah bahwa Anda tidak benar-benar memiliki kendali atas algoritma, hanya kemampuan untuk mempengaruhi yang digunakan. Lagi pula, saya menghapus bahasa itu karena saya tidak ingin sesuatu yang terlalu kontroversial di pos utama.
Aaronaught
@Aaron: Anda tidak memiliki kendali atas algoritma. Itulah gunanya indeks.
S.Lott
Hmm, jadi Anda bisa mengubah jenis algoritma penyortiran yang digunakan oleh DE? Struktur data apa yang digunakan untuk indeks? Saya lebih suka untuk tidak berdebat tentang hal ini, itu sebabnya saya mengeluarkannya, tapi saya berdiri dengan ide dasar bahwa Anda memiliki kontrol jauh lebih sedikit ketika bekerja dengan database dibandingkan dengan kode.
Aaronaught
@ Harun: Kontrol kurang tidak menghapus kewajiban untuk benar-benar memahami jika permintaan adalah * O ** (* n ^ 2) atau * O ** (* n log n ) atau hanya ** O ** (n). Kurang kontrol tidak menghilangkan kewajiban untuk benar-benar memahami apa yang terjadi dan untuk mengetahui bagaimana mengendalikannya.
S.Lott
@ S.Lott: Saya pikir kita berada di sisi yang sama di sini, karena saya menyarankan beban profiling yang lebih besar untuk database - "Anda perlu tahu ... [bagaimana] membaca rencana permintaan". Tetapi hasil edit saya tampaknya telah dibatalkan, jadi ... Saya kira itu milik komunitas sekarang.
Aaronaught
8

Saya pikir setiap pengembang harus memahami bahwa database memerlukan paradigma yang berbeda .

Saat menulis kueri untuk mendapatkan data Anda, pendekatan berbasis set diperlukan. Banyak orang dengan latar belakang interatif berjuang dengan ini. Namun, ketika mereka merangkulnya, mereka dapat mencapai hasil yang jauh lebih baik, meskipun solusinya mungkin bukan yang pertama kali muncul dengan sendirinya dalam pikiran mereka yang berfokus pada iteratif.

Rob Farley
sumber
Tolong jelaskan apa yang dimaksud dengan pendekatan "set-based"
Vivian River
1
Bahwa Anda harus melihat data sebagai set, dan mempertimbangkan masalah Anda sebagai berpotensi diselesaikan dengan set aritmatika - yang melibatkan fungsi peringkat di mana diperlukan, subkueri, agregat, dan sebagainya. Banyak pengembang berpikir tentang apa yang perlu dilakukan untuk setiap baris, yang merupakan pemikiran berulang.
Rob Farley
8

Pertanyaan yang sangat bagus Mari kita lihat, pertama tidak ada yang harus mempertimbangkan meminta basis data yang tidak sepenuhnya memahami bergabung. Itu seperti mengendarai mobil tanpa mengetahui di mana setir dan rem. Anda juga perlu tahu tipe data dan bagaimana memilih yang terbaik.

Hal lain yang harus dipahami oleh pengembang adalah bahwa ada tiga hal yang harus Anda pikirkan ketika mendesain database:

  1. Integritas data - jika data tidak dapat diandalkan pada dasarnya Anda tidak memiliki data - ini berarti jangan masukkan logika yang diperlukan dalam aplikasi karena banyak sumber lain dapat menyentuh database. Kendala, kunci asing dan terkadang pemicu diperlukan untuk integritas data. Jangan gagal menggunakannya karena Anda tidak menyukainya atau tidak mau repot untuk memahaminya.

  2. Kinerja - sangat sulit untuk memperbaiki database yang berkinerja buruk dan kinerja harus dipertimbangkan sejak awal. Ada banyak cara untuk melakukan kueri yang sama dan beberapa diketahui lebih cepat hampir selalu, sangat picik untuk tidak belajar dan menggunakan cara-cara ini. Baca beberapa buku tentang penyesuaian kinerja sebelum merancang kueri atau struktur basis data.

  3. Keamanan - data ini adalah darah kehidupan perusahaan Anda, juga sering berisi informasi pribadi yang dapat dicuri. Belajarlah untuk melindungi data Anda dari serangan injeksi SQL dan penipuan serta pencurian identitas.

Saat meminta basis data, mudah untuk mendapatkan jawaban yang salah. Pastikan Anda memahami model data Anda secara menyeluruh. Ingat sering kali keputusan aktual dibuat berdasarkan data yang dikembalikan oleh kueri Anda. Ketika itu salah, keputusan bisnis yang salah dibuat. Anda dapat membunuh perusahaan dari pertanyaan buruk atau kehilangan pelanggan besar. Data memiliki makna, pengembang sering kelihatannya lupa akan hal itu.

Data hampir tidak pernah hilang, pikirkan dalam hal menyimpan data dari waktu ke waktu alih-alih hanya bagaimana mendapatkannya hari ini. Basis data yang berfungsi dengan baik ketika memiliki seratus ribu catatan, mungkin tidak begitu baik dalam sepuluh tahun. Aplikasi jarang bertahan selama data. Ini adalah salah satu alasan mengapa mendesain kinerja sangat penting.

Basis data Anda mungkin membutuhkan bidang yang tidak perlu dilihat oleh aplikasi. Hal-hal seperti GUID untuk replikasi, bidang tanggal dimasukkan. dll. Anda juga mungkin perlu menyimpan riwayat perubahan dan siapa yang membuatnya kapan dan dapat mengembalikan perubahan buruk dari gudang ini. Pikirkan tentang bagaimana Anda ingin melakukan ini sebelum Anda datang, tanyakan situs web bagaimana memperbaiki masalah di mana Anda lupa meletakkan klausa mana pada pembaruan dan memperbarui seluruh tabel.

Jangan pernah mengembangkan dalam versi database yang lebih baru daripada versi produksi. Tidak pernah, tidak pernah, tidak pernah berkembang secara langsung terhadap basis data produksi.

Jika Anda tidak memiliki administrator basis data, pastikan seseorang membuat cadangan dan tahu cara memulihkannya dan telah menguji memulihkannya.

Kode basis data adalah kode, tidak ada alasan untuk tidak menyimpannya dalam kontrol sumber sama seperti kode lainnya.

HLGEM
sumber
6

Desain Basis Data Evolusi. http://martinfowler.com/articles/evodb.html

Metodologi tangkas ini membuat proses perubahan basis data dapat dikelola, diprediksi, dan dapat diuji.

Pengembang harus tahu, apa yang diperlukan untuk membuat ulang basis data produksi dalam hal kontrol versi, integrasi berkelanjutan dan pengujian otomatis.

Proses Perancangan Basis Data Evolusi memiliki aspek administratif, misalnya sebuah kolom harus dijatuhkan setelah beberapa periode waktu seumur hidup di semua basis data dari basis kode ini.

Setidaknya tahu, bahwa konsep dan metodologi Database Refactoring ada. http://www.agiledata.org/essays/databaseRefactoringCatalog.html

Klasifikasi dan deskripsi proses memungkinkan untuk mengimplementasikan tooling untuk refactoring ini juga.

George Polevoy
sumber
Saya suka konsep refactoring, tetapi mengenai DB masalah besar sebenarnya dengan itu adalah data yang persisten. refactoring DB sering melibatkan migrasi data yang pada kenyataannya sulit, terutama jika Anda tidak diperbolehkan downtime sistem. juga kembalikan tidak sepele. dalam pandangan saya kesulitan dalam rollout yang tepat / aman + strategi rollback sering kali menjadi penghambat untuk mereformasi DB ringan seperti kode aplikasi. itu sendiri sering masuk akal untuk memperbaiki barang tetapi Anda selalu harus lebih besar daripada biaya / manfaat.
manuel aldana
Lihat juga 'Refactoring Databases' Ambler ( amazon.com/Refactoring-Databases-Evolutionary-Database-Design/… ).
Jonathan Leffler
5

Dari pengalaman saya dengan basis data relasional, setiap pengembang harus tahu:

- Berbagai tipe data :

Menggunakan jenis yang tepat untuk pekerjaan yang benar akan membuat desain DB Anda lebih kuat, pertanyaan Anda lebih cepat dan hidup Anda lebih mudah.

- Pelajari tentang 1xM dan MxM :

Ini adalah roti dan mentega untuk basis data relasional. Anda perlu memahami hubungan satu-ke-banyak dan banyak-ke-banyak dan menerapkannya saat yang tepat.

- Prinsip " KISS " juga berlaku untuk DB :

Kesederhanaan selalu bekerja paling baik. Asalkan Anda telah mempelajari cara kerja DB, Anda akan menghindari kompleksitas yang tidak perlu yang akan menyebabkan masalah pemeliharaan dan kecepatan.

- Indeks :

Itu tidak cukup jika Anda tahu apa itu. Anda perlu memahami kapan menggunakannya dan kapan tidak.


juga:

  • Aljabar Boolean adalah teman Anda
  • Gambar: Jangan menyimpannya di DB. Jangan tanya kenapa.
  • Tes HAPUS dengan SELECT
Anax
sumber
+1 untuk Gambar. Saya akan mengganti 'Gambar' dengan 'BLOB'.
Agnel Kurian
Saya tidak begitu yakin tentang bagian "kesederhanaan". Basis data yang paling sederhana adalah satu meja raksasa dengan banyak varchar(max)kolom. Database relasional harus dinormalisasi , bukan disederhanakan .
Aaronaught
Kekhawatiran Anda dibahas sebelumnya, di bagian "tipe data" dari posting saya. Saya mengacu pada (tidak perlu) penggunaan prosedur / pemicu / kursor tersimpan dan sebagainya.
Anax
5

Saya ingin semua orang, baik DBA dan pengembang / desainer / arsitek, untuk lebih memahami cara memodelkan domain bisnis dengan benar, dan bagaimana memetakan / menerjemahkan model domain bisnis itu menjadi model logis basis data yang dinormalisasi, model fisik yang dioptimalkan, dan model kelas berorientasi objek yang tepat, yang masing-masing (dapat) berbeda, untuk berbagai alasan, dan memahami kapan, mengapa, dan bagaimana mereka (atau harus) berbeda satu sama lain.

Charles Bretana
sumber
5

Saya akan mengatakan keterampilan SQL dasar yang kuat. Saya telah melihat banyak pengembang sejauh ini yang tahu sedikit tentang database tetapi selalu meminta tips tentang cara merumuskan permintaan yang cukup sederhana. Pertanyaan tidak selalu semudah dan sesederhana itu. Anda harus menggunakan banyak gabungan (dalam, kiri, dll.) Saat menanyakan database yang dinormalisasi dengan baik.

MaxiWheat
sumber
5

Tentang komentar berikut untuk jawaban Walter M.:

"Ditulis dengan sangat baik! Dan perspektif historisnya bagus untuk orang-orang yang tidak melakukan pekerjaan basis data pada waktu itu (yaitu saya)".

Perspektif historis dalam arti tertentu sangat penting. "Mereka yang melupakan sejarah, ditakdirkan untuk mengulanginya." Cfr XML mengulangi kesalahan hierarkis di masa lalu, basis data grafik mengulangi kesalahan jaringan di masa lalu, sistem OO yang memaksakan model hierarkis pada pengguna sementara semua orang dengan hanya sepersepuluh otak harus tahu bahwa model hierarkis tidak cocok untuk umum- representasi tujuan dari dunia nyata, dan sebagainya, dan sebagainya.

Adapun pertanyaan itu sendiri:

Setiap pengembang database harus tahu bahwa "Relational" tidak sama dengan "SQL". Kemudian mereka akan mengerti mengapa mereka dikecewakan begitu parah oleh vendor DBMS, dan mengapa mereka harus memberitahu vendor yang sama untuk menghasilkan hal-hal yang lebih baik (misalnya DBMS yang benar-benar berhubungan) jika mereka ingin terus mengisap jumlah lucu dari uang dari pelanggan mereka untuk perangkat lunak jelek seperti itu).

Dan setiap pengembang database harus tahu segalanya tentang aljabar relasional. Maka tidak akan ada lagi pengembang tunggal yang harus memposting pertanyaan bodoh "Saya tidak tahu bagaimana melakukan pekerjaan saya dan ingin orang lain melakukannya untuk saya" di Stack Overflow lagi.

Erwin Smout
sumber
1
Saya setuju bahwa pengembang perlu tahu di mana SQL dan RDM berbeda. Karena itu, penggunaan RDM secara bijaksana dapat menjadi pembantu yang tak ternilai bagi perancang basis data, bahkan jika implementasinya adalah SQL.
Walter Mitty
1
Jika Anda lupa, George Santayana, menulis kutipan klasik ...
crosenblum
5

Saya pikir banyak detail teknis telah dibahas di sini dan saya tidak ingin menambahkannya. Satu hal yang ingin saya katakan adalah lebih sosial daripada teknis, jangan jatuh ke perangkap "DBA mengetahui yang terbaik" sebagai pengembang aplikasi.

Jika Anda mengalami masalah kinerja dengan kueri, ikutilah kepemilikan masalahnya. Lakukan riset Anda sendiri dan dorong agar DBA untuk menjelaskan apa yang terjadi dan bagaimana solusi mereka mengatasi masalah tersebut.

Munculkan saran Anda sendiri juga setelah Anda melakukan penelitian. Artinya, saya mencoba mencari solusi kooperatif untuk masalah daripada meninggalkan masalah database ke DBA.

HeretoLearn
sumber
jawaban yang bagus. Kita masing-masing memiliki bidang kita sendiri, kita berkontribusi pada setiap masalah atau solusi.
crosenblum
5

Rasa hormat yang sederhana.

  • Ini bukan hanya repositori
  • Anda mungkin tidak tahu lebih baik dari vendor atau DBA
  • Anda tidak akan mendukungnya jam 3 pagi dengan manajer senior meneriaki Anda
gbn
sumber
3

Pertimbangkan Denormalisasi sebagai malaikat yang mungkin, bukan iblis, dan juga pertimbangkan database NoSQL sebagai alternatif untuk database relasional.

Juga, saya pikir model Entity-Relation adalah harus-tahu untuk setiap pengembang bahkan jika Anda tidak mendesain database. Ini akan membuat Anda mengerti sepenuhnya tentang semua database Anda.

iChaib
sumber
3

Jangan pernah memasukkan data dengan penyandian teks yang salah.

Setelah database Anda menjadi tercemar dengan banyak pengkodean, yang terbaik yang dapat Anda lakukan adalah menerapkan semacam kombinasi heuristik dan tenaga kerja manual.

mikerobi
sumber
2
Apa itu "penyandian teks yang salah" dan bagaimana hal itu terjadi?
Gennady Vanin Геннадий Ванин
1
@ vgv8, ini terjadi ketika klien Anda mengizinkan pengguna untuk mengirim teks dalam pengkodean apa pun yang Anda inginkan, Anda menyimpannya secara membabi buta. Kemudian, ketika Anda perlu melakukan semacam transformasi atau analisis, kode Anda rusak, karena aplikasi Anda mengasumsikan utf-8, tetapi beberapa orang bodoh menambahkan data utf-16, dan kesalahan program Anda atau mulai memuntahkan omong kosong.
mikerobi
3

Selain sintaks dan opsi konseptual yang mereka gunakan (seperti bergabung, memicu, dan prosedur tersimpan), satu hal yang akan sangat penting untuk setiap pengembang yang menggunakan database adalah ini:

Ketahui bagaimana mesin Anda akan melakukan kueri yang Anda tulis dengan spesifik.

Alasan saya pikir ini sangat penting hanyalah stabilitas produksi. Anda harus tahu bagaimana kinerja kode Anda sehingga Anda tidak menghentikan semua eksekusi di utas Anda sambil menunggu fungsi panjang selesai, jadi mengapa Anda tidak ingin tahu bagaimana kueri Anda akan mempengaruhi database, program Anda, dan mungkin bahkan server?

Ini sebenarnya adalah sesuatu yang telah memukul tim R&D saya lebih banyak daripada kehilangan titik koma atau sejenisnya. Anggapannya adalah permintaan akan mengeksekusi dengan cepat karena tidak pada sistem pengembangan mereka dengan hanya beberapa ribu baris dalam tabel. Bahkan jika database produksi memiliki ukuran yang sama, itu lebih dari kemungkinan akan digunakan lebih banyak, dan karenanya menderita kendala lain seperti beberapa pengguna mengaksesnya pada saat yang sama, atau ada yang salah dengan kueri lain di tempat lain, sehingga menunda hasil dari permintaan ini.

Bahkan hal-hal sederhana seperti bagaimana bergabung mempengaruhi kinerja kueri sangat berharga dalam produksi. Ada banyak fitur dari banyak mesin database yang membuat segalanya lebih mudah secara konsep, tetapi dapat memperkenalkan gotcha dalam kinerja jika tidak dipikirkan dengan jelas.

Ketahui proses eksekusi mesin database Anda dan rencanakan untuk itu.

TodPunk
sumber
3

Untuk pengembang profesional menengah yang banyak menggunakan basis data (menulis / memelihara kueri setiap hari atau hampir setiap hari), saya pikir harapannya harus sama dengan bidang lainnya: Anda menulis satu di perguruan tinggi .

Setiap C ++ geek menulis kelas string di perguruan tinggi. Setiap geek grafis menulis raytracer di perguruan tinggi. Setiap geek web menulis situs web interaktif (biasanya sebelum kami memiliki "kerangka kerja web") di perguruan tinggi. Setiap kutu buku perangkat keras (dan bahkan kutu buku perangkat lunak) membangun CPU di perguruan tinggi. Setiap dokter membedah seluruh mayat di perguruan tinggi, bahkan jika dia hanya akan mengambil tekanan darah saya dan mengatakan bahwa kolesterol saya terlalu tinggi hari ini. Mengapa basis data berbeda?

Sayangnya, mereka tampak berbeda, hari ini, untuk beberapa alasan. Orang-orang ingin .NET programmer mengetahui cara kerja string di C , tetapi internal RDBMS Anda seharusnya tidak terlalu mengkhawatirkan Anda .

Ini hampir mustahil untuk mendapatkan tingkat pemahaman yang sama hanya dengan membaca tentang mereka, atau bahkan bekerja dengan cara Anda turun dari atas. Tetapi jika Anda mulai dari bagian bawah dan memahami setiap bagian, maka relatif mudah untuk mencari tahu spesifik untuk basis data Anda. Bahkan hal-hal yang tidak bisa dilakukan oleh banyak geek basis data, seperti kapan menggunakan basis data non-relasional.

Mungkin itu agak ketat, terutama jika Anda tidak belajar ilmu komputer di perguruan tinggi. Saya akan nada beberapa: Anda bisa menulis hari ini , sepenuhnya, dari awal. Saya tidak peduli jika Anda mengetahui secara spesifik cara kerja pengoptimal kueri PostgreSQL, tetapi jika Anda cukup tahu untuk menulis sendiri, mungkin tidak akan terlalu berbeda dari apa yang mereka lakukan. Dan Anda tahu, menulis yang dasar itu benar-benar tidak sulit.

Ken
sumber
Dari artikel Joel yang ditautkan tentang string C, bukan cuplikan petunjuk berikut untuk perilaku yang tidak terdefinisi: char * str = "* Hello!"; str [0] = strlen (str) - 1; str adalah string literal dan umum dalam memori hanya baca. Anda tidak dapat menulis kepadanya :?
HeretoPelajari
Pakar basis data profesional, baik, tetapi setiap pengembang ?
Ben Aston
Ben: Setiap pengembang profesional yang sering menggunakan basis data, ya. Mereka benar-benar tidak sulit, jadi jika Anda tidak tahu caranya, itu berarti Anda tidak pernah mengambil sedikit waktu untuk belajar bagaimana DB bekerja. Setiap jurusan ilmu komputer saya lulus dengan merancang CPU dan mengimplementasikan OS. Database lebih sederhana daripada salah satu dari ini, jadi jika Anda menghabiskan waktu menggunakan satu, saya tidak melihat alasan untuk tidak tahu tentang cara kerjanya.
Ken
2

Urutan kolom dalam indeks non-unik adalah penting.

Kolom pertama haruslah kolom yang memiliki variabilitas paling banyak dalam isinya (yaitu kardinalitas).

Ini untuk membantu kemampuan SQL Server untuk membuat statistik yang berguna dalam cara menggunakan indeks saat runtime.

Mike D
sumber
-1 Saya bukan ide yang baik untuk mengikuti aturan seperti 'Kolom pertama harus menjadi kolom yang memiliki variabilitas paling banyak dalam isinya'. Jika seseorang memiliki pengetahuan dasar tentang bagaimana indeks bekerja itu sederhana melihat bagaimana urutan itu penting dan bahwa urutan kolom harus tergantung pada cara tabel akan ditanyai.
miracle173
terima kasih, tetapi jika indeks dibuat pada 3 bidang, atas dasar bahwa kueri sql tertentu akan menggunakan 3 bidang tersebut di mana klausa, maka, urutannya bisa signifikan, dan bidang dengan kardinalitas tertinggi muncul pertama \ sebelumnya dapat mengarah ke peningkatan kinerja .... atau setidaknya itulah yang saya baca di buku tuning kinerja Microsoft SQL Server. Saya mencobanya dan ternyata berhasil lebih baik (tahun lalu).
Mike D
2

Pahami alat yang Anda gunakan untuk memprogram basis data !!!

Saya menghabiskan banyak waktu untuk memahami mengapa kode saya gagal secara misterius.

Jika Anda menggunakan .NET, misalnya, Anda perlu tahu cara menggunakan objek di System.Data.SqlClientnamespace dengan benar. Anda perlu tahu cara mengelola SqlConnectionobjek Anda untuk memastikan mereka dibuka, ditutup, dan bila perlu, dibuang dengan benar.

Anda perlu tahu bahwa ketika Anda menggunakan SqlDataReader, perlu untuk menutupnya secara terpisah dari Anda SqlConnection. Anda perlu memahami cara menjaga koneksi tetap terbuka saat yang tepat untuk cara meminimalkan jumlah hit ke database (karena mereka relatif mahal dalam hal waktu komputasi).

Daniel Allen Langdon
sumber
2
  • Keahlian SQL dasar.
  • Pengindeksan.
  • Menangani berbagai inkarnasi DATE / TIME / TIMESTAMP.
  • Dokumentasi driver JDBC untuk platform yang Anda gunakan.
  • Menangani tipe data biner ( CLOB , BLOB , dll.)
JuanZe
sumber
1

Untuk beberapa proyek, dan model Object-Oriented lebih baik.

Untuk proyek lain, model Relasional lebih baik.

Mark Lutton
sumber
1

Masalah ketidakcocokan impedansi, dan tahu kekurangan umum atau ORM.

Muhammad Soliman
sumber
1

Kompatibilitas RDBMS

Lihat apakah diperlukan untuk menjalankan aplikasi di lebih dari satu RDBMS. Jika ya, mungkin perlu:

  • hindari ekstensi RDBMS SQL
  • menghilangkan pemicu dan prosedur penyimpanan
  • ikuti standar SQL yang ketat
  • mengonversi tipe data bidang
  • mengubah tingkat isolasi transaksi

Kalau tidak, pertanyaan-pertanyaan ini harus ditangani secara terpisah dan versi (atau konfigurasi) aplikasi yang berbeda akan dikembangkan.

Juliano
sumber
1

Jangan bergantung pada urutan baris yang dikembalikan oleh kueri SQL.

Agnel Kurian
sumber
3
... kecuali ada ORDER BYklausul di dalamnya?
Aaronaught
Dan jangan gunakan yang ORDER BYtidak perlu karena menambah beban ke server SQL
Vivian River