[MONGODB] MongoDB의의 속성을 가진 많은 관계로 많은 대표 모범 모델
MONGODBMongoDB의의 속성을 가진 많은 관계로 많은 대표 모범 모델
속성이 다 대다 관계를 나타내는 가장 '몽고'방법은 무엇입니까?
그래서 예를 들면 :
MYSQL 테이블
사람들 => 이름, 성, ...
영화 => 이름, 길이 ..
peopleMovies => movieId, personId, 언어, 역할
영화에 삽입 사람 ...?
MongoDB를 나는이 비정규 화하는 그것의 좋은 이해하고 포함하지만 영화에 삽입 사람들에게 싶지 않아, 그냥 논리적으로 이해가되지 않습니다. 사람들은 반드시 만에이 없기 때문에 영화에 속한다.
사람과 영화는 두 개의 컬렉션이 될 것입니다. 사람들 => 삽입 [{movieId : 12, personId : 1, 언어 : "영어", 역할 : "메인"} ...]
영화 => 삽입 [{movieId : 12, personId : 1, 언어 : "영어", 역할 : "메인"} ...]
이 솔루션의 문제는 우리가 특정 영화에 대한 사람의 역할을 업데이트 할 때 데이터가 모두 컬렉션을 동기화 확인하기 위해 두 업데이트 쿼리를 실행해야한다는 것입니다.
우리는 훨씬 더 관계형 그런 짓을하고 3 개 개의 모음을 끝낼 수 있습니다
사람들 => 이름, 성, ... 영화 => 이름, 길이 .. 주물 => movieId, personId, 언어, 역할
반대> 영화와 그 - 이것에 대한 문제는이 부족하여 MongoDB에 문을 가입하기 때문에, 그것은 사람들의 이동 3 개 쿼리를 수행하게됩니다.
여기에 MongoDB를 및 더 NoSQL에 방법이 같은 모델 뭔가 다른 방법이 무엇인지 내 질문이다. 하나는 몽고의 성능 및 컨벤션의 측면에서 최선을 것입니다 제공하는 솔루션의 관점에서.
해결법
-
==============================
1.유성의 API가 평평 관계 문서를 장려 여러 가지면에서, 그러나 MongoDB를 비 관계형 데이터 저장소입니다. 이 충돌은, 불행하게도, 개발자가 해결하기위한 운동으로 남아 있습니다.
유성의 API가 평평 관계 문서를 장려 여러 가지면에서, 그러나 MongoDB를 비 관계형 데이터 저장소입니다. 이 충돌은, 불행하게도, 개발자가 해결하기위한 운동으로 남아 있습니다.
나는 가능한 한 간결으로 일을 시도합니다 있도록 스키마 구조의 개념과 조인은 하나의 대답에서 커버 거대한 주제입니다.
당신이 코멘트와 포스트 데이터를 가정합니다. 당신이 당신의 게시물 내에서 의견을 포함하면 무슨 일이 일어날 지 생각해 보자.
세 번째 솔루션을 사용합니다. 내 경험에 의하면, 관계형 모델을 선택하는 이유는 지금까지 데이터 저장소에 의해 부과 된 제한을보다 큽니다. 조인의 부족을 극복 물론 쉽지 않지만 통증이 기능을 게시 단지 소수에 고립 될 가능성이있다. 여기에 내가 매우 권하고 싶습니다 일부 리소스는 다음과 같습니다
이 이상의 자세한 정보가 필요하면 아래의 의견을 기쁘게 그리고 난 내 대답을 업데이트합니다.
-
==============================
2.나는 당신이 당신의 컬렉션을 비정규한다고 생각합니다. MongoDB의 컬렉션 및 문서를 설계하는 중요한 점은 귀하의 의견에 대해 생각하는 것입니다. 어떤 데이터가 당신이 당신의보기를 표시해야합니까? 아이디어는 데이터가 문서의 일부가 될 것을 가지고 시도해야한다는 것이다.
나는 당신이 당신의 컬렉션을 비정규한다고 생각합니다. MongoDB의 컬렉션 및 문서를 설계하는 중요한 점은 귀하의 의견에 대해 생각하는 것입니다. 어떤 데이터가 당신이 당신의보기를 표시해야합니까? 아이디어는 데이터가 문서의 일부가 될 것을 가지고 시도해야한다는 것이다.
예를 들어, 귀하의 경우, 당신은 아마 당신이 영화에 대한 정보를 표시 할 영화에 대해 볼 수 있습니다. 그러나 영화에 대한 해당 페이지는 아마 각 사람에 대해 단지 기본 정보 (이름, 성, 사진 URL)를 필요로한다. 모든 다른 것들. 그리고 반대로, 그 사람에 대해 페이지는 아마 영화를 나열합니다뿐만 아니라, 다시 각 영화에 대한 정보의 서브 세트는 제목, 연도 및 포스터 사진 URL처럼 필요합니다.
그래서 하나의 옵션은 두 컬렉션, 그러나 포함 (비정규) 당신이 컬렉션을 사이에 필요한 바로 그 몇 가지 필드가하는 것입니다. 그래서 예를 들어, 영화 컬렉션 하위 문서의 배열 될 필드 명있을 것입니다. 그리고 사람들 모음은 등등 역할을 지정하려면 그 여분의 필드와 하위 문서의 배열 될 영화 필드를 가질 것이다.
문서는 다음과 같은 수 있습니다 그래서. 영화의 경우 :
{ _id: "AAA", title: "...", year: 2015, length: 120, posterURL: "...", people: [ { person: { _id: "BBB", firstName: "...", lastName: "...", photoURL: "..." }, role: "..." } ] }
사람들을 위해:
{ _id: "BBB", firstName: "...", lastName: "...", photoURL: "...", movies: [ { _id: "AAA", title: "...", year: 2015, posterURL: "..." } ] }
물론, 문제는 동기화하는 필드를 유지하는 방법이다. 당신이 영화의 포스터 사진의 URL을 업데이트하면 어떻게, 당신은 모든 사용자 문서 업데이트도되고 싶어요. 이 문제를 해결하기 위해, 우리는 다음 확실히 그들이 동기화 유지하게 컬렉션 사이의 관계를 정의하는 패키지를 PeerDB을 개발했다.
따라서 귀하의 경우, 나는 커피 스크립트에 PeerDB에 정의 된 이러한 컬렉션을 할 것이다 :
class People extends Document @Meta name: 'People' class Movies extends Document @Meta name: 'Movies' fields: => people: [ person: @ReferenceField People, ['firstName', 'lastName', 'photoURL'], true, 'movies', ['title', 'year', 'posterURL'] ]
즉,이 정의는 people.person 필드가 사람들의 컬렉션에 대한 참조 및 이름, 성, photoURL에 대한 동기화를 유지해야한다고 말한다. 또한, 역 참조 필드는 제목, 연도, posterURL와 필드 영화에서 사람들이 문서에서해야한다.
아주 간단합니다. 그러나 몇 가지 단점이있다. 배열은 매우 큰 수 (영화와 사람들의 경우 아마,하지만 다른 데이터) (순간 16메가바이트에서) MongoDB를 당 문서 한계에 대한 문서가 너무 큰 만들 수 있습니다. 당신이 관찰하는 경우 또한, 당신은 사람들이 문서에 영화 목록에서 역할에 대한 정보가없는 것을 볼 수 있습니다. 역할이 참조 된 문서의 일부가 아니기 때문입니다,하지만 참조 옆에 무언가이다. 당신은 사람이 사람 페이지 / 뷰에 있던 영화에 대한 역할을 표시 할 것인지?
그래서, 어쩌면 다음 3 개 개의 모음을, 사람들을위한 영화에 대한 기본 정보에 대해 하나의 또 다른, 사람과 영화의 관계에 대한 컬렉션이 더 좋을 것입니다. 데이터는 영화처럼 어쩌면 뭔가 할 수 있도록 :
{ _id: "AAA", title: "...", year: 2015, length: 120, posterURL: "..." }
사람들을 위해:
{ _id: "BBB", firstName: "...", lastName: "...", photoURL: "..." }
캐스팅의 경우 :
{ _id: "...", movie: { _id: "AAA", title: "...", year: 2015, posterURL: "..." }, person: { _id: "BBB", firstName: "...", lastName: "...", photoURL: "..." }, role: "..." }
그리고 PeerDB 정의 :
class People extends Document @Meta name: 'People' class Movies extends Document @Meta name: 'Movies' class Casting extends Document @Meta name: 'Casting' fields: => person: @ReferenceField People, ['firstName', 'lastName', 'photoURL'] movie: @ReferenceField Movies, ['title', 'year', 'posterURL']
PeerDB는 반드시 일이 동기화를 유지하는 것을 만들 것입니다. 또한 영화 나 사람이 데이터베이스에서 삭제 된 경우 문서를 캐스팅 제거하는 것입니다.
이것은 당신이 유성이 효율적이고 관련 쿼리 동적 건물을 필요로하지 않는 게시 할 수 있습니다. 당신은 단순히 수집을 주조 게시하고이 그것입니다. 당신은 어떤 조건에서 조회 할 수 있습니다. 예를 들어, 이름 및 성과 영화로 분류 모든 이사를 표시하려면? 하나의 쿼리 가능.
from https://stackoverflow.com/questions/25344444/best-model-for-representing-many-to-many-relationships-with-attributes-in-mongod by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 우리는 봄 부트를 사용하여 MongoDB를위한 자동 생성 된 필드를 만들 수있는 방법 (0) | 2019.12.17 |
---|---|
[MONGODB] 어떻게하여 MongoDB의 범위 쿼리를 사용하여 페이지 매김을 할? (0) | 2019.12.17 |
[MONGODB] MongoDB를 복합 키 (0) | 2019.12.17 |
[MONGODB] 봄의 데이터 MongoDB를 : MappingMongoConverter의 제거 _class (0) | 2019.12.17 |
[MONGODB] {발견} 속도 대 MongoDB를 {집계 $ 일치} (0) | 2019.12.17 |