2013-08-18 2 views
0

Yahoo 또는 &과 유사한 웹 사이트를 만들려고합니다. 다른 카테고리 나 경쟁 업체가 아닌데,이 시점에서 붙어있어 정말 도움이 될 것입니다. 내가 MongoDB를 처음 접했을 때 너희들에게서.(MongoDB) 데이터베이스 구조

나는 Node.js와 MongoDB에서 Express 프레임 워크를 사용하고 있습니다.

문제는 사용자와 질문/답변 데이터를위한 데이터베이스를 구성하는 가장 효율적인 방법을 찾는 것입니다.

현재 질문 모델이 있습니다. 내부에는 각 카테고리에 대한 문서가 있습니다. 우리가 쉽게 객체의 생성 시간을 기준으로 문제를 검색하고 적절하게 가져올 수있는 질문을 표시하는 것은 매우 쉽게 이런 식으로

math{ 
    OpenQuestions{ 
     'x+2=5, whats x?' : { 
      asker: 'peter', 
      likes: 12, 
      answers: { 
       'x is 3' : { 
        answerer: 'john', 
        likes: 25 
       }, 
       'x is 2' : { 
        answerer: 'MATHSUX', 
        likes: 0 
       } 
      } 
     } 
    } 
    ClosedQuestions{ 
     //same as OpenQuestions 
    } 
} 

: 아래에 설명 된대로 각 문서는 질문 자체에 대한 답변 및 기타 정보를 포함 주요 질문 페이지. 그러나

사용자가 자신이 질문 한 질문을보고 싶어하면, 내가 생각할 수있는 유일한 방법은 각 subject.OpenQuestions.QuestionItSelf.asker를 통과하고, 사용자 자신의 경우, 모든 객체가이 사용자 이름과 일치 가져 오기 확인한다 , 엄청난 계산이 될 것입니다. 훨씬 더 좋은 방법이 존재한다고 확신합니다. 모두 어떻게 생각하니?

+0

나는 당신이 주제 당 문서의 16meg 이상을 가지려고한다고 말하기는 안전하다고 생각하므로 삽입하지 마라. – Sammaye

답변

1

MongoDB의 문서 당 제한은 16MB입니다. 또한, MongoDB는 크기가 커지는 문서가있을 때 매우 잘 동작하지 않습니다. 성능상의 이유로 MongoDB는 문서를 하드 드라이브의 인접한 섹션에 보관하려고하므로 문서가 커지면 하드 드라이브 공간을 끊임없이 재 할당해야합니다.

이러한 이유로 모든 질문을 단일 문서에 저장하는 것은 좋지 않습니다.

질문 모음을 만들고 각 질문에 대해 별도의 문서를 만드는 것이 좋습니다. 검색 성능을 높이려면 적절한 indices을 만들 수 있습니다.

안녕하세요. : MongoDB가 프로젝트에 적합한 도구인지 잘 모르겠습니다. 응용 프로그램은 매우 관계 성이 좋으며 MongoDB의 문서 지향 개념의 이점을 누릴 수있는 것과는 다릅니다. 반면에 계층 적 사고 방식은 Redis 철학과 더 잘 어울립니다. 그러나 그것은 단지 주관적인 의견 일뿐입니다.

1

먼저 질문을 키로 삼는 것이 좋습니다. question 속성을 만들고 해당 속성의 값을 질문의 텍스트로 지정하십시오. MongoDB는 키 값을 쿼리하는 도구가별로 없습니다. 거의 모든 것은 $exists이며 와일드 카드도 지원하지 않습니다. 답안 텍스트를 키로 사용하는 대신 각 답마다 똑같은 작업을 수행하고 answer 키를 사용하고 값의 텍스트를 답안 텍스트로 사용하십시오.

다음으로 모든 질문을 하위 문서로 유지할 이유가 없습니다. 상태를 문서 속성 (상태 : '열림'또는 상태 : '닫힘'또는 상태 : '응답했지만 닫히지 않음')로 이동할 수 있습니다. 상태를 사전 계산할 필요가 있다면 - 서브 - 문서로서 응답을 갖는 것이 더 합리적 일 수 있으며, 그러면 응답의 상태에 기초하여 상태를 도출 할 수 있습니다 (즉, 질문에 어떤 대답이라도 대답이없는 것처럼 표시됩니다. 답변이 있지만 아무 것도 해결책으로 표시되지 않은 경우 대답은되었지만 해결되지 않았습니다. 해결책으로 표시된 답변이 있으면 닫힙니다.

그런 다음 주제가 각 주제에 대한] 렉션과 반대되는 질문의 속성이되도록하십시오. 당신은 그 애 스커에 대한 질문을 찾는 것은 이 가

db.questions.find({asker: 'John'}, {question:1, _id:0}) 
가 가 요한

를 요청했습니다 모든 질문의 텍스트를 표시합니다

문서 구조의 질문에 수집 될 것입니다 귀하의 최종 스키마가 보이는 쉽게

같은 것을 할 경우 이런 식으로 :

{ 
     question: 'x+2=5, whats x?' 
     asker: 'peter', 
     likes: 12, 
     subject: 'math', 
     answers: [ 
      { answer: 'x is 3', answerer: 'john', likes: 25, solution: true }, 
      { answer: 'x is 2', answerer: 'MATHSUX', likes: 0} 
     ], 
     status: 'solved' 
    }