2009-04-14 5 views
2

참고 :이 좋아되지 않습니다 this question설문 조사 데이터를 구조화하는 방법은 무엇입니까?

어떻게 저장하는 등

내 질문은 우리의 고객 서비스 사람들이 우리의 서비스에 대해 고객으로부터 정보를 얻을하는 데 사용할 수있는 설문 조사를 구성하는 임무를 봤는데

질문/질문은과 같이 저장되어있는 DB에서 답 :

  • 부울 question1
    • 경우 (거짓) : 문자열 question2 (일반적으로 REA) question1이 왜 거짓 아들

이, 그러나 질문이 중첩 될 수있는 여러 수준의 쉬운 것입니다 :

  • 부울 question1
    • (false)를 부울 question2 경우
      • if (true) string question3
      • 경우 I는 DB에 저장하지 않은 경우, 나는이 복합으로 질문 (실제로 전체 조사)를 나타냅니다,하지만 난 것이다

(false)를 문자열 question4 어떻게 내가 그런 식으로 저장할 지 모르겠다.

답변

3

질문이 그래프가 아닌 트리를 구성하는 경우 represent hierarchical data in sql의 일반적인 두 가지 방법이 있습니다.

인접 목록 모델 모델은 어린이 (어린이의 어린이 ...)를 찾기 위해 반복되는 자체 조인이 필요합니다. Hibernate와 같은 ORM을 가지고 있다면, ORM은 질문과 그 자식 응답을 되 돌리는 데 충분한 자체 조인을 처리합니다. ORM을 사용하지 않으면 쿼리에 자체 조인을 동적으로 추가하거나 이전 결과 집합의 각 행에 대해 하나씩 여러 쿼리를 수행해야합니다.

일반적으로 Joe Celko에 기인 한 중첩 세트 모델을 사용하면 한 번에 전체 트리를 가져올 수 있습니다. 그러나 노드 추가 및 삭제가 더 복잡하고 모든 행을 업데이트해야한다는 의미입니다.

인접 목록에는 (id, question text, id_next_if_true, id_next_if_false)과 같은 질문 표가있을 수 있습니다. 이것은, parent_id를 보관 유지하는 아이 대신에, 부모가 2 개의 아이의 ID, 또는 null를 보관 유지한다는 점에서, 고전적인 근사 목록을 벗어납니다.

+0

질문이 거의 변경되지 않기 때문에 중첩 세트 모델이이 상황에서 더 나은 선택 일 수 있습니다. 또한 노드 업데이트에 대한 세부 정보를 처리하는 코드를 보았습니다. 그것은 어렵지 않습니다. – MadCoder

+0

중첩 세트가 아마도 더 좋을 것입니다. 특히 동의하지 않습니다. 그러나이 경우에는 두 가지 이상의 답을 추가 할 수 있다는 점을 싫어합니다. – tpdi

1

는 내가 같은 것을 할 것이라고 생각 :

Table: Questions 
int id 
string question 

Table: Question Answer Map 
int questionId 
bool answer 
int nextQuestion 

대신 부울의 질문에 여러 선택하면, 당신은 당신의 대답을 int로, 문자 또는 문자열을 사용할 수 있습니다.

+0

저는이 구조를 여러 번 사용했습니다. 네가 nextQuestion을 의미한다고 생각해. – DancesWithBamboo

+0

좋은 눈을 가져 주셔서 감사합니다. 테이블 정의를 편집했습니다. –

관련 문제