2012-06-14 3 views
0

, 그것은이 세 모델 :디자인 MongoDB의 스키마 : 문서를 포함하거나 사용하는 외부 키 내 프로젝트에서

  1. 도시
  2. 플라자
  3. 스토어

도시가있다 광장과 상점; 광장에는 상점이 있습니다.

내 초기 디자인은 관계에 "외래 키"를 사용하는 것입니다.

class City(Document): 
    name = StringField() 

class Plaza(Document): 
    name = StringField() 
    city = ObjectIdField() 

class Store(Document): 
    name = StringField() 
    city = ObjectIDField() 
    plaza = ObjectIdField() 

나는이 디자인은 꽤 SQL 접근 방식처럼 느낀다 (I는 MySQL의에서 오전과 MongoDB를 데리러 시작 jsut).

프로젝트의 범위는 다음과 같습니다. 5 개 도시; 각 도시에는 5 개의 광장이 있습니다. 광장에는 200 개의 점포가 있습니다. 상점에 여러 제품이 있습니다 (위 코드에서 모델화되지 않았습니다).

도시 또는 광장의 모든 상점을 쿼리합니다. 한 도시의 모든 광장.

모든 상점과 광장을 시티 컬렉션에 삽입해야합니까? mongodb에서 참조를 사용하지 말고 embeded 문서를 대신 사용하십시오. 내 특정 프로젝트에서 어느 것이 더 나은 접근 방법입니까? 나에게있어, 나는 "외래 키"디자인에 익숙하지만 mongodb를 이용하지 않는 것을 두려워한다.

+0

거꾸로 들리는 도시 - 상점의 속성이 아닌 도시입니까? –

+0

예, 도시는 상점의 속성입니다. – shoujs

답변

0

프로젝트를 설명한 방식에서 볼 때 임베디드 접근 방식이 필요하지 않은 것처럼 보입니다. 도시와 광장에서 색인을 사용하면 매우 빠르게 언급 한 쿼리를 수행 할 수 있습니다. 임베딩은 캐싱에 유용하거나 임베디드 데이터가 독자적으로별로 의미가 없거나 항상 부모 데이터와 동시에 액세스되는 경향이 있습니다. 실제로 여기서는 그렇지 않습니다. 주소와 같은 것이 좋은 예입니다.

0

나는 하나의 상점 콜렉션을 가지고 있다고 생각합니다.

각 상점 문서에는 city라는 속성이있을 수 있지만 속성 프라자가있을 수도 있습니다. 더 복잡한 (하위 문서) 값을 포함하여 속성을 구조화하는 다른 많은 방법이 있습니다.

문서 인 경우 :

{ storeName: "Books and Coffee", 
    location: "plaza 17", 
    city:  "Anytown", 
} 

쉽게 그것은 별도의 컬렉션에서 도시와 광장을 저장하는 데 이해가되지 않습니다

db.stores.find({"city":"Anytown"}) 

에 아무도시에 모든 상점에 대한 조회 할 수 있습니다 당신 때문에 상점 및 도시와 같은 하나 이상의 콜렉션에 대한 정보가 필요하거나 도시 "X"의 모든 상점에 대한 정보가 필요할 때마다 다중 조회를 수행해야합니다.

관련 문제