2010-11-30 4 views
0

저는 두 개의 스키마를 가지고 놀고 있는데 어느 것이 더 확장 성이 좋은지 결정할 수 없습니다. 이 스키마는 Q & A 용이며 MySQL에 내장되어 있습니다. 사람들은 질문/답변 및 좋아요/싫어하는/좋아하는 질문 및 답변을 게시합니다. 질문에는 여러 가지 답변/좋아요/싫어요가있을 수 있으므로 답변을 드릴 수 있습니다. 두 스키마 중 어느 것이 더 확장 성이 있습니까?

두 스키마 조인의 같은 번호가 필요합니다 사용자에게 질문을 읽으려면,하지만이 다르게 처리됩니다 조인 :

스키마 1

questions(id, title, body, userId) 
questionLikes(id, questionId, userId) 
questionDislikes(id, questionId, userId) 
quetionComments(id, questionId, body, userId) 
answers(id, questionId, body, userId) 
answerLikes(id, answerId, userId) 
answerDislikes(id, answerId, userId) 
answerComments(id, answerId, userId, body) 
favourites(id, questionId, userId) 

이 개발 쉽게, 더 정규화에게 를위한, 그러나 확장 성? 반복되는 정보가 많은 것 같습니다. 다음은 질문 (우리가 그와 같은/싫어하는 활동을 포함 할) 사용자에게 있습니다 잡기 위해 순서를 가입

select question 
join answers 
join questionLikes 
join questionDislikes 
join questionComments 
join favouites 
join answers to answerLikes 
join answers to answerDislikes 
join answers to answerComments (multiply answer joins by number of answers) 

스키마 2

posts(id, postTypeId, userId, title, body) 
postTypeId(id, postType) 
comments(id, postId, userId) 
votes(id, voteTypeId, userId) 
voteTypeId(id, voteType) 

이 덜 정규화 된 컴팩트 그것처럼 보인다 자체 조인 및 기타 개발 문제 (조건부 유효성 검사)를 사용하여 목에 고통이 더 잘 확장 될 수 있습니다. 질문을 잡기위한 가입 순서는

select question and its answers in the same read using where @id for question, and @questionId for answers; each row, join the following: 
join votes on as likes on voteType 1 
join votes as dislikes on votetype 2 
join comments 
join favouites (multiply joins by number of rows) 

그래서 더 나은 확장 기능은 무엇입니까? 조인이 필요 없도록 몇 개의 필드를 추가하여 저장할 수 있다는 것을 알고 있습니다. 하지만 둘 다 같은 수의 조인이 필요하며 마음을 가릴 수 없습니다.

+0

질문을 많이 읽지는 ​​않았지만 왜 questionLikes와 questionDislikes에 대해 2 가지 다른 테이블을 사용합니까? 그리고 나는 같은 말을 당신에게 더 적용 할 수 있다고 생각한다. –

+0

질문과 대답은 서로 다른 객체이므로 동일한 ID를 가질 수 있습니다. – Mohamad

답변

1

나는 2보다 더 멀리 나아갈 것이다. 문제는 모델의 엔티티는 무엇인가? 답변 : 사용자 및 게시물. 게시물은 질문, 답변, 투표, 댓글 등이 될 수 있지만 항상 게시물입니다. 따라서

posts(id, postTypeId, userId, title, body) 
postTypeId(id, postType) 

은 BTW, 당신이 언급 선택의 모두 모든를 검색 (또는 그들은 단지 최악의 조인을 표시했다?).

나 자신이 한 번에 자신의 질문 자신의 답변 자신의 의견 ... 모두를 가져 오는 볼 것이다. 어떤 유스 케이스가 그런 모든 것을 요구할 것인가?

+0

smirkingman, 고마워요! 내가 의미하는 바는 질문을 탐색하는 모든 사용자에 대해 질문을 얻고 싶습니다. 대답, 질문의 좋아요/싫어요 및 각 답변 (해당 숫자는 비정규 화 될 수 있음)이었습니다. 그러나 사용자가 로그인하여 질문/답변에 투표 한 경우, 투표 한 곳에서 투표를하거나, 질문에 답변하거나, 해당 질문에 속한 답변을 얻어야합니다. 실제로 StackOverFlow와 다른 것은 아닙니다. 나는 그것이 의미가 있기를 바랍니다. – Mohamad

+1

필자가 제안하는 모델을 사용하면 "select count (*) from post innertype posttype = vote"옵션을 쉽게 사용할 수 있습니다. 그러나 나는 아직도 당신의 질문에 대답하지 않는다고 생각합니다. 어쩌면 달성하려는 결과를 설명 할 수 있습니다. "질문에 대한 답변, 좋아요/싫어함 및 각 답변에 대해 무엇을하고 싶습니까? (이 숫자는 비정규 화 될 수 있습니다") – smirkingman

+0

질문/답변에 포함 된 좋아요/싫어요/대답의 수를 표시하고 싶다면, 게시물 테이블에서 추가 열을 사용하고 콜백을 통해 업데이트 할 수 있습니다.그렇게하면 계산에 조인이 필요하지 않습니다. 그러나 로그인 한 사용자 인 경우 & 질문 및 답변을 볼 때 이전에이 질문/답변에 대해 내가 좋아하거나 싫어했는지 알고 싶을 수 있습니다. Qs와 @userId에 대한 좋아요/싫어요 테이블에 가입해야합니다. (일종의 upmod/downmod 여기처럼). 확장 성 측면에서 볼 때 테이블 (게시물/득표) 또는 테이블 (질문/답변/질문 좋아요/싫어요) 등 여러 가지 정보를 가지고있는 것이 더 좋습니다. – Mohamad

관련 문제