2013-07-10 2 views
0

MongoDB를 처음 사용했습니다. 저는 하나의 Master Collection user_group을 가지고 있습니다. 샘플 문서는 다음과 같습니다.MongoDB에서 관계를 관리하는 방법?

{group_name:"xyz","previlege":["Add","Delete"],...}

그리고 두 번째 컬렉션을

{"user_name":"pt123","group_name":"xyz",...} 

어떻게 내가 user_detail 또는 다른 대안으로 user_group에서 참조를 사용하는이 두 collections.Should 사이의 관계를 유지할 수 user_detail?

+0

백엔드 스택은 무엇입니까? 자바? 파이썬? 어떤 도서관? – jsalonen

+0

내 백엔드 스택이 Java –

+0

여기에 좋은 것들이 많이 있습니다. http://docs.mongodb.org/manual/data-modeling/ – WiredPrairie

답변

1

간단한 대답 : 그렇지 않습니다.
MongoDB를 처음 보았을 때 전체 디자인 철학이 바뀝니다. 내가 너라면, user_detail 문서 자체 안에 previlege 필드를 유지할 것이다.

{"user_name":"abc","group_name":"xyz","previlege" : ["add","delete"]} 

그룹 권한을 계속 변경하는 경우 이상적이지 않을 수 있습니다. 그러나 아이디어는 하나의 "레코드"에 대한 모든 정보를 하나의 객체에 저장할 수 있도록 데이터 저장소를 디자인하는 것입니다.

+0

나는 동의하지만 user_group을 관리하고 있으므로 그룹을 업데이트해야합니다. 자주 previleges. –

3

종종 MongoDB에서 "많은"관계는 관계형 데이터베이스와는 반대쪽에서 관리됩니다. MongoDB 문서에는 종종 ObjectId 또는 그룹 이름 배열 (또는 외부 문서를 식별하는 데 사용하는 배열)이 있습니다. 이것은 상대방이 대개 "속한"열을 갖는 관계형 데이터베이스와 반대입니다.

분명해야합니다. 필수 사항은 아닙니다. 예를 들어, 가장 일반적인 쿼리 인 경우 사용자 문서 ID 배열을 그룹 문서에 저장할 수 있습니다. 기본적으로 질문해야 할 질문은 "어떤 쿼리가 필요할 것입니까?"입니다. 문서를 디자인하여 지원할 수 있습니다.

0

MongoDB가 NoSQL에 명시 적 조인이 없습니다. 해결 방법이 있지만 권장되지는 않습니다 (MapReduce 읽기).

가장 좋은 방법은 클라이언트 측의 mongo 컬렉션에서 문서를 모두 검색하고 사용자 별 권한을 적용하는 것입니다. user_group 콜렉션의 group_name에 색인이 있는지 확인하십시오.

또는 클라이언트 측에서 조인을 적용한 후 동일한 문서에 사용자의 권한 [read, del, etc]을 저장하는 것이 더 좋습니다. 그렇지만 불변량이 깨질 수 있으므로 콜렉션을 외부 적으로 업데이트 할 수 없습니다. 사용자 그룹에 대한 업데이트가 발생할 때마다 클라이언트 측에서 이러한 권한 (권한)을 직접 적용하고 해당 권한을 동일한 문서에 저장해야합니다. 쓰기가 어려울 수도 있지만 읽기가 빠를 것입니다 (username과 같이 몇 개의 필드가 색인되어 있다고 가정).

+0

MR을 사용하여 조인을하는 것은 잘못된 것입니다 ... 클라이언트 측에서 수행해야합니다. – Sammaye

+0

이것이 제가 2 번째 파라에서 말한 것입니다. – bsd

관련 문제