การออกแบบฐานข้อมูลสำหรับแบบสำรวจ [ปิด]


129

ฉันต้องการสร้างแบบสำรวจที่เก็บคำตอบไว้ในฐานข้อมูล ฉันแค่สงสัยว่าอะไรคือวิธีที่ดีที่สุดในการนำสิ่งนี้ไปใช้ในฐานข้อมูลโดยเฉพาะตารางที่ต้องการ แบบสำรวจประกอบด้วยคำถามประเภทต่างๆ ตัวอย่างเช่น: ช่องข้อความสำหรับความคิดเห็นคำถามปรนัยและคำถามที่อาจมีมากกว่าหนึ่งคำตอบ (เช่นเลือกทุกข้อที่เกี่ยวข้อง)

ฉันคิดวิธีแก้ปัญหาที่เป็นไปได้สองวิธี:

  1. สร้างตารางขนาดยักษ์ที่มีคำตอบสำหรับการส่งแบบสำรวจแต่ละครั้ง แต่ละคอลัมน์จะสอดคล้องกับคำตอบจากแบบสำรวจ ได้แก่ SurveyID, Answer1, Answer2, Answer3

    ฉันไม่คิดว่านี่เป็นวิธีที่ดีที่สุดเนื่องจากมีคำถามมากมายในแบบสำรวจนี้และดูเหมือนจะไม่ยืดหยุ่นเท่าไหร่หากแบบสำรวจต้องเปลี่ยนแปลง

  2. สิ่งอื่นที่ฉันคิดคือการสร้างตารางคำถามและตารางคำตอบ ตารางคำถามจะมีคำถามทั้งหมดสำหรับแบบสำรวจ ตารางคำตอบจะมีคำตอบจากแบบสำรวจแต่ละแถวเชื่อมโยงกับคำถาม

    ตัวอย่างง่ายๆ:

    tblSurvey : SurveyID

    tblQuestion : QuestionID, SurveyID , QuestionType, คำถาม

    tblAnswer : AnswerID, UserID , รหัสคำถาม , คำตอบ

    tblUser : UserID, UserName

    ปัญหาของฉันเกี่ยวกับเรื่องนี้คืออาจมีคำตอบมากมายซึ่งจะทำให้ตารางคำตอบค่อนข้างใหญ่ ฉันไม่แน่ใจว่ามันยอดเยี่ยมมากเมื่อพูดถึงการแสดง

ฉันขอขอบคุณสำหรับความคิดและข้อเสนอแนะ


"สวยมาก" ขนาดไหน? ให้ค่าประมาณเรากำลังพูดถึงล้านหรือพันล้าน?
Jorge Córdoba

1
เซิร์ฟเวอร์ SQL ได้รับการออกแบบมาเพื่อทำงานกับข้อมูล 'จำนวนมาก' คุณไม่ควรมีปัญหาในการทำงานกับโครงการที่คุณพูดถึง
คริส

คำตอบ:


123

ฉันคิดว่าแบบจำลอง # 2 ของคุณนั้นใช้ได้ แต่คุณสามารถดูโมเดลที่ซับซ้อนมากขึ้นซึ่งเก็บคำถามและคำตอบที่สร้างไว้ล่วงหน้า (คำตอบที่มีให้) และอนุญาตให้ใช้ซ้ำในแบบสำรวจต่างๆได้

- แบบสำรวจหนึ่งสามารถมีคำถามมากมาย คำถามหนึ่งข้อสามารถใช้ในการสำรวจหลายครั้ง
- สามารถเสนอคำตอบหนึ่งคำตอบสำหรับคำถามหลายข้อ คำถามหนึ่งข้อสามารถมีได้หลายคำตอบ คำถามอาจมีคำตอบที่แตกต่างกันในแบบสำรวจต่างๆ สามารถเสนอคำตอบสำหรับคำถามที่แตกต่างกันในแบบสำรวจต่างๆ มีคำตอบ "อื่น ๆ " เริ่มต้นหากบุคคลใดเลือกคำตอบอื่นคำตอบของเธอจะถูกบันทึกไว้ในคำตอบอื่น ๆ
- บุคคลหนึ่งคนสามารถเข้าร่วมในแบบสำรวจได้หลายแบบคนหนึ่งสามารถตอบคำถามเฉพาะในแบบสำรวจได้เพียงครั้งเดียว

survey_model_02


1
คุณใช้เครื่องมืออะไรในการสร้างสคีมาฐานข้อมูล
AndHeiberg

ฉันใช้ Altova UModel รวดเร็วมีโครงสร้างการสร้างแบบจำลองให้เลือกมากมายและบันทึกลงในทุกรูปแบบ แม้ว่าจะมีค่าใช้จ่าย
obimod

9
คุณยังสามารถใช้draw.ioได้ฟรีโดยไม่ต้องสมัครและใช้งานง่าย
usr4896260

