2011-08-20 3 views
3

지금은 복잡한 퀴즈 앱용 데이터베이스 (mysql) 스키마를 디자인하고 있습니다. 나는 지금 질문의 단계에 있으며, 테이블 디자인으로 조금 고투한다. 여기에 지금까지 가지고 무엇을 : 아이디어는 작업 테이블은 단지 몇 가지 기본적인 정보와 작업을 처리하는 방법을 결정하는 유형 필드를 가지고 있다는 것입니다복잡한 퀴즈 앱을위한 데이터베이스 디자인은 무엇입니까?

 
task 

id type  etc. 
1 mpc 
2 text-input 
3 matching 
4 fill-gaps 

task_to_question 

task_id  question_id 
1   10 
2   20 
3   30 
3   31 
3   32 
4   40 

answer_set ->(task_to_question) 

id question_id answer_id correct 
1 10   100   1 
2 10   101   0 
3 10   102   0 
4 10   103   0 
5 20   100   1 
6 20   200   1 
7 30   100  (1) 
8 31   300  (1) 
9 32   301  (1) 
10 40   100   1 
11 40   400   1 
12 40   401   1 


addon 

answer_set_id gap_number 
10    1 
11    1 
12    2 

질문입니다. 모든 작업이 동일한 테이블에 있습니다. 모든 작업에는 유형에 따라 하나 이상의 질문 (task_to_question)이 있습니다 (예 : mpc에는 하나의 질문이 있지만 질문 및 답변과 일치해야하는 작업에는 네 가지 질문이 있습니다. 똑같은 맥락에서 모든 질문은 복수 응답 (answer_set)을 가질 수 있습니다. 특히 하나 또는 두 단어의 텍스트 입력에 특히 중요합니다. 따라서 작업 유형 내에서도 질문과 답변의 수는 유동적입니다. 물론 이것은 나중에 제한 될 수 있으며 서브 타입도 추가 될 수 있습니다. 마지막 테이블은 작업 유형을 간단한 필드 유형으로 처리 할 수없는 경우에만 조인됩니다. 이 예에서는 "텍스트의 간격 채우기"작업에서 간격의 순서를 정의해야합니다. 이것은 하나의 addon-table이거나, 오버 헤드를 줄이기 위해 다른 작업 유형을위한 여러 테이블 일 수 있습니다.

가능한 한 많은 텍스트 문자열을 재사용하려고했습니다. 그래서 저는 mpc, input, fill-the-gap 및 부분적으로 일치하는 작업에 대해 동일한 질문 - 텍스트 및 동일한 답변 문자열을 가질 수 있습니다. 마찬가지로, 중복을 통해 정렬하지 않고도 자동 완성 필드에 대한 제안을 수집하는 것이 쉬울 것이라고 생각합니다.

그러나 생각해 보면 실제로는 너무 혼란 스럽다고 생각합니다. 이미 볼 수있는 문제는 예 : 질문에 옳고 그름이있을 때 이미 중복성이 있습니다. 정확한 열이 중복됩니다. 그리고 다른 질문 유형을 추가하더라도 내 대답은 varchar 여야합니다. 그리고 나서 어쨌든 매우 다른 작업 유형이있을 때 더 많은 테이블에 가입해야 할 수도 있습니다. 처음부터 별도의 테이블을 사용하지 않는 이유는 무엇입니까? 이것은 기본적으로 일리아에서 어떻게 이루어 졌는지입니다. 모든 유형의 테이블을 제거하는 것이 큰 이점입니까? 그런 다음 또 다른 모델 대신 모든 작업 유형에 대해 모든 처리기를 가져야하는 작업 모델 만 갖습니다.

와우는 많은 텍스트였습니다 ... 음, 전체를보기 위해 그것을 적어 두어야했습니다. 아직도 그것을 처리하는 방법을 확실히 모르겠습니다. 입력 기꺼이 감사!

편집 : 또 하나 ... 나만인가, 아니면 answer_set 테이블이 question_id를 참조하는 것이 이상한가? 그것이 올바른 방법인가요?

답변

0

일반적인 제안은 특정 답변이 아닌 생각이므로 찾고 있습니다.

작업과 질문 사이의 다 대다가주의 깊게 고려해야한다고 생각하십시오. 이 접근법에 대해 몇 가지 우려 사항이 있습니다. * 특정 작업의 컨텍스트에서 질문을 편집하려고하면 실수로 다른 작업에 대해 질문이 유효하지 않을 수 있습니다. * 문맥 (작업)을 기준으로 답변이 다를 수 있습니다. * many-to-many의 추가 오버 헤드는 문자열 재사용으로 인한 세척 일 수 있습니다.

테이블을 하위 유형으로 입력 할 필요가 있는지에 대해 충분히 알지 못하기 때문에 그 사실을 말할 수는 없습니다.

관련 문제