Desain basis data untuk survei [ditutup]

129

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:

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

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

Michael
sumber
Berapa "cukup besar"? Beri kami perkiraan, apakah kita berbicara tentang sejuta atau seribu juta?
Jorge Córdoba
1
SQL server sebenarnya dirancang untuk bekerja dengan banyak data. Anda seharusnya tidak mengalami banyak kesulitan dalam menangani skema yang telah Anda bicarakan.
Chris

Jawaban:

123

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.

survey_model_02

Damir Sudarevic
sumber
1
alat apa yang Anda gunakan untuk membuat skema database?
AndHeiberg
Saya menggunakan Altova UModel. Cepat, menawarkan berbagai pilihan struktur pemodelan, dan menyimpan hampir semua format. Padahal, biayanya.
obimod
9
Anda juga dapat menggunakan draw.io Gratis tanpa mendaftar dan mudah digunakan.
usr4896260
3
Kenapa kita punya Survey_Question_Answerdan Answer? Tidak Answercukup?
Abubakar Ahmad
1
Saya pikir Answersudah cukup, Survery_question_answerberlebihan
Batman
62

Desain 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 masukkan deskripsi gambar di sini

Michael Durrant
sumber
Hai, saya suka desain Anda. Harap punya sampel data (kesedihan) untuk tabel? Akan sangat menghargai
Emeka Mbah
Hai! Terima kasih pertama atas pekerjaan Anda, ini luar biasa! Apakah Anda mempertimbangkan hierarki di salah satu templat Anda? Pengguna biasanya memberikan informasi tentang pemimpin mereka dan para pemimpin ini memiliki informasi tentang pemimpin mereka dan seterusnya. Dan para pengguna bekerja di bagian yang berbeda (SDM, Produksi) dan ini dapat memiliki hirarki juga. Jadi, selama pelaporan, seringkali perlu untuk membedakan antara tingkat organisasi ini.
ruedi
@ Michael: Itu sangat membantu. apakah Anda memiliki referensi / tautan github untuk java menggunakan pegas?
Sagar Panda
Saya masih berusaha mencari tahu apa perbedaan antara option_groupsdan option_choicesdan apa gunanya.
PHPnoob
@PHPnoob Saya pikir ini, seperti namanya, hanya mengelompokkan opsi. Jadi, jika Anda dapat misalnya menilai antara 1 hingga 5, maka Anda option_groupsharus tepat seperti itu jika saya mendapatkan ini dengan benar.
displayname
18

Pilihan # 2, juga saya pikir Anda mungkin memiliki pengawasan dalam skema saat ini, Anda mungkin ingin tabel lain:

+-----------+
| tblSurvey |
|-----------|
| SurveyId  |
+-----------+

+--------------+
| tblQuestion  |
|--------------|
| QuestionID   |
| SurveyID     |
| QuestionType |
| Question     |
+--------------+

+--------------+
| tblAnswer    |
|--------------|
| AnswerID     |
| QuestionID   |
| Answer       |
+--------------+

+------------------+
| tblUsersAnswer   |
|------------------|
| UserAnswerID     |
| AnswerID         |
| UserID           |
| Response         |
+------------------+

+-----------+
| tblUser   |
|-----------|
| UserID    |
| UserName  |
+-----------+

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.

tplaner
sumber
Hai, saya punya pertanyaan. Bukankah seharusnya SurveyId hadir di tabel jawaban juga atau setidaknya cap waktu yang cocok dengan waktu versi survei? Jika Anda memasukkan pertanyaan dalam survei asli Anda, questionIds akan berubah, dan jawabannya akan menjadi tidak dapat diidentifikasi. Atau jika itu berlebihan, dapatkah Anda menjelaskan caranya?
Shubham
3

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:

  1. Buat tabel respons terperinci untuk menyimpan respons per pertanyaan seperti yang telah Anda jelaskan di 2. Data ini biasanya tidak akan langsung ditanyakan dari aplikasi Anda, tetapi akan digunakan untuk menghasilkan data ringkasan untuk tabel pelaporan. Anda mungkin juga ingin menerapkan beberapa bentuk pengarsipan atau penghapusan untuk data ini.
  2. Buat juga tabel tanggapan dari 1 jika perlu. Ini dapat digunakan kapan pun pengguna ingin melihat tabel sederhana untuk hasil.
  3. Untuk setiap analitik yang perlu dilakukan untuk tujuan pelaporan, jadwalkan pekerjaan untuk membuat data ringkasan tambahan berdasarkan data dari 1.

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.

Ryan Brunner
sumber
1

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:

  • Tempatkan basis data dan masuk ke disk mereka sendiri, tidak semua pada C sebagai default
  • Buat database sebesar yang diperlukan sehingga Anda tidak memiliki jeda saat database tumbuh

Kami telah memiliki tabel log di Tabel SQL Server dengan 10 dari jutaan baris.

Shiraz Bhaiji
sumber
1

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.

kevchadders
sumber
0

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.

Ben Fransen
sumber
1
Apakah ada alasan mengapa saya tidak bisa juga memasukkan komentar di dalam tabel jawaban?
Michael
0

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.

Larry Lustig
sumber
0

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.

Dave Swersky
sumber
0

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.

Jorge Córdoba
sumber
0

Anda dapat memilih untuk menyimpan seluruh formulir sebagai string JSON.

Tidak yakin dengan kebutuhan Anda, tetapi pendekatan ini akan berhasil dalam beberapa keadaan.

mriiiron
sumber