Saya tahu Anda berjuang dengan banyak hal pada saat yang sama, tetapi jawaban terbaik memecahkan masalah yang ikegami cepat berlalu dalam perjalanannya untuk melakukannya di Perl:
Orang sering melakukan lebih dari yang mereka butuhkan di tingkat aplikasi karena mereka tidak pernah belajar melakukan hal yang benar dalam database (seperti pertanyaan lain yang lebih baik dijawab oleh kueri SQL yang sesuai daripada Perl). Namun, selain itu, banyak orang melakukan itu karena mereka tidak dapat mengubah skema. Heuristik sosial, seperti aplikasi bir yang tepat, terkadang memuluskan jalan itu. Sedikit kerja meyakinkan orang-orang database terbayar dalam kelipatan nanti. Dan, selain itu, "pengembang tumpukan penuh" sering kali mengabaikan penggunaan database yang canggih.
Saya tidak akan membuat siapa pun membaca Database in Depth C.J. Date , tetapi ada banyak nilai dalam mendapatkan skema yang benar. Benar, maksud saya itu memaksakan paling sedikit usaha dan kompleksitas pada penggunaannya. Segalanya harus mudah, dan Anda tidak perlu mengatur ulang hal-hal ini di tingkat aplikasi.
Anda ingin menghitung berapa kali setiap jawaban dipilih. Menghitung adalah sesuatu yang dilakukan database dengan sangat baik, jadi biarkan database melakukannya.
Anda memiliki beberapa pertanyaan. Pertanyaan memiliki jawaban yang beragam. Survei mengelompokkan serangkaian pertanyaan. Orang-orang menanggapi survei dengan mengaitkan jawaban mereka dengan pertanyaan.
Berikut adalah desain skema sederhana (dan beberapa orang database akhirnya akan muncul dan memberi tahu saya bahwa saya tidak melakukannya dengan benar, tapi tidak apa-apa). Triknya adalah tidak ada yang harus memiliki banyak kolom yang tidak digunakan. Semuanya hadir dalam paket kecil yang rapi ("hubungan" dalam "database relasional") yang mudah dihubungkan ke hal-hal lain melalui "kunci asing" (mis. question_id untuk memetakan jawaban atas pertanyaan). Jawaban, misalnya, akan memiliki beberapa baris untuk question_id
yang sama .
Jika seseorang ingin datang dengan alat pemodelan mewah dan membuat gambar, lakukanlah. Saya menandai ini sebagai wiki komunitas.
Table: Questions
id
text
Table: Answers
id
text
question_id
Table: Surveys
id
title
Table: SurveyQuestionSet
id
survey_id
question_id
Table: Respondent
id
text
Table: Response
id
respondent_id
survey_id
question_id
answer_id
Setelah dipetakan dan dinormalisasi dengan benar (baca formulir normal ), sangat mudah untuk mendapatkan data yang Anda inginkan dengan SELECT. Ideal dari normalisasi adalah tidak mengulangi informasi atau membiarkannya masuk ke keadaan yang tidak konsisten. Dalam bentuk ini, banyak hal menjadi lebih mudah dilakukan.
Dan, jika Anda ingin mempraktikkan hal seperti itu, Stackoverflow Data Explorer adalah kumpulan data kehidupan nyata yang dinormalisasi dengan apa yang saya sajikan di sini.
Sekarang Anda cukup menghitung berapa kali answer_id
muncul untuk kombinasi tertentu dari survei dan pertanyaan. Penggunaan GROUP BY
melakukan semua pekerjaan untuk Anda. Anda tidak perlu lagi mengulangi baris dengan melihat puluhan kolom yang tidak digunakan mencoba mencari cara untuk menghitungnya. Tidak hanya itu, tetapi Anda dapat membuat hal-hal ini tampilan
, yang berarti Anda menulis kueri sekali dan database berpura-pura bahwa hasilnya adalah tabel. Anda kemudian dapat dengan mudah menanyakan tampilan (jadi semua JOIN
s dan juga disembunyikan), yang jauh lebih sederhana. Prosedur tersimpan juga sering diabaikan.