Bagaimana Anda mendekati desain basis data? [Tutup]

14

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?

bron
sumber
8
Desain basis data yang baik untuk aplikasi web sama dengan desain basis data yang baik untuk aplikasi apa pun. Ada banyak buku pengantar yang tersedia yang melakukan pekerjaan dengan baik untuk membahas dasar-dasarnya.
Robert Harvey
1
@harvey Buku apa pun yang mungkin ingin Anda rekomendasikan?
bron

Jawaban:

14

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:

  • Jika membangun
  • If Else Constructs
  • Lakukan While Loops
  • Lakukan Sampai Loops
  • Case Constructs

Dengan database yang Anda miliki:

  • Tabel Data
  • Tabel Pencarian
  • Hubungan satu ke satu
  • Hubungan Satu ke Banyak
  • Banyak ke Banyak hubungan
  • Kunci primer
  • Kunci asing

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.

Michael Riley - AKA Gunny
sumber
11

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.

Tim Claason
sumber
10

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.

Robert Harvey
sumber
1
ORM tidak menemukan skema Anda. Itu membangunnya berdasarkan apa yang telah Anda lakukan pada objek Anda. Jika Anda membangun objek dari skema Anda, Anda sebenarnya mendelegasikan tugas penting ke ORM bodoh Anda.
1
@ Pierre303 Skema ini dibangun dari aturan pemrograman di dalam ORM yang mungkin tidak cocok dengan situasi / desain Anda. Ini dapat membuat databse suboptimal. Saya telah melihat beberapa hal mengerikan keluar dari ORM bahkan pada tingkat permintaan.
m4tt1mus
@ Pierre303, saya pikir komentar ini menunjukkan dengan tepat mengapa itu ide buruk untuk membangun dari ORm, database yang dirancang dengan baik seharusnya tidak secara langsung cocok dengan objek yang digunakan dalam aplikasi. Sering ada banyak hal lain yang perlu untuk mendesain database dengan benar sehingga ini tidak akan mempertimbangkan atau mengurangi mempertimbangkan struktur apa yang paling efisien untuk database bukan aplikasi.
HLGEM
@HLGEM: Anda tidak mungkin bekerja dengan ORM canggih seperti Hibernate dan menulis komentar itu
OH, bagaimana ORM menangani audit dan bidang yang dibutuhkan oleh hal-hal selain aplikasi Anda?
HLGEM
5

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.

Ian Mackinnon
sumber
5

desain basis data tidak dapat dilakukan sepenuhnya tanpa mempertimbangkan bagaimana data akan digunakan, jadi inilah daftar langkah-langkahnya:

  • tulis kalimat pendek yang menangkap hubungan antar entitas
  • menggambar diagram hubungan entitas yang mewakili kalimat
  • membuat model data logis yang dinormalisasi dari diagram ER
  • membuat matriks CRUD untuk aplikasi dan entitas
  • gunakan matriks untuk memverifikasi cakupan siklus hidup setiap entitas
  • ekstrak subschemas untuk setiap aplikasi
  • memeriksa jalur navigasi di atas subschema untuk setiap operasi utama / CRUD
  • pertimbangkan laporan yang akan diminta
  • desain model data fisik berdasarkan semua hal di atas; denormalkan, partisi, dan gunakan skema bintang jika perlu
Steven A. Lowe
sumber
Anda lebih baik memastikan Anda mendapatkan laporan dengan benar jika Anda berencana menyenangkan orang-orang yang menulis cek.
JeffO
3

Agar berhasil merancang database, Anda perlu mempertimbangkan beberapa hal terlebih dahulu:

  • Data apa yang perlu saya simpan dan bagaimana hubungannya dengan data lain yang saya simpan. Bagaimana data ini perlu berubah seiring waktu? Apakah saya harus dapat melihat snapshot dalam waktu (pesanan dari 2009) atau apakah saya hanya perlu apa yang saat ini (hanya pengguna aktif)?
  • Bagaimana saya bisa memastikan data saya bermakna dan mempertahankan makna dari waktu ke waktu (integritas data)?
  • Bagaimana saya bisa memastikan bahwa akses data cepat?
  • Bagaimana saya bisa mengamankan data saya?

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.