3
ทำไมเราถึงมีSurvey_Question_AnswerและAnswer? แค่นี้ไม่Answerพอเหรอ?
Abubakar Ahmad

1
ฉันคิดว่าAnswerเพียงพอแล้วSurvery_question_answerซ้ำซ้อน
Batman

63

การออกแบบของฉันแสดงไว้ด้านล่าง

สคริปต์สร้างล่าสุดอยู่ที่https://gist.github.com/durrantm/1e618164fd4acf91e372

สคริปต์และไฟล์ mysql workbench.mwb มีอยู่ที่
https://github.com/durrantm/survey ใส่คำอธิบายภาพที่นี่


สวัสดีฉันชอบการออกแบบของคุณ โปรดมีตัวอย่างข้อมูล (ทิ้ง) สำหรับตารางหรือไม่? จะขอบคุณจริงๆ
Emeka Mbah

สวัสดี! ก่อนอื่นขอบคุณสำหรับงานของคุณมันยอดเยี่ยมมาก! คุณคิดว่า hierachies ในเทมเพลตของคุณหรือไม่? ผู้ใช้มักให้ข้อมูลเกี่ยวกับผู้นำของตนและผู้นำเหล่านี้มีข้อมูลเกี่ยวกับผู้นำของตนเป็นต้น และผู้ใช้ทำงานในส่วนต่างๆ (HR, Production) และสิ่งเหล่านี้ก็สามารถมีส่วนร่วมได้เช่นกัน ดังนั้นในระหว่างการรายงานมักจำเป็นต้องแตกต่างกันระหว่างระดับองค์กรเหล่านี้
ruedi

@michael: นั่นเป็นประโยชน์จริงๆ คุณมีลิงค์อ้างอิง / github สำหรับ java ที่ใช้ spring หรือไม่?
Sagar Panda

ฉันยังคงพยายามค้นหาว่าอะไรคือความแตกต่างระหว่างoption_groupsและoption_choicesกรณีการใช้งานคืออะไร
PHPnoob

@PHPnoob ฉันคิดว่านี่เป็นชื่อที่แนะนำเพียงแค่จัดกลุ่มตัวเลือก ดังนั้นถ้าคุณทำได้เช่นให้คะแนนระหว่าง 1 ถึง 5 ก็option_groupsควรเผื่อไว้ว่าถ้าฉันเข้าใจถูก
DisplayName

18

แน่นอนตัวเลือก # 2 ฉันคิดว่าคุณอาจมีการกำกับดูแลในสคีมาปัจจุบันคุณอาจต้องการตารางอื่น:

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

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

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

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

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

คำถามแต่ละข้อน่าจะมีจำนวนคำตอบที่ผู้ใช้สามารถเลือกได้จากนั้นคำตอบจริงจะถูกติดตามในตารางอื่น

ฐานข้อมูลได้รับการออกแบบมาเพื่อจัดเก็บข้อมูลจำนวนมากและส่วนใหญ่ปรับขนาดได้ดีมาก ไม่จำเป็นต้องใช้รูปแบบปกติที่น้อยกว่าเพียงเพื่อประหยัดพื้นที่อีกต่อไป


สวัสดีฉันมีคำถาม ไม่ควรมี SurveyId อยู่ในตารางคำตอบด้วยหรืออย่างน้อยการประทับเวลาที่ตรงกับเวลากำหนดเวอร์ชันของแบบสำรวจ หากคุณใส่คำถามในแบบสำรวจเดิมของคุณคำถามจะเปลี่ยนไปและคำตอบจะไม่สามารถระบุได้ หรือถ้าซ้ำซ้อนช่วยอธิบายได้ไหม
Shubham

3

ตามกฎทั่วไปการปรับเปลี่ยนสคีมาตามสิ่งที่ผู้ใช้สามารถเปลี่ยนแปลงได้ (เช่นการเพิ่มคำถามในแบบสำรวจ) ควรได้รับการพิจารณาว่าค่อนข้างส่งกลิ่น มีหลายกรณีที่เหมาะสมโดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับข้อมูลจำนวนมาก แต่ควรรู้ว่าคุณกำลังทำอะไรก่อนที่จะดำน้ำการมีเพียงตาราง "คำตอบ" สำหรับแบบสำรวจแต่ละครั้งหมายความว่าการเพิ่มหรือลบคำถามอาจมีค่าใช้จ่ายสูงมาก และเป็นการยากมากที่จะทำการวิเคราะห์ด้วยวิธีที่ไม่เชื่อเรื่องพระเจ้า

