2010-08-02 5 views
1

나는 폴링과 사용자를 모델링하는 관계형 데이터베이스 스키마를 디자인하려고 여기에있다. 각 카테고리에는 하나 이상의 질문이있을 수 있습니다. 각 사용자는 각 카테고리에 한 번만 참여할 수 있으며 각 질문마다 번을 정확히 한 번 폴링 할 수 있습니다. 각 여론 조사는 예, 아니오 또는 기권 (투표 안 함)입니다.더 나은 관계형 DB 스키마에 대한 제안

나는 네 개의 테이블 내 스키마를 설계했다 :

users, [userId, IP] 
category, [catId, catTitle] 
question, [queId, queTitle] 
polls [pollId, queId, userId, answer] 

가 좋든

users, [userId, IP] 
category, [catId, catTitle] 
question, [queId, queTitle] 
polls [pollId, catId, userId] 
pollAnswers [pollAndId, queId, pollId, answer] 

내가 더 나은 이유는 어느 알고 싶습니다?

내가 dun이 설문 조사에 대한 추가 정보를 갖고 있기 때문에 나는 사용자와 대답에 직접적으로 합류합니다. .. 나는 또한에 대한 기권 얼마나 많은 사용자를 찾을 필요합니까) 모든 카테고리 질문 B)를 특정 범주에 c

) 특정 질문

내가 선택 한 스키마에 대한 나의 관점이 있습니다.

select U1.*, Q1.*, P2.*, C1.* 
from 
    (users U1, 
    questions Q1) 
    Left outer Join polls P2 on 
     Q1.queId = P2.queId AND U1.userId = P2.userId 
    Left Outer Join category C1 on 
     Q1.catId = C1.catId 

위의 쿼리를 사용하여 사용자 간 상호 조인에 대해 걱정하고 있습니다. 질문을하면 성능이 떨어지나요?

두 번째 스키마가 더 좋은 경우 내 결과에 대한 옵션을 제안 할 수 있습니까?

+1

이 정말 스키마를 도움이되지 않습니다,하지만 난 생각 축약 된 필드 이름은 끔찍합니다. 또한 각 필드 이름의 접두어에 테이블의 이름을 사용하는 이유는 무엇입니까? 왜 사용자 (id, ip), 질문 (id, body), 설문 조사 (id, question_id, user_id, answer)가 아닌가? –

+0

약식 필드 이름을 제거하기위한 제안 사항은 없습니다. 다음 번에 내가 "당신의 스키마에 도움이되지 않습니다."라는 말을 듣게됩니다. – KoolKabin

+0

접두어를 제거하면 스키마가 도움이되지 않지만 더 쉽게 읽을 수 있습니다. 그리고 "dun"대신 "do not"를 사용해야합니다. – User123342234

답변

0

사용자 : OK

질문 : 범주를 너무 모든 엔티티가 단수 사용자 이름을 변경 (또는 복수의 단수형의 이름을 변경)

을 당신은 질문에서 카테고리

pollAnswers에 외래 키가 필요합니다 : pollAnswer로 이름을 바꾸고 3 행이있는 참조 표로 만듭니다. 예, 아니오, 기권

polls : 폴링 할 이름 바꾸기 : 사용자, 질문 및 외래 키를 사용하여 질문을 폴링하는 사용자의 트랜잭션으로 만듭니다. pollAnswer.

(옵션 : 사용자가 카테고리의 질문에 대해 기존 설문 조사를하지 않았 음을 확인하거나 카테고리에 대한 질문의 외래 키를 사용하여 PollAnswers를 비정규 화하고 사용자/질문에 고유 제한을 설정하십시오. 개인적으로 좋아하지 않습니다. 당신이 질문의 카테고리를 변경하면이 문제를 제시하기 때문에이 옵션)

그런 다음 특정 카테고리에 대한 쿼리는 다음과 같이 수 :.

select * 
from category c 
LEFT OUTER JOIN question q ON q.catID = c.catID 
LEFT OUTER JOIN poll p ON p.queId = q.queId 
LEFT OUTER JOIN user u ON u.userId = p.UserID 
WHERE c.catID = 'blah blah' 
관련 문제