복붙노트

[MONGODB] MongoDB의의 속성을 가진 많은 관계로 많은 대표 모범 모델

MONGODB

MongoDB의의 속성을 가진 많은 관계로 많은 대표 모범 모델

속성이 다 대다 관계를 나타내는 가장 '몽고'방법은 무엇입니까?

그래서 예를 들면 :

MYSQL 테이블

사람들 => 이름, 성, ...

영화 => 이름, 길이 ..

peopleMovies => movieId, personId, 언어, 역할

영화에 삽입 사람 ...?

MongoDB를 나는이 비정규 화하는 그것의 좋은 이해하고 포함하지만 영화에 삽입 사람들에게 싶지 않아, 그냥 논리적으로 이해가되지 않습니다. 사람들은 반드시 만에이 없기 때문에 영화에 속한다.

사람과 영화는 두 개의 컬렉션이 될 것입니다. 사람들 => 삽입 [{movieId : 12, personId : 1, 언어 : "영어", 역할 : "메인"} ...]

영화 => 삽입 [{movieId : 12, personId : 1, 언어 : "영어", 역할 : "메인"} ...]

이 솔루션의 문제는 우리가 특정 영화에 대한 사람의 역할을 업데이트 할 때 데이터가 모두 컬렉션을 동기화 확인하기 위해 두 업데이트 쿼리를 실행해야한다는 것입니다.

우리는 훨씬 더 관계형 그런 짓을하고 3 개 개의 모음을 끝낼 수 있습니다

사람들 => 이름, 성, ... 영화 => 이름, 길이 .. 주물 => movieId, personId, 언어, 역할

반대> 영화와 그 - 이것에 대한 문제는이 부족하여 MongoDB에 문을 가입하기 때문에, 그것은 사람들의 이동 3 개 쿼리를 수행하게됩니다.

여기에 MongoDB를 및 더 NoSQL에 방법이 같은 모델 뭔가 다른 방법이 무엇인지 내 질문이다. 하나는 몽고의 성능 및 컨벤션의 측면에서 최선을 것입니다 제공하는 솔루션의 관점에서.

해결법

  1. ==============================

    1.유성의 API가 평평 관계 문서를 장려 여러 가지면에서, 그러나 MongoDB를 비 관계형 데이터 저장소입니다. 이 충돌은, 불행하게도, 개발자가 해결하기위한 운동으로 남아 있습니다.

    유성의 API가 평평 관계 문서를 장려 여러 가지면에서, 그러나 MongoDB를 비 관계형 데이터 저장소입니다. 이 충돌은, 불행하게도, 개발자가 해결하기위한 운동으로 남아 있습니다.

    나는 가능한 한 간결으로 일을 시도합니다 있도록 스키마 구조의 개념과 조인은 하나의 대답에서 커버 거대한 주제입니다.

    당신이 코멘트와 포스트 데이터를 가정합니다. 당신이 당신의 게시물 내에서 의견을 포함하면 무슨 일이 일어날 지 생각해 보자.

    세 번째 솔루션을 사용합니다. 내 경험에 의하면, 관계형 모델을 선택하는 이유는 지금까지 데이터 저장소에 의해 부과 된 제한을보다 큽니다. 조인의 부족을 극복 물론 쉽지 않지만 통증이 기능을 게시 단지 소수에 고립 될 가능성이있다. 여기에 내가 매우 권하고 싶습니다 일부 리소스는 다음과 같습니다

    이 이상의 자세한 정보가 필요하면 아래의 의견을 기쁘게 그리고 난 내 대답을 업데이트합니다.

  2. ==============================

    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는 반드시 일이 동기화를 유지하는 것을 만들 것입니다. 또한 영화 나 사람이 데이터베이스에서 삭제 된 경우 문서를 캐스팅 제거하는 것입니다.

    이것은 당신이 유성이 효율적이고 관련 쿼리 동적 건물을 필요로하지 않는 게시 할 수 있습니다. 당신은 단순히 수집을 주조 게시하고이 그것입니다. 당신은 어떤 조건에서 조회 할 수 있습니다. 예를 들어, 이름 및 성과 영화로 분류 모든 이사를 표시하려면? 하나의 쿼리 가능.

  3. 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