Saya sedang membangun aplikasi web yang memanipulasi data yang cukup rumit: tab gitar.
As a reference, guitar tabs look like this:
Eb|-------------------------------------------------------------------------|
Bb|-------------------------------------------------------------------------|
Gb|--5-5-5-5----------------------------------------------------------------|
Db|--5-5-5-5--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Ab|--3-3-3-3--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Eb|-----------1-1-1-1--5-5-5-5--3-3-3-3--0-0-0-0--1-1-1-1--0-0-0-0--3-3-3-3-|
Apakah akan lebih efisien bagi kinerja untuk menyimpan data ini sebagai potongan besar, atau memecahnya dan menyimpannya dengan dasar "catatan demi catatan"?
As a use case:
User changes first chord from: to:
Eb|--- Eb|---
Bb|--- Bb|---
Gb|--5 Gb|--4
Db|--5 Db|--4
Ab|--3 Ab|--2
Eb|--- Eb|---
Jika saya menyimpannya sebagai blok, kode untuk memanipulasi tab harus jauh lebih kompleks. Jika saya menyimpannya dengan catatan, database harus diakses lebih banyak. Metode mana yang lebih efisien? Secara potensial, banyak pengguna akan memodifikasi data. Saya ingin aplikasi web berkinerja terbaik. Saya akan menggunakan MySQL jika itu mempengaruhi jawaban sama sekali.
database-design
Gabe Willard
sumber
sumber
Jawaban:
Jumlah operasi akan tetap sama. Anda melakukan satu permintaan untuk mendapatkan semua akord untuk sebuah lagu, lalu Anda melakukan satu pembaruan setiap kali perubahan dilakukan. Perbedaannya benar-benar dalam ukuran pembaruan. Dengan metode blok, Anda harus menyimpan seluruh lagu setiap kali Anda mengubah akor. Dengan metode individual, pembaruan Anda akan lebih kecil, dan mungkin secara keseluruhan lebih efisien, meskipun perbedaannya dapat diabaikan.
Satu hal yang perlu dipertimbangkan adalah metode note-by-note lebih dinormalisasi, artinya Anda akan memiliki lebih banyak opsi permintaan terbuka untuk Anda di ujung jalan jika Anda menggunakannya. Misalnya, pemula dapat menyaring chord yang tidak mereka ketahui saat mencari lagu untuk dipelajari, atau Anda dapat mengizinkan pencarian berdasarkan chord pembuka jika seseorang tidak mengetahui judul lagu. Bahkan jika Anda tidak merencanakan fitur-fitur itu sekarang, akan sangat menyusahkan untuk mengubah database Anda jika Anda menginginkan sesuatu seperti itu nanti.
sumber
Secara umum, lebih banyak normalisasi bagus karena beberapa alasan:
Kerugian ( dijelaskan dengan baik di sini ) meliputi:
Saya akan menyarankan mulai dengan desain yang lebih normal, dan hanya mempertimbangkan denormalisasi jika Anda mengalami masalah kinerja.
sumber
Jadikan penyimpanan Anda paling mudah untuk dikerjakan, dan cukup sulit untuk gagal. Pergi dengan skema yang cukup dinormalisasi. Pergilah dengan skema yang tidak menghalangi penggunaan selain yang Anda perlukan dalam rilis pertama Anda, jika memungkinkan.
Jika semua yang Anda butuhkan adalah untuk menunjukkan tab untuk lagu tertentu, Anda bisa menyimpan banyak 6-tupel dalam DB berorientasi dokumen (seperti MongoDB), mengambil mereka sebagai satu dokumen.
Dalam RDBMS, saya akan menyimpannya dengan cara yang sama, dalam tabel seperti ini:
RDBMS sangat bagus dalam pertanyaan sederhana seperti yang diperlukan untuk menampilkan lagu:
Menggunakan
limit
danoffset
, Anda dapat menampilkan bagian-bagian dari sebuah lagu.Nantinya akan mudah untuk menautkan
tab_column
ke tabel yang berisi daftar akor, jika Anda dapat mengenali akor.Ini mungkin skema yang paling sederhana; Saya akan mulai dengan itu.
sumber