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

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

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

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

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

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

    간단한 예 :

    tblSurvey : SurveyID

    tblQuestion : QuestionID, SurveyID , QuestionType, 질문

    tblAnswer : AnswerID , UserID , QuestionID , 답변

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

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

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



답변

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

-하나의 설문 조사에는 많은 질문이있을 수 있습니다. 하나의 질문은 많은 설문 조사에서 (재) 사용될 수 있습니다.

-많은 질문에 대해 하나의 (사전 제작 된) 답변을 제공 할 수 있습니다. 하나의 질문에는 많은 답변이 제공 될 수 있습니다. 질문은 다른 설문 조사에서 다른 답변을 제공 할 수 있습니다. 설문 조사마다 다른 질문에 대한 답변을 제공 할 수 있습니다. 기본 “기타”답변이 있습니다. 사람이 다른 것을 선택하면 답변이 Answer.OtherText에 기록됩니다.

-한 사람이 여러 설문 조사에 참여할 수 있으며 한 사람이 설문 조사의 특정 질문에 한 번만 답변 할 수 있습니다.

survey_model_02


답변

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

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

스크립트 및 mysql workbench.mwb 파일은 https://github.com/durrantm/survey 에서도 제공됩니다.

여기에 이미지 설명을 입력하십시오


답변

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

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

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

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

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

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

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

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


답변

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

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

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

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


답변

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

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

해야 할 간단한 일은 :

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

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


답변

2는 괜찮아 보입니다.

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

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

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


답변

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