HLGEM
sumber
2

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).

Murph
sumber
2

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.

Hounshell
sumber
Yang sulit ini ... Saya setuju bahwa seseorang perlu mempertimbangkan masa depan proyek (dan sisanya baik, maka upvote) tapi saya sudah lebih dari sekali memiliki database yang memiliki bidang dan bahkan tabel yang akhirnya tidak pernah digunakan karena Saya merancang masa depan yang tidak pernah terjadi. Saya sekarang cenderung membangun untuk menyelesaikan masalah yang ada - tetapi (dan ini adalah kartu "keluar dari penjara") saya memastikan saya memiliki mekanisme yang memungkinkan saya untuk dengan mudah memperbarui skema (dan karena saya melakukannya dari kode dapat menerapkan manipulasi kompleks dalam proses jika perlu)
Murph
Itulah tepatnya yang saya coba sampaikan. Bangun apa yang Anda butuhkan, tidak lebih. Tetapi jika Anda tidak berencana untuk ekspansi nanti, apakah Anda pernah berada di lalu lintas jam sibuk di area teluk? Itu adalah contoh sempurna dari apa yang terjadi ketika Anda tidak berpikir ke depan tentang bagaimana Anda perlu berkembang.
Hounshell
Dan untuk memperjelas warna dengan lebih baik: Hitam untuk hal-hal yang saya tahu benar. Biasanya hal-hal sederhana yang tidak benar-benar ada skema lain yang masuk akal. Biru adalah untuk hal-hal yang saya mungkin memutuskan untuk merestrukturisasi sedikit. Hal-hal yang mungkin benar, tetapi saya dapat menghapus. Hijau adalah untuk hal-hal di mana saya benar-benar melakukan brainstorming dan saya cenderung menghapus.
Hounshell
1

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
Iya. Kecuali Anda seorang guru DB jaga db sesederhana mungkin. Seharusnya hanya cukup baik untuk mendukung aplikasi. Pra-optimasi buruk. Pra-optimasi ketika Anda tidak tahu apa yang Anda lakukan mengerikan. Jika Anda mengalami masalah (dan Anda mungkin tidak akan) hanya kemudian membawa ahli nyata.
ElGringoGrande
1
@ElGringoGrande Kecuali Anda adalah dbguru, Anda tidak memiliki bisnis merancang database untuk apa pun kecuali aplikasi yang paling sederhana. Jika itu akan membutuhkan lebih dari 10 tabel dan akan menampung tidak lebih dari 100.000 catatan dan Anda tidak memiliki perancang basis data profesional, maka Anda salah melakukannya.
HLGEM
Omong kosong. Saya mendesain database yang memiliki lebih dari 160 tabel dan memiliki jutaan baris (tabel terbesar hanya memiliki lebih dari satu juta catatan untuk pelanggan ukuran sedang. Pelanggan terbesar memiliki lebih dari 5 juta). Sebagian besar pelanggan memiliki beberapa ratus pengguna bersamaan dan lebih dari 2 ribu pengguna terbesar. Dan saya bukan DB Guru dan kami juga tidak mempekerjakannya. Saya telah melakukan beberapa desain DB untuk beberapa aplikasi yang berbeda. Anak laki-laki apakah saya mengacaukan.
ElGringoGrande
1
ElGringoGrande: Jika Anda telah mendesain database seperti itu, dengan ratusan pengguna bersamaan dan jutaan baris di tabel dan pengguna senang, maka Anda adalah db-guru. Mungkin Anda belum menyadarinya.
ypercubeᵀᴹ
1

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.

Tidak mungkin
sumber