설문 조사를위한 데이터베이스 설계


129

답변이 데이터베이스에 저장된 설문 조사를 작성해야합니다. 데이터베이스, 특히 필요한 테이블에서 이것을 구현하는 가장 좋은 방법이 무엇인지 궁금합니다. 설문 조사에는 여러 유형의 질문이 포함되어 있습니다. 예를 들면 다음과 같습니다. 설명을위한 텍스트 필드, 객관식 질문 및 둘 이상의 답변을 포함 할 수있는 질문 (예 : 해당되는 모든 항목 확인).

두 가지 가능한 솔루션을 생각해 냈습니다.

  1. 각 설문 제출에 대한 답변이 포함 된 거대한 테이블을 만듭니다. 각 열은 설문 조사의 답변에 해당합니다. 즉, SurveyID, Answer1, Answer2, Answer3

    이 설문 조사에 많은 질문이 있기 때문에 이것이 최선의 방법이라고 생각하지 않으며 설문 조사가 변경 될 경우 매우 유연하지 않은 것으로 보입니다.

  2. 내가 생각한 다른 것은 질문 테이블과 답변 테이블을 만드는 것이 었습니다. 질문 테이블에는 설문에 대한 모든 질문이 포함됩니다. 답변 표에는 설문 조사의 개별 답변이 포함되며 각 행은 질문에 연결됩니다.

    간단한 예 :

    tblSurvey : SurveyID

    tblQuestion : QuestionID, SurveyID , QuestionType, 질문

    tblAnswer : AnswerID , UserID , QuestionID , 답변

    tblUser : 사용자 ID, 사용자 이름

    이것에 대한 나의 문제는 답변 테이블을 꽤 크게 만들 수있는 많은 답변이있을 수 있다는 것입니다. 성능면에서 그렇게 큰지 잘 모르겠습니다.

나는 어떤 아이디어 나 제안에 감사드립니다.


"꽤 큰"얼마입니까? 우리에게 견적을 줘, 우리는 백만 또는 천만에 대해 이야기하고 있습니까?
호르헤 코르도바

1
SQL 서버는 실제로 '톤'의 데이터를 처리하도록 설계되었습니다. 당신이 이야기 한 계획을 다루는 데 큰 어려움이 없어야합니다.
Chris

답변:


123

모델 # 2는 훌륭하지만 질문과 사전 답변 (제공된 답변)을 저장하고 다른 설문 조사에서 재사용 할 수있는 더 복잡한 모델을 살펴볼 수 있습니다.

-하나의 설문 조사에는 많은 질문이있을 수 있습니다. 하나의 질문은 많은 설문 조사에서 (재) 사용될 수 있습니다.
-많은 질문에 대해 하나의 (사전 제작 된) 답변을 제공 할 수 있습니다. 하나의 질문에는 많은 답변이 제공 될 수 있습니다. 질문은 다른 설문 조사에서 다른 답변을 제공 할 수 있습니다. 설문 조사마다 다른 질문에 대한 답변을 제공 할 수 있습니다. 기본 "기타"답변이 있습니다. 사람이 다른 것을 선택하면 답변이 Answer.OtherText에 기록됩니다.
-한 사람이 여러 설문 조사에 참여할 수 있으며 한 사람이 설문 조사의 특정 질문에 한 번만 답변 할 수 있습니다.

survey_model_02


1
데이터베이스 스키마를 작성하기 위해 어떤 도구를 사용 했습니까?
AndHeiberg

Altova UModel을 사용합니다. 빠르고, 다양한 모델링 구조를 제공하며 거의 모든 형식으로 저장됩니다. 그러나 비용이 든다.
obimod

9
당신은 또한 사용할 수 있습니다 draw.io 그것은 더 가입 / w 및 사용하기 쉬운 무료입니다.
usr4896260

3
우리는 왜 Survey_Question_Answer있고 Answer? 단지가 Answer충분?
Abubakar Ahmad

1
내 생각 Answer, 충분한 Survery_question_answer중복
배트맨

62

내 디자인은 아래와 같습니다.

최신 작성 스크립트는 https://gist.github.com/durrantm/1e618164fd4acf91e372에 있습니다.

스크립트 및 mysql workbench.mwb 파일은 https://github.com/durrantm/survey 에서도 제공됩니다.
여기에 이미지 설명을 입력하십시오


안녕하세요, 저는 디자인이 마음에 듭니다. 테이블에 대한 데이터 샘플 (덤프)이 있습니까? 정말 감사하겠습니다
Emeka Mbah

안녕하세요! 귀하의 작업에 감사드립니다. 템플릿 중 하나에서 계층을 고려 했습니까? 사용자는 일반적으로 리더에 대한 정보를 제공하며이 리더는 리더에 대한 정보 등을 가지고 있습니다. 그리고 사용자는 다른 섹션 (HR, Production)에서 작업하며 계층 구조도 가질 수 있습니다. 따라서보고하는 동안 종종 이러한 조직 수준간에 차이가 필요합니다.
ruedi

@ 마이클 : 정말 도움이됩니다. 스프링을 사용하는 Java에 대한 참조 / github 링크가 있습니까?
Sagar Panda

나는 여전히 차이점 option_groupsoption_choices사용 사례 의 차이점을 찾으려고 노력 하고 있습니다.
PHPnoob

