2014-12-13 4 views
1

나는 관계형 데이터베이스 배경에서 왔으며 NoSQL 데이터베이스 (또는 JSON 객체)에서 관계형이었던 데이터를 저장하는 방법을 고민하고있다.MongoDB를위한 JSON 데이터를 구성하는 가장 좋은 방법

제 질문은, 마을에 관한 데이터를 어떻게 저장합니까? 각 마을에는 사용자가 붙어 있으며 각 마을마다 X 좌표와 Y 좌표가 있습니다. 다음과 같이 개체가 표시됩니다.

var map = [{ 
    x: 1, 
    y: 1, 
    terrainType: land, 
    village: { 
    mayor: jragon, 
    population: 150, 
    gold: 100, 
    iron: 25, 
    garrason: { 
     archers: 4, 
     knights: 1 
    }, 
    buildings: { 
     smith: { 
     level: 4, 
     upgradeFinish: false; 
     }, 
     mill: { 
     level: 2, 
     upgradeFinish: 'some date/time...' 
     } 
    } 
    } 
}]; 

그러나 실제로 볼 수 있듯이 다소 혼란 스러울 수 있습니다. 일부 mongoose 도우미를 사용하여 데이터를 쿼리 할 때 도움이 될 것 같아요.

이 개체를 사용하더라도 관계의 일부 측면은 여전히 ​​있습니다. map.village.mayor는 다른 컬렉션의 사용자를 나타냅니다.

지도 수집은 매번지도를 그리는 데 사용됩니다. 지도를 그릴 때 마을이 어떤 수준으로 사용할 타일을 결정합니다.

죄송합니다. 분명히하지 않은 경우 죄송합니다.

+1

근본적으로 잘못된 디자인은 없습니다. 시장은 일반적으로 "사람들"컬렉션에 문서의 ID로 저장되지만, "결합"과 같은 조작 및 다중 DB 액세스 또는 특수 쿼리를 피하기 위해 시장에 대해 필요한 일부 정보가 저장 될 수도 있습니다 직접 마을 테이블에. –

+0

오케이. 사용자에게 연결된 모든 마을을 찾고 싶다고 가정 해보십시오. 일반적으로 user_id에있는 village 테이블에 가입합니다. 그러나 여기서 map.village.mayor = user_id 인 객체를 검색 하시겠습니까? 3 가지 개별 컬렉션을 갖는 것이 가장 좋습니다. 사용자,지도 및 마을? 그런 다음 psudo-join 명령을 수행합니까? – Jragon

답변

1

MongoDB에서 훌륭한 스키마 디자인을 사용하려면 자주 수행해야 할 요청에 대해 실제로주의해야합니다.

  • 귀하의 요청을해야한다 (... 아니 거래, 문서 수준의 자성이, 실제 참여하지 않음)

    • 귀하의 요청을 MongoDB를의 한계에 대한 올바른합니다 :

      마음에 걸릴 여러 가지가 있습니다 이상적으로는 코드 작성이 간단해야합니다.

    • 인덱스를 올바르게 사용할 수 있어야합니다. 각 요청에서 색인을 사용하여 깔끔한 데이터를 읽을 수 있다면 훨씬 좋은 결과를 얻을 수 있습니다.
    • 키의 이름은 각 문서에 복제됩니다. 이름을 짧게 할 수도 있지만 자동으로 또는 전혀하지 않겠습니다.

    배우고 싶다면 적어도 Rick Copeland의 "MongoDB Applied Design Patterns"책의 절반을 권할 것입니다. 귀하의 질문과 맥락이 너무 커서 stackoverflow에 적합하지 않을 수 있습니다.

  • +0

    상식은 그렇게 일반적이지 않습니다. –

    +0

    @Gabe Rainbow : 나는이 주석에서 내가 말한 것을 번역 할 수 있을지 모르겠다. 그러나 "나는 말하지 않고 간다."라고 말한 사람의 교훈을 배우려고 노력했다.;) – dotpush

    +0

    @ 가브리엘 레인보우 : 그리고 나는 방금 [상식은 그리 관용적이지 않다] (http://en.wikipedia.org/wiki/Wikipedia:Common_sense_is_not_common) 영어로 보았다. 확실히 당신이 말한 증거! – dotpush

    관련 문제