Saya perlu membuat survei di mana jawaban disimpan dalam database. Saya hanya ingin tahu apa yang akan menjadi cara terbaik untuk mengimplementasikan ini dalam database, khususnya tabel yang diperlukan. Survei ini berisi berbagai jenis pertanyaan. Misalnya: bidang teks untuk komentar, pertanyaan pilihan ganda, dan mungkin pertanyaan yang dapat berisi lebih dari satu jawaban (yaitu, periksa semua yang berlaku).
Saya telah menemukan dua solusi yang mungkin:
Buat tabel raksasa yang berisi jawaban untuk setiap pengiriman survei. Setiap kolom akan sesuai dengan jawaban dari survei. yaitu SurveyID, Answer1, Answer2, Answer3
Saya rasa ini bukan cara terbaik karena ada banyak pertanyaan dalam survei ini dan sepertinya tidak terlalu fleksibel jika survei ingin diubah.
Hal lain yang saya pikirkan adalah membuat tabel Pertanyaan dan tabel Jawaban. Tabel pertanyaan akan berisi semua pertanyaan untuk survei. Tabel jawaban akan berisi jawaban individual dari survei, setiap baris terkait dengan pertanyaan.
Contoh sederhana:
tblSurvey : SurveyID
tblQuestion : QuestionID, SurveyID , QuestionType, Question
tblAnswer : AnswerID, UserID , QuestionID , Answer
tblUser : UserID, UserName
Masalah saya dengan ini adalah bahwa mungkin ada banyak jawaban yang akan membuat tabel Jawaban cukup besar. Saya tidak yakin itu luar biasa dalam hal kinerja.
Saya menghargai ide dan saran.
sumber
Jawaban:
Saya pikir model Anda # 2 baik-baik saja, namun Anda dapat melihat model yang lebih kompleks yang menyimpan pertanyaan dan jawaban yang sudah dibuat sebelumnya (jawaban yang ditawarkan) dan memungkinkan mereka untuk digunakan kembali dalam survei yang berbeda.
- Satu survei dapat memiliki banyak pertanyaan; satu pertanyaan dapat digunakan (kembali) dalam banyak survei.
- Satu (pra-dibuat) jawaban dapat ditawarkan untuk banyak pertanyaan. Satu pertanyaan dapat memiliki banyak jawaban. Sebuah pertanyaan dapat memiliki jawaban berbeda yang ditawarkan dalam survei yang berbeda. Sebuah jawaban dapat diberikan untuk berbagai pertanyaan dalam survei yang berbeda. Ada jawaban "Lainnya" default, jika seseorang memilih yang lain, jawabannya dicatat ke dalam Answer.OtherText.
- Satu orang dapat berpartisipasi dalam banyak survei, satu orang dapat menjawab pertanyaan spesifik dalam survei hanya sekali.
sumber
Survey_Question_Answer
danAnswer
? TidakAnswer
cukup?Answer
sudah cukup,Survery_question_answer
berlebihanDesain saya ditunjukkan di bawah ini.
Skrip pembuatan terbaru ada di https://gist.github.com/durrantm/1e618164fd4acf91e372
Script dan file mysql workbench.mwb juga tersedia di
https://github.com/durrantm/survey
sumber
option_groups
danoption_choices
dan apa gunanya.option_groups
harus tepat seperti itu jika saya mendapatkan ini dengan benar.Pilihan # 2, juga saya pikir Anda mungkin memiliki pengawasan dalam skema saat ini, Anda mungkin ingin tabel lain:
Setiap pertanyaan mungkin memiliki sejumlah jawaban yang dapat dipilih oleh pengguna, kemudian respons aktual akan dilacak di tabel lain.
Database dirancang untuk menyimpan banyak data, dan skala yang paling baik. Tidak ada kebutuhan nyata untuk menggunakan bentuk normal yang lebih rendah hanya untuk menghemat ruang.
sumber
Sebagai aturan umum, memodifikasi skema berdasarkan sesuatu yang dapat diubah oleh pengguna (seperti menambahkan pertanyaan ke survei) harus dianggap cukup bau. Ada kasus-kasus di mana hal itu dapat dilakukan, terutama ketika berhadapan dengan sejumlah besar data, tetapi ketahuilah apa yang Anda hadapi sebelum menyelam. Hanya memiliki tabel "tanggapan" untuk setiap survei berarti menambahkan atau menghapus pertanyaan berpotensi sangat mahal , dan sangat sulit untuk melakukan analitik dengan cara agnostik pertanyaan.
Saya pikir pendekatan kedua Anda yang terbaik, tetapi jika Anda yakin Anda akan memiliki banyak masalah skala, satu hal yang telah bekerja untuk saya di masa lalu adalah pendekatan hybrid:
Ini benar-benar pekerjaan yang lebih banyak untuk diterapkan, jadi saya benar-benar tidak akan menyarankan ini kecuali Anda tahu pasti bahwa tabel ini akan mengalami masalah skala besar.
sumber
Pendekatan kedua adalah yang terbaik.
Jika Anda ingin menormalkan lebih lanjut, Anda bisa membuat tabel untuk jenis pertanyaan
Hal-hal sederhana yang harus dilakukan adalah:
Kami telah memiliki tabel log di Tabel SQL Server dengan 10 dari jutaan baris.
sumber
No 2 terlihat baik-baik saja.
Untuk tabel dengan hanya 4 kolom seharusnya tidak menjadi masalah, bahkan dengan beberapa juta baris. Tentu saja ini tergantung pada basis data apa yang Anda gunakan. Jika sesuatu seperti SQL Server maka tidak akan ada masalah.
Anda mungkin ingin membuat indeks pada bidang QuestionID, pada tabel tblAnswer.
Tentu saja, Anda perlu menentukan Database apa yang Anda gunakan serta volume yang diperkirakan.
sumber
Terlihat cukup lengkap untuk survei kecil. Jangan lupa menambahkan tabel untuk 'nilai terbuka', di mana pelanggan dapat memberikan pendapatnya melalui kotak teks. Tautkan tabel itu dengan kunci asing ke jawaban dan tempatkan indeks pada semua kolom relasional Anda untuk kinerja.
sumber
Angka 2 benar. Gunakan desain yang benar sampai dan kecuali Anda mendeteksi masalah kinerja. Sebagian besar RDBMS tidak akan memiliki masalah dengan meja yang sempit tapi sangat panjang.
sumber
Memiliki tabel Jawaban yang besar, dengan sendirinya, tidak menjadi masalah. Selama indeks dan batasan didefinisikan dengan baik Anda harus baik-baik saja. Skema kedua Anda terlihat bagus bagi saya.
sumber
Mengingat indeks yang tepat solusi kedua Anda dinormalisasi dan baik untuk sistem basis data relasional tradisional.
Saya tidak tahu seberapa besar itu sangat besar tetapi seharusnya bisa bertahan tanpa masalah, sejuta jawaban.
sumber
Anda dapat memilih untuk menyimpan seluruh formulir sebagai string JSON.
Tidak yakin dengan kebutuhan Anda, tetapi pendekatan ini akan berhasil dalam beberapa keadaan.
sumber