Saya terutama seorang pengembang web dan saya memiliki beberapa proyek pribadi yang ingin saya mulai.
Satu hal yang menggangguku adalah desain basis data. Saya telah melalui normalisasi db sekolah dan hal-hal seperti itu tetapi sudah beberapa tahun yang lalu dan saya tidak pernah memiliki pengalaman dengan desain basis data relasional kecuali untuk sekolah.
Jadi, bagaimana Anda mendekati database dari perspektif aplikasi web? Bagaimana Anda memulai dan apa yang Anda perhatikan? Apa bendera untuk hati-hati?
Jawaban:
Buku terbaik yang pernah saya beli mengenai desain basis data adalah Desain Basis Data untuk Mere Mortals oleh Michael Hernandez ISBN: 0-201-69471-9. Daftar Amazon Saya perhatikan dia memiliki edisi ketiga.
Tautan ke edisi ketiga
Dia menuntun Anda melalui seluruh proses (dari awal hingga selesai) merancang database. Saya sarankan Anda mulai dengan buku ini.
Anda harus belajar melihat hal-hal dalam kelompok atau potongan. Desain basis data memiliki blok bangunan sederhana seperti halnya pemrograman. Jika Anda mendapatkan pemahaman menyeluruh tentang blok bangunan sederhana ini, Anda dapat menangani desain database apa pun.
Dalam pemrograman Anda memiliki:
Dengan database yang Anda miliki:
Semakin sederhana Anda membuat segalanya menjadi lebih baik. Basis data tidak lebih dari tempat Anda memasukkan data ke dalam lubang cubbie. Mulailah dengan mengidentifikasi apa lubang kubus ini dan hal-hal seperti apa yang Anda inginkan di dalamnya.
Anda tidak akan pernah membuat desain database yang sempurna saat pertama kali Anda mencoba. Ini fakta. Desain Anda akan melalui beberapa penyempurnaan selama proses. Kadang-kadang hal-hal tidak akan tampak jelas sampai Anda mulai memasukkan data, dan kemudian Anda memiliki momen ah ha .
Web membawa tantangan tersendiri. Masalah bandwidth. Kewarganegaraan. Data yang salah dari proses yang dimulai tetapi tidak pernah selesai.
sumber
Saya melakukan pemrograman berorientasi objek dan (kebanyakan transaksional, tetapi beberapa OLAP) desain database, dan untuk keadaan saya, ada banyak tema berulang (setidaknya dengan OLTP).
Berlatih normalisasi 3nf membantu saya untuk berlatih beberapa varian dari prinsip tanggung jawab tunggal. Tabel harus mewakili konsep dalam sistem Anda - dan konsep harus berhubungan satu sama lain sehingga mereka mencoba meniru kenyataan; misalnya, jika saya sedang membangun sistem di mana Pelanggan dapat memiliki 0 atau banyak Kegiatan, maka saya membuat Tabel Pelanggan, dan Tabel Aktivitas. Tabel aktivitas memiliki hubungan kunci asing dengan tabel Pelanggan. Ketika saya sedang membangun prosedur tersimpan, saya akan memastikan untuk menggunakan gabungan luar untuk bergabung dengan Pelanggan dan aktivitas karena persyaratan bisnis bahwa Pelanggan dapat memiliki 0 aktivitas.
Saya juga mewaspadai peluang untuk ekstensibilitas dengan menggunakan tabel jembatan (tautan). Misalnya, jika saya mencoba untuk mewakili aturan bisnis di mana sebuah buku dapat memiliki jumlah penulis (variabel) yang tidak terbatas, saya akan membuat Tabel Buku, tabel Penulis, dan tabel jembatan / tautan yang memiliki referensi kunci asing untuk keduanya Buku dan Penulis.
Juga, saya menggunakan kunci pengganti pada semua tabel (biasanya kolom identitas yang bertambah secara otomatis, tapi mungkin Guids - tradeoff dengan guids dalam kode adalah bahwa mereka mengambil lebih banyak ruang memori daripada integer sederhana), dan saya menghindari mengandalkan kunci alami untuk saya pencarian (kecuali dengan Tabel Bridge / Link). Secara default, saya juga membuat indeks pada kolom kunci asing yang umum, dan meninjau prosedur yang tersimpan / permintaan sistem dari waktu ke waktu untuk mengoptimalkan strategi pengindeksan. Strategi pengindeksan lain yang saya gunakan adalah mencari tempat dalam kode saya di mana saya membangun koleksi berdasarkan kolom pencarian, dan menambahkan indeks yang sesuai ke kolom pencarian.
sumber
Saya merancang skema database saya terlebih dahulu, kemudian menggunakan ORM untuk membuat objek dari itu. Saya agak tua di sekolah; Saya tidak percaya ORM untuk membuat skema database cerdas, efisien. Itu adalah karya manusia, dan bagian dari kerajinan desain perangkat lunak.
sumber
Saya menemukan buku Bill Karwin, SQL Antipatterns , sangat berguna untuk perencanaan basis data. Poin yang membuatnya paling komprehensif adalah bahwa database menawarkan banyak peluang untuk melindungi integritas dan kebermaknaan data Anda, dan bahwa merupakan kesalahan umum para desainer untuk mengabaikan fitur-fitur ini karena berbagai alasan yang menggoda. Mempertimbangkan masalah-masalah ini sejak awal dan membiarkan mereka memberi tahu seluruh desain adalah bermanfaat dan mengalahkan mencoba mengatasi keretakan nanti.
Saya lebih suka menggunakan database yang memiliki kendala komprehensif untuk menegakkan logika bisnis dan integritas di tingkat database. Seringkali saya melihat database sebagai aplikasi dan apa pun yang mengaksesnya sebagai antarmuka belaka. Hal ini membuat penambahan "antarmuka" lainnya menjadi pengalaman yang lebih menyenangkan dan langsung, dan memiliki manfaat positif untuk keamanan.
Saya juga berpikir penting untuk mempertimbangkan struktur basis data sebagai entitas yang berubah, daripada mengasumsikan Anda perlu membungkusnya dan menyegelnya sebelum memulai yang lain. Anda harus merencanakan perubahan dan mengakomodasi DB di sistem versi Anda. Ada esai yang bagus tentang ini: Desain Basis Data Evolusi oleh Martin Fowler & Pramod Sadalage (dan juga seluruh buku tentang subjek oleh Sadalage, meskipun saya belum membaca ini).
Terakhir, masalah perangkat akun / peran, perangkat keras / lokasi / koneksi host, dll. Adalah penting dan kadang-kadang diabaikan. Ingatlah ini juga saat merencanakan.
sumber
desain basis data tidak dapat dilakukan sepenuhnya tanpa mempertimbangkan bagaimana data akan digunakan, jadi inilah daftar langkah-langkahnya:
sumber
Agar berhasil merancang database, Anda perlu mempertimbangkan beberapa hal terlebih dahulu:
Jadi sebelum Anda mulai merancang basis data, Anda harus terlebih dahulu belajar tentang normalisasi dan fitur-fitur basis data yang digunakan untuk menjaga integritas data.
Maka Anda perlu memahami penyempurnaan kinerja. Ini bukan prematur, kinerja adalah titik kegagalan kritis dari sebagian besar database dan sangat sulit untuk diperbaiki setelah Anda memiliki jutaan catatan.
Dan akhirnya Anda perlu memahami cara mengamankan data dan data apa yang perlu diamankan dan kontrol internal apa yang Anda butuhkan untuk memastikan data tidak diubah secara jahat atau untuk memastikan Anda dapat melacak perubahan dari waktu ke waktu untuk mencari tahu siapa dan kapan perubahan telah dibuat dan untuk dapat kembali ke versi sebelumnya.
Penting juga untuk membaca sedikit tentang refactoring database sebelum Anda mulai karena perlu ada refactoring nanti dan akan sangat membantu untuk mengetahui cara mengatur berbagai hal sehingga Anda dapat melakukan refactor semudah mungkin.
Secara umum data hidup lebih lama dari aplikasi selama bertahun-tahun, itu adalah jantung dari aplikasi dan tidak boleh dianggap sebagai beberapa datastore bodoh yang sebagian besar tidak relevan.
sumber
Secara umum, desain basis data yang baik adalah desain basis data yang baik - pertanyaan yang lebih besar untuk penggunaan web adalah bagaimana Anda mengakses data dan mengelola hal-hal yang orang mungkin anggap memerlukan keadaan yang pada dasarnya tidak dimiliki web.
Berpikir tentang itu, pendekatan saya didasarkan pada pengalaman yang sangat banyak ... tapi apakah Anda mulai dengan skema atau objek Anda benar-benar mencoba melakukan hal yang sama yaitu membangun model data Anda yang dapat digunakan - untuk sejumlah besar proyek ada kemungkinan untuk menjadi hubungan yang cukup langsung antara model dan skema (tidak dalam semua kasus, dan mungkin tidak untuk semua tabel / objek) jadi benar-benar masalah membangun model yang layak dimulai di mana pun Anda merasa nyaman dan bekerja dari sana.
Dalam hal membangun model yang layak - @Tim memilikinya untuk database dan pada dasarnya membangun model objek Anda akan secara luas serupa - apa yang unik, apa itu hierarki, di mana ada banyak banyak hubungan, dll. Kemudian, namun Anda sampai ke basis data, pastikan Anda melakukan semua hal yang baik.
Pastikan juga Anda memiliki skrip atau ddl dalam kode untuk memungkinkan Anda membuat skema dari awal dan memperbarui ketika Anda membuat perubahan (ddl dalam kode adalah metode pilihan saya - Saya memiliki sistem dan berfungsi).
sumber
Saya mulai dengan papan tulis besar dan banyak warna pena yang berbeda. Warna yang berbeda berarti hal yang berbeda. Dan saya baru saja mulai menggambar. Biasanya saya menggambar hal-hal yang pasti berwarna hitam, hal-hal yang kemungkinan berwarna biru, dan hal-hal yang tidak mungkin berwarna hijau. Merah untuk catatan penting. Saya menghapus dan menggambar ulang secara berlebihan. Saya berpikir tentang hal-hal apa yang perlu saya tanyakan dan pastikan modelnya mendukungnya. Jika tidak, saya akan men-tweak sampai benar.
Akhirnya jika modelnya menjadi terlalu besar saya akan memindahkannya ke Visio dan mengerjakan potongan-potongan kembali di papan tulis.
Terakhir saya berpikir tentang poin ekstensi. Kesalahan terbesar yang saya lihat kebanyakan orang lakukan adalah mendesain database mereka dan kemudian berkata "Saya sudah selesai dengan database" dan terus maju. Anda tidak pernah selesai dengan database. Setiap permintaan perubahan tunggal yang Anda peroleh cenderung turun ke tingkat itu. Jadi pikirkan tentang bagaimana menambahkannya. Pikirkan tentang jenis permintaan apa yang mungkin terjadi dan lihat apakah Anda dapat mengaitkannya. Jika Anda tidak memikirkan sama sekali tentang kemungkinan diperpanjang, Anda akan masuk ke hutang desain utama ketika permintaan perubahan itu muncul.
Adapun "SQL lalu ORM" atau sebaliknya, itu terserah Anda. Pastikan saja model Anda membuat fondasi yang baik terlebih dahulu.
sumber
Saya mendesain objek terlebih dahulu kemudian saya menggunakan ORM (seperti nHibernate) untuk membuat skema. Ini memberi saya lebih banyak fleksibilitas daripada melakukan kebalikannya.
Langkah selanjutnya adalah optimalisasi skema yang dihasilkan.
Sudah lama sejak saya telah melihat proyek di mana tabel database di mana dirancang terlebih dahulu.
sumber
Beberapa hal yang tidak secara eksplisit dinyatakan sejauh ini oleh orang lain:
Yang terbaik untuk memiliki desain database dilakukan oleh seseorang yang profesional. Tidak apa-apa untuk belajar tentu saja, tetapi saya tidak akan menyarankan membangun model menengah atau besar jika seseorang tidak berpengalaman dalam pemodelan atau desain database. Alasan untuk ini adalah bahwa biaya desain yang salah biasanya sangat tinggi.
Ketahui tujuan sistem dan persyaratan pengguna dengan baik. Tanpa mengetahui persyaratan Anda tidak dapat merancang model data yang benar.
Ketahui kode mana yang harus dilakukan dalam program dan kode mana untuk membiarkan DB menangani. Ini diperlukan agar Anda menetapkan kolom data nol, bukan nol, dll. Dengan benar. Ini juga diperlukan agar Anda menentukan RI Anda dengan benar.
Tentukan kunci utama Anda dengan baik. Gunakan tombol sederhana saat Anda bisa.
Pertimbangkan kebutuhan integrasi dengan aplikasi lain.
Pertimbangkan untuk menggunakan model data universal dan ikuti standar industri dalam penamaan dan ukuran kolom data.
Pikirkan kebutuhan masa depan (bila diketahui dan kapan berlaku)
Apakah mode Anda ditinjau oleh orang lain.
Gunakan alat untuk pemodelan - Baik alat ERD atau alat UML.
Tinjau dan pahami kode DDL yang dihasilkan. Jangan anggap remeh.
sumber