(MongoDB) Model RelationShip Between Documents

<1:1 관계 with Embedded Documents>


MongoDB는 flexible schema를 가진다. 


<Pattern>

예) 후원자와 주소관의 관계

{
 _id : "joe",
 name : "Joe Bookreader"
}

{
 patron_id : "joe",
 street : " 123 Fake Street",
 city : "Faketon",
 state : "MA",
 zip : "12345"
}


만약 주소 데이터가 name정보에 의해 자주 참조된다면, 애플리케이션은 여러번의 쿼리를 날리게 된다.
그러므로 더 나은 데이터 모델은 patron 데이터 안에 address 데이터를 embed하는 것이다.

{
 _id : "joe",
 name : "Joe Bookreader',
 address : {
              street : " 123 Fake Street",
              city : "Faketon",
              state : "MA",
              zip : "12345"
              }
}

위는 1번의 쿼리로 불러오게 된다.

<1 대 다 관계 with Embedded Documents>



<Pattern>

다음 예는 후원자와 여러 주소들간의 관계를 나타낸 것이다.
다음 예는 참조에 의한 embedding의 이점을 보여준다.



만약 애플리케이션이 name 정보에 의해 주소를 빈번히 호출한다면, 애플리케이션은 multiple queries 를 날려야 한다. 
그러므로 최적의 스키마는 embed한 다음과 같이 한다.



위와 같이 하면 1번의 쿼리만 날리게 된다.


< 1 대 다 관계 with Document References>



<Pattern>

예 ) 퍼블리셔와 책의 관계이다.


다음에는  반복되는 퍼블리셔 정보 호출을 피하게 해주기 위해 퍼블리셔 정보를 책 collection 과 seperate시킨다.
만약 퍼블리셔 당 책들의 숫자가 작거나 제한된 숫자인 경우라면, 퍼블리셔 도큐멘트에 책 레퍼러느를 넣는 것은 유용한 방법이다.
그렇지 않고 만약 퍼블리셔당 책들의 넘버가 unbounded되면 , 이 데이터 모델은 변할 수 있게 된다.  배열은 커지게 된다.





mutable을 피하기 위해서는, 배열의 증가를 피하기 위해서는 퍼블리셔 도큐먼트를 책 도큐멘트에 참조하게 한다.




댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기