ฉันคิดว่าแนวทางที่สองของคุณดีที่สุด แต่ถ้าคุณมั่นใจว่าคุณจะมีความกังวลมากมายสิ่งหนึ่งที่ได้ผลสำหรับฉันในอดีตคือแนวทางแบบผสมผสาน:

  1. สร้างตารางการตอบกลับโดยละเอียดเพื่อจัดเก็บคำตอบแต่ละคำถามตามที่คุณได้อธิบายไว้ในข้อ 2 โดยทั่วไปข้อมูลนี้จะไม่ถูกสอบถามโดยตรงจากแอปพลิเคชันของคุณ แต่จะใช้ในการสร้างข้อมูลสรุปสำหรับตารางการรายงาน คุณอาจต้องการใช้รูปแบบการเก็บถาวรหรือการลบข้อมูลบางรูปแบบสำหรับข้อมูลนี้
  2. สร้างตารางการตอบกลับจาก 1 ด้วยหากจำเป็น สามารถใช้ได้ทุกเมื่อที่ผู้ใช้ต้องการดูตารางง่ายๆสำหรับผลลัพธ์
  3. สำหรับการวิเคราะห์ใด ๆ ที่จำเป็นต้องทำเพื่อวัตถุประสงค์ในการรายงานให้กำหนดเวลางานเพื่อสร้างข้อมูลสรุปเพิ่มเติมตามข้อมูลจาก 1

นี่เป็นงานที่ต้องนำไปใช้มากขึ้นอย่างแน่นอนดังนั้นฉันจะไม่แนะนำสิ่งนี้จริงๆเว้นแต่คุณจะรู้แน่ชัดว่าตารางนี้จะประสบปัญหาขนาดใหญ่


1

แนวทางที่สองดีที่สุด

หากคุณต้องการทำให้เป็นมาตรฐานเพิ่มเติมคุณสามารถสร้างตารางสำหรับประเภทคำถาม

สิ่งง่ายๆที่ต้องทำมีดังนี้

  • วางฐานข้อมูลและล็อกบนดิสก์ของตัวเองไม่ใช่ทั้งหมดบน C เป็นค่าเริ่มต้น
  • สร้างฐานข้อมูลให้ใหญ่เท่าที่จำเป็นเพื่อให้คุณไม่มีการหยุดชั่วคราวในขณะที่ฐานข้อมูลเติบโตขึ้น

เรามีตารางบันทึกใน SQL Server Table ที่มี 10 ล้านแถว


1

ไม่มี 2 ดูดี

สำหรับตารางที่มีเพียง 4 คอลัมน์ก็ไม่ควรเป็นปัญหาแม้ว่าจะมีแถวที่ดีไม่กี่ล้านแถวก็ตาม แน่นอนว่าขึ้นอยู่กับฐานข้อมูลที่คุณใช้ ถ้าเป็น SQL Server ก็จะไม่มีปัญหา

คุณอาจต้องการสร้างดัชนีในฟิลด์รหัสคำถามบนตาราง tblAnswer

แน่นอนคุณต้องระบุว่าคุณใช้ฐานข้อมูลอะไรรวมถึงปริมาณโดยประมาณ


0

ดูค่อนข้างสมบูรณ์สำหรับการสำรวจเพียงเล็กน้อย อย่าลืมเพิ่มตารางสำหรับ "ค่าที่เปิด" ซึ่งลูกค้าสามารถแสดงความคิดเห็นผ่านกล่องข้อความ เชื่อมโยงตารางนั้นด้วยคีย์นอกเข้ากับคำตอบของคุณและวางดัชนีในคอลัมน์เชิงสัมพันธ์ทั้งหมดของคุณเพื่อประสิทธิภาพ


1
มีเหตุผลไหมที่ฉันไม่สามารถใส่ความคิดเห็นในตารางคำตอบได้?
Michael

0

หมายเลข 2 ถูกต้อง ใช้การออกแบบที่ถูกต้องจนกว่าคุณจะตรวจพบปัญหาด้านประสิทธิภาพ RDBMS ส่วนใหญ่จะไม่มีปัญหากับตารางที่แคบ แต่ยาวมาก


0

การมีตารางคำตอบขนาดใหญ่ในตัวมันเองไม่ใช่ปัญหา ตราบใดที่ดัชนีและข้อ จำกัด ได้รับการกำหนดไว้อย่างดีคุณควรจะสบายดี สคีมาที่สองของคุณดูดีสำหรับฉัน


0

การระบุดัชนีที่เหมาะสมโซลูชันที่สองของคุณเป็นมาตรฐานและดีสำหรับระบบฐานข้อมูลเชิงสัมพันธ์แบบเดิม

ฉันไม่รู้ว่ามันใหญ่แค่ไหน แต่มันควรจะมีคำตอบสองล้านคำตอบโดยไม่มีปัญหา


0

คุณสามารถเลือกที่จะจัดเก็บรูปแบบทั้งหมดเป็นสตริง JSON

ไม่แน่ใจเกี่ยวกับความต้องการของคุณ แต่วิธีนี้ใช้ได้ในบางสถานการณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.