@PHPnoob 이름에서 알 수 있듯이 옵션을 그룹화 한다고 생각합니다 . 예를 들어 1에서 5 사이의 속도로 평가할 수 option_groups있다면 내가 올바르게 얻는다면 정확하게 허용해야합니다.
표시 이름

18

확실히 옵션 # 2, 또한 현재 스키마를 감독 할 수 있다고 생각하면 다른 테이블을 원할 수 있습니다.

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

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

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

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

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

각 질문에는 아마도 사용자가 선택할 수있는 정해진 수의 답변이있을 것이며 실제 답변은 다른 표에서 추적 될 것입니다.

데이터베이스는 많은 데이터를 저장하도록 설계되었으며 대부분 확장 성이 뛰어납니다. 더 이상 공간을 절약하기 위해 더 적은 일반 양식을 사용할 필요가 없습니다.


안녕하세요, 질문이 있습니다. 설문 조사 테이블에 SurveyId가 있거나 설문 조사의 버전 화 시간과 일치하는 타임 스탬프가 없어야합니까? 원래 설문 조사에 질문을 삽입하면 questionId가 변경되고 답변을 식별 할 수 없게됩니다. 또는 중복되는 경우 어떻게 설명 할 수 있습니까?
Shubham

3

일반적으로 사용자가 변경할 수있는 내용 (예 : 설문 조사에 질문 추가)을 기반으로 스키마를 수정하는 것은 상당히 냄새 나는 것으로 간주해야합니다. 특히 많은 양의 데이터를 처리 할 때 적절할 수있는 경우가 있지만 다이빙하기 전에 어떤 정보가 나오는지 알고 있습니다. 각 설문 조사에 대해 "응답"표만 있으면 질문을 추가하거나 제거하는 데 많은 비용이 소요될 수 있습니다 질문에 무관하게 분석하는 것은 매우 어렵습니다.

두 번째 접근 방식이 가장 좋다고 생각하지만 규모가 크게 우려되는 경우 과거에 저에게 도움이 된 것은 하이브리드 방식입니다.

  1. 2에서 설명한대로 질문 당 응답을 저장하기위한 자세한 응답 테이블을 작성하십시오.이 데이터는 일반적으로 애플리케이션에서 직접 조회되지 않지만보고 테이블에 대한 요약 데이터를 생성하는 데 사용됩니다. 이 데이터에 대해 보관 또는 정리 형식을 구현하고 싶을 수도 있습니다.
  2. 필요한 경우 1에서 응답 테이블을 작성하십시오. 사용자가 결과에 대한 간단한 테이블을 보려고 할 때마다 사용할 수 있습니다.
  3. 보고 목적으로 수행해야하는 모든 분석의 경우 1의 데이터를 기반으로 추가 요약 데이터를 작성하도록 작업을 예약하십시오.

이것은 구현하기 위해 훨씬 더 많은 작업 이므로이 테이블이 대규모 문제로 진행될 것이라는 것을 확신하지 않는 한 실제로 조언하지는 않습니다.


1

두 번째 방법이 가장 좋습니다.

더 표준화하려면 질문 유형에 대한 테이블을 만들 수 있습니다.

해야 할 간단한 일은 :

  • 데이터베이스를 배치하고 기본값으로 모두 C가 아닌 자체 디스크에 로그온
  • 데이터베이스가 커지는 동안 일시 정지하지 않도록 필요한만큼 데이터베이스를 작성하십시오.

우리는 SQL Server Table에 수천만 개의 행을 가진 로그 테이블을 가지고 있습니다.


1

2는 괜찮아 보입니다.

열이 4 개만있는 테이블의 경우 수백만 개의 행이 있어도 문제가되지 않습니다. 물론 이것은 사용중인 데이터베이스에 따라 달라질 수 있습니다. SQL Server와 같은 것이면 문제가되지 않습니다.

tblAnswer 테이블의 QuestionID 필드에 색인을 작성하려고합니다.

물론, 사용중인 데이터베이스와 예상 볼륨을 지정해야합니다.


0

간단한 설문 조사를 위해 매우 완벽하게 보입니다. 고객이 텍스트 상자를 통해 의견을 제공 할 수있는 '공개 가치'에 대한 표를 추가하는 것을 잊지 마십시오. 외래 키를 사용하여 해당 테이블을 답변에 연결하고 성능을 위해 모든 관계형 열에 인덱스를 배치하십시오.


1
답변 표에 의견을 넣을 수없는 이유가 있습니까?
Michael

0

2 번이 맞습니다. 성능 문제가 감지 될 때까지는 정확한 설계를 사용하십시오. 대부분의 RDBMS는 좁지 만 매우 긴 테이블에는 문제가 없습니다.


0

큰 응답 테이블 자체는 문제가되지 않습니다. 인덱스와 제약 조건이 잘 정의되어 있으면 괜찮을 것입니다. 두 번째 스키마는 나에게 좋아 보인다.


0

적절한 색인이 제공되면 두 번째 솔루션이 정규화되어 기존 관계형 데이터베이스 시스템에 적합합니다.

나는 얼마나 큰지 알지 못하지만 문제없이 몇 백만의 대답을 유지해야합니다.


0

전체 양식을 JSON 문자열로 저장하도록 선택할 수 있습니다.

요구 사항에 대해 잘 모르지만이 방법은 일부 상황에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.