2009-11-19 1 views
4

온라인 설문 조사를 진행 중입니다. 대부분의 질문은 답변에 대해 1-5의 척도를가집니다. 설문 조사에 질문을 추가해야하는 경우 간단한 표 형태의 웹 양식을 사용하여 해당 표에 INSERT를 수행합니다. 설문 조사가 새로운 질문을하고 있습니다. 새로운 코드가 없거나 데이터베이스 구조가 바뀌 었습니다.다른 데이터 유형의 답이있는 설문 조사를위한 SQL 디자인

다른 데이터 유형의 답을 가질 수있는 설문 조사 질문을 추가해야합니다. 스펙은 설문 조사를 '구성 가능'하게하여 미래의 어떤 시점에서, "{텍스트 응답 질문}, {1-5 질문}, {진정한 거짓 질문}을 묻는 새로운 설문 조사가 필요합니다. , {날짜 답을 묻는 질문} "과 같이 데이터베이스 구조를 변경하지 않고 할 수 있습니다.

나는 그 답을 저장하는 가장 좋은 방법을 생각하려고 노력하고 있지만, 내가 생각해내는 모든 방법은 어느정도 해킹 된 것처럼 보인다.

일부 질문에는 예/아니요 또는 참/거짓 대답이있을 수 있으며 일부는 정수 답변 ("지난 달에 몇 번 기술 지원을 사용 했습니까?") 일 수 있으며, 다른 대답에는 날짜가있을 수 있습니다. 문자열, 단일 값이있는 객관식, 다중 값이있는 객관식 또는 때로는 특정 대답 값으로 하위 질문이 표시 될 수 있습니다 ("실망한 이유는 무엇입니까?")

간단한 해결책은 각 질문을 설문지의 한 열에, 설문지의 답변을 설문지로, 설문지의 열로 물을지 여부를 결정하는 것입니다. 이것은 나에게 엉망인 것처럼 느껴진다. 그것은 큰 테이블이다. 매우 '관계형'이 아닙니다.

브레인 스토밍은 각 응답 유형마다 다른 표를 사용하는 것이 가장 좋은 방법이지만 데이터 무결성 문제가 발생하기 쉽습니다. 즉, 내가 위의와

CREATE TABLE `Questions` (...); 
CREATE TABLE `TrueFalseAnswers` (...); 
ALTER TABLE `TrueFalseAnswers` 
    ADD CONSTRAINT `TrueFalseAnswers_ibfk_1` FOREIGN KEY (`question_id`) 
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 
CREATE TABLE `TextAnswers` (...); 
ALTER TABLE `TextAnswers` 
    ADD CONSTRAINT `TextAnswers_ibfk_1` FOREIGN KEY (`question_id`) 
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

한 가지 문제가있을 것입니다 내가 적어도 오직 하나의 대답은 혼자 DDL의 모든 질문에 대한 존재 보장 할 수 있다는 것입니다.

또 다른 해결 방법은 질문 테이블의 대답에 대한 이진 또는 문자열 열을 갖고 모든 대답을 일부 문자열 또는 이진 형식으로 인코딩 한 다음 응답 열에 저장하는 것입니다. 그러면 모든 질문에 대해 적어도 하나의 대답 만 나오지만 SQL 쿼리에서 집계 기능에 액세스 할 수 없게됩니다. 이것은 매우 '관계형'솔루션이 아니라는 의미에서 나를 강타합니다.

그래서 위에서 설명한 아이디어에 문제가 있습니다. 이 문제를 해결할 수있는 최선의 방법이 있습니까?

나는 문제와 생각을 말로 표현할 시간을 가졌으므로, 내가 생각하는 광범위한 문제는 "코딩을하지 않고 임의의 유형의 데이터를 저장하고 싶습니다."라고 생각합니다. "이것은 희망이 없는가?

MySQL을 사용하고 있으므로 다른 RDBMS가 액세스 할 수있는 권한이 없습니다.

+0

http://stackoverflow.com/questions/1764435/database-design-for-a-survey – Anton

+0

데이터 유형에 대한 스트레스가 없습니다. 모든 텍스트를 만들고 코드에서 파싱합니다. – Shawn

+0

네, 모든 텍스트를 만들면 쿼리가 덜 효율적이게됩니다. 날짜에 대한 대답이 있다고 가정하고 날짜 범위 쿼리를 수행하려고합니다. 심각한 코딩! 그러나 응답이 날짜 열 유형에 저장되어 있으면 날짜 범위 쿼리에 문제가 없습니다. – user151841

답변

7

응답 유형을 지정하지만 답변을 텍스트로 저장하는 열을 사용하십시오. 응용 프로그램이나 프런트 엔드는 answer_type 열을 사용하여 최종 사용자에게 표시 할 내용 (테스트 상자, 라디오 단추, 날짜 선택 도구)과 데이터베이스에 다시 보내기 전에 유효성을 검사하는 방법을 결정할 수 있습니다.

+1

이것은 소프트웨어의 Questionnaire 시스템이하는 일이며, 정상적으로 작동합니다. Randolpho가 말했듯이 정상적인 관계형 데이터베이스를 사용하는 완벽한 솔루션은 없으며이를 해결하는 것은 좋은 코드입니다. –

2

QuestionType 클래스에 해당하는 QuestionType 테이블을 만들려고합니다. 사용자가 작성한 영구 응답을 자유 형식 텍스트로 허용하고 질문 유형까지 두어 응답의 의미를 결정합니다.

그렇다면 참/거짓이면 답이 'T'또는 'F'일 수 있습니다.

객관식 인 경우 대답은 선택한 선택의 색인이 될 수 있습니다.

사용자가 입력하는 텍스트 상자 인 경우 입력 한 텍스트를 저장하십시오.

2

나는 "코딩을하지 않고 임의의 유형의 데이터를 저장하고 싶습니다 ..."라고 말하고 있습니다.

네, 꽤 있습니다. 당신이 제기하고있는 문제에 대한 "좋은"해결책은 없습니다.

(가 다수의 선택 인 경우) 질문 가능한 답변을 저장

질문 테이블과를 저장하는 질문 유형

응답 테이블 : 데이브 Swersky 래리 루 스틱이 그것을 설명한 바와 같이 "최고는" 질문에 대한 답 (FK to Question Table), 텍스트로 일련 화. Varchar (4000) 또는 TEXT 데이터 유형입니다. 절대적으로 필요한 경우가 아니면 전자가 바람직합니다.

질문에 지정된 유형에 따라 값의 의미를 결정하는 것은 애플리케이션 로직에 달려 있습니다.

0

또한 정수, 날짜, 문자열 등의 테이블을 지정할 수 있도록 지정된 데이터 테이블을 사용할 수도 있습니다. 거기에서 1 개의 응답 테이블이 질문 (테이블)을 적절한 dataType 테이블 + 기본 키에 연결합니다.

모든 질문에 대한 개요를 하나의 답변과 함께 표시하려면 모든 데이터 유형을보기 내에서 텍스트로 변환하여 그 위에보기를 만들 수 있습니다.

관련 문제