문제

최근에는 NoSQL 데이터베이스를 탐색하고 있습니다.주어진 문제에 대해 가장 최적이고 효율적인 방식으로 데이터를 저장하는 방법에 대한 조언이 필요합니다.지금은 MongoDB를 목표로 삼고 있습니다.그러나 이는 CouchDB에서도 동일해야 합니다.

다음과 같은 3가지 모델이 있다고 가정해 보겠습니다.

Story:
 id
 title

User:
 id
 name

Vote:
  id
  story_id
  user_id

나는 데이터베이스에 다음과 같은 질문을 할 수 있기를 원합니다.

  • 이 스토리에 투표한 사람은 누구인가요?
  • 이 사용자는 무엇에 투표했습니까?

관계형 DB로 작업하면서 단순 조인을 하고 있습니다.문제는 가장 효율적으로 해당 객체에 대한 데이터를 어떻게 저장해야 하는가입니다.

예를 들어 Vote 개체를 Stories의 하위 컬렉션으로 저장하면 "사용자가 투표한 내용"이라는 정보를 얻기가 쉽지 않습니다.

도움이 되었습니까?

해결책

나는 투표를 이야기 목록으로 저장하는 것을 제안합니다 _id각 사용자에서 s. 그렇게하면 목록을 보면 사용자가 어떤 이야기를했는지 알 수 있습니다. 스토리에 투표 한 사용자를 얻으려면 다음과 같은 작업을 수행 할 수 있습니다.

db.users.find({stories: story_id})

어디 story_id 입니다 _id 문제의 이야기의. 당신이 stories 현장이 두 쿼리 모두 빠릅니다.

다른 팁

  • 쿼리가 문제가 될 때까지 효율적이든 걱정하지 마십시오.
  • 아래 인용에 따르면, 당신은 잘못하고 있습니다

내가 마인드 스위치에 대해 가고있는 방식은 데이터베이스가 AllTogether를 잊어 버리는 것입니다. 관계형 DB 세계에서는 항상 데이터 정규화 및 테이블 구조에 대해 걱정해야합니다. 다 버려라. 웹 페이지를 배치하십시오. 그들 모두를 배치하십시오. 이제 그들을보세요. 당신의 이미 2/3. 데이터베이스 크기가 중요하고 데이터가 3/4보다 복제되지 않아야한다는 개념을 잊어 버리면 코드를 작성할 필요조차 없었습니다! 당신의 견해가 당신의 모델을 지시하게하십시오. 당신은 대상을 가져 가서 관계 세계에서와 같이 더 이상 2 차원으로 만들 필요가 없습니다. 이제 객체를 모양으로 저장할 수 있습니다.

데이터베이스-타타 스토어-타사

자, SQL 설정에서와 같이 정규화 된 데이터 모델을 제공하지 않았습니다.

내 이해에 따르면 당신은 mongodb에서 이것을하지 않습니다. 참조를 저장할 수는 있지만 일반적인 경우에는 성능 이유가 없습니다.

나는 NOSQL 지역의 전문가가 아니지만, 당신은 단순히 당신의 요구를 따르고 스토리 컬렉션의 이야기와 스토리 (IDS)에서 스토리에 투표 한 사용자 (IDS)를 저장하지 않겠습니까? 사용자 컬렉션에서 투표 했습니까?

CouchDB에서 이것은 매우 간단합니다. 하나의 뷰가 방출됩니다.

function(doc) {
 if(doc.type == "vote") {
   emit(doc.story_id, doc.user_id);
 }
}

다른 견해는 다음과 같습니다.

function(doc) {
 if(doc.type == "vote") {
   emit(doc.user_id, doc.story_id);
 }
}

결합이 없기 때문에 둘 다 쿼리가 매우 빠릅니다. 사용자 데이터 또는 스토리 데이터가 필요한 경우 CouchDB는 멀티 문서 페치를 지원합니다. 또한 상당히 빠르며 "가입"을하는 한 가지 방법입니다.

최근 MongoDB와 CouchDB를 많이 조사하고 있지만 통찰력이 제한되어 있습니다.하지만 스토리 문서 내에 투표를 저장하려고 할 때 문서 크기 제한인 4MB에 도달하는 것을 걱정해야 할 수도 있습니다.그렇지 않은 경우에도 문서가 이동될 정도로 문서 크기가 지속적으로 증가하여 쓰기 속도가 느려질 수 있습니다(MongoDB에서 문서 크기가 어떻게 조정되는지 참조).

CouchDB의 경우 뷰 인덱스가 계산되면 이러한 종류의 작업은 매우 간단하고 우아하며 매우 빠릅니다.그러나 개인적으로 나는 데이터베이스가 증가하고 뷰 인덱스가 증가함에 따라 상당한 정도로 속도가 점진적으로 느려지는 것을 보여주는 벤치마크 때문에 CouchDB에서 유사한 프로젝트를 수행하는 것을 주저했습니다.데이터베이스 크기가 증가함에 따라 CouchDB 성능을 보여주는 최근 벤치마크를 보고 싶습니다.MongoDB나 CouchDB를 사용해 보고 싶지만 SQL은 여전히 ​​매우 효율적이고 논리적이므로 프로젝트가 유혹에 딱 맞을 때까지 계속 사용할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top