복붙노트

[MONGODB] MongoDB를 대다 협회

MONGODB

MongoDB를 대다 협회

어떻게 MongoDB를 가진 many-to-many 연관을 할 것인가?

예를 들어; 의 당신은 사용자 테이블과 역할 테이블이 있다고 가정 해 보자. 사용자가 많은 역할을 가지고 있고, 역할은 많은 사용자를 가지고있다. SQL 땅에서 당신은 UserRoles 테이블을 만들 것입니다.

Users:
    Id
    Name

Roles:
    Id
    Name

UserRoles:
    UserId
    RoleId

어떻게 관계의 같은 종류의 MongoDB를 처리됩니다?

해결법

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

    1.귀하의 요청에 따라 당신은 사용자 문서에 모든 것을 넣을 수 있습니다 필요합니다 :

    귀하의 요청에 따라 당신은 사용자 문서에 모든 것을 넣을 수 있습니다 필요합니다 :

    {name:"Joe"
    ,roles:["Admin","User","Engineer"]
    }
    

    모든 엔지니어, 사용을 얻으려면 :

    db.things.find( { roles : "Engineer" } );
    

    별도의 문서의 역할을 유지하고 싶은 경우에 당신은 이름 대신의 역할 배열에서 문서의 _id를 포함 할 수 있습니다 :

    {name:"Joe"
    ,roles:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"]
    }
    

    과 역할을 같이 설정합니다 :

    {_id:"6c6793300334001000000006"
    ,rolename:"Engineer"
    }
    
  2. ==============================

    2.대신 RDBMS의 경험의 우리의 년에 따라 모델을 시도, 나는 원자의 배려하면서, 그것을 읽기 사용 사례에 대한 최적화하여 MongoDB를, 레디 스 및 기타되는 NoSQL 데이터 저장소를 사용하여 모델 문서 저장소 솔루션을 더 쉽게 발견 필요 쓰기 작업은 쓰기 사용 사례에 의해 지원된다.

    대신 RDBMS의 경험의 우리의 년에 따라 모델을 시도, 나는 원자의 배려하면서, 그것을 읽기 사용 사례에 대한 최적화하여 MongoDB를, 레디 스 및 기타되는 NoSQL 데이터 저장소를 사용하여 모델 문서 저장소 솔루션을 더 쉽게 발견 필요 쓰기 작업은 쓰기 사용 사례에 의해 지원된다.

    예를 들어, 도메인 추적에 "역할의 사용자"의 사용 :

    이것은 다음과 같은 문서 템플릿으로 모델링 할 수 있습니다 :

    User: { _id: UniqueId, name: string, roles: string[] }
        Indexes: unique: [ name ]
    Role: { _id: UniqueId, name: string, users: string[] }
        Indexes: unique: [ name ]
    

    이러한 사용자 엔티티로부터 역할 관련 기능과 같은 고주파 용도를 지원하기 위해, 의도적 User.Roles 사용자뿐만 아니라 중복 저장을 갖는 Role.Users에 저장된 정규화된다.

    그것은 텍스트의 명백하지 않다, 그러나 이것은 문서 저장소를 사용하는 경우 권장 사고의 유형 인 경우.

    나는이 작업의 읽기 측면과 관련하여 격차를 해소하는 데 도움이되기를 바랍니다.

    쓰기 측의 경우, 무엇을 권장하는 것은 원자 쓰기에 따라 모델링하는 것입니다. 문서 구조는 다음 잠금을 해제, 하나 개의 문서, 다음 다른, 그리고 아마도 더 많은 문서를 업데이트 잠금을 획득해야하는 경우 예를 들어, 가능성이 모델은 실패했습니다. 그냥 우리가 그들을 사용 해야하는 것을 의미하지 않는다 분산 잠금 장치를 구축 할 수 있기 때문이다.

    역할 모델의 사용자의 경우를 들어, 작업 잠금 우리의 원자 쓰기 회피 추가하거나 역할에서 사용자를 제거하고 스트레칭. 두 경우 모두, 하나의 사용자와 하나의 역할 문서 모두에서 성공적인 수술 결과가 업데이트된다. 무언가가 실패하면 정리를 수행하기 쉽습니다. 이 작업 패턴의 단위는 문서 저장소를 사용하는 꽤 많이 오는 이유 중 하나입니다.

    정말 잠금 우리의 원자 쓰기 방지를 뻗어 작업은 User.roles 배열에서 Role.name을 제거하기 위해 많은 사용자 업데이트 초래 역할을, 삭제한다. 분명 다음의이 작업은 일반적으로 실망하지만, 작업을 주문하여 구현 될 수 필요한 경우입니다 :

    1 단계에서 사용자 이름의 동일한 세트를 복구하거나 계속 사용할 수있는 가능성이 가장 높은 2 단계에서 발생하는 문제의 경우, 롤백은 간단합니다.

  3. ==============================

    3.난 그냥 오래된 하나 있지만, 나는 주어진 답변에 언급되지 않은 가능성의 몇 가지를 추가하는 것이 유용 할 것이라고 생각이 질문에 발견하고했습니다. 또한, 일이 그래서 SQL 및 NoSQL에 가까이 서로 이동하는 것을 강조하는 가치이며, 지난 몇 년 동안 비트를 옮겼습니다.

    난 그냥 오래된 하나 있지만, 나는 주어진 답변에 언급되지 않은 가능성의 몇 가지를 추가하는 것이 유용 할 것이라고 생각이 질문에 발견하고했습니다. 또한, 일이 그래서 SQL 및 NoSQL에 가까이 서로 이동하는 것을 강조하는 가치이며, 지난 몇 년 동안 비트를 옮겼습니다.

    덧글 중 하나는 "데이터가 관계형 인 경우, 관계형 사용"하는 현명한주의 태도를 가져왔다. 그러나, 코멘트는 스키마는 항상 응용 프로그램 앞에 오는 관계형 세계에 의미가 있습니다.

    관계형 WORLD : 구조 데이터>을 얻기 위해 쓰기 응용 프로그램 NOSQL WORLD : 따라서 디자인 응용> 구조 데이터

    데이터가 관계형하더라도, NoSQL에 여전히 옵션입니다. 예를 들어, 일대 다 관계는 전혀 문제가 없습니다 널리 MongoDB를 워드 프로세서에 설명되어 있습니다

    이 질문에 게시 된 이후, 가까이 SQL에 NoSQL에 데려에서 심각한 시도가 있었다. 캘리포니아 대학 (샌디에고)에서 야 니스 Papakonstantinou가 이끄는 팀은 FORWARD, 하나는 여기에 게시처럼 곧 지속적인 문제의 해결책이 될 수 SQL ++의 구현에 노력하고있다.

    보다 실용적인 수준에서, 카우치베이스 주식회사 4.0의 출시는 처음으로, 당신은 기본이되는 NoSQL에 조인 할 수 있다는 것을 의미했다. 그들은 자신의 N1QL을 사용합니다. 이것은 그들의 자습서에서 조인의 예입니다 :

    SELECT usr.personal_details, orders 
            FROM users_with_orders usr 
                USE KEYS "Elinor_33313792" 
                    JOIN orders_with_users orders 
                        ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
    

    모든 SQL 작업 등, aggregration을 포함하여 필터링하는 경우 N1QL는 대부분 허용

    MongoDB를 여전히 유일한 옵션 인 경우, 나는 응용 프로그램이 데이터의 구조에 우선한다는 것을 다시 내 지점으로 가고 싶습니다. 답변 중에 가장 쿼리 데이터가 문서 / 대상에 포함된다 하이브리드 삽입을 언급하지 않으며, 참조는 소수의 경우를 위해 보관됩니다.

    예 : 대기 할 수있는 정보 (역할 이름이 아닌)? 응용 프로그램은 사용자가 아직 필요하지 않습니다 아무것도 요구하지 않음으로써 더 빨리 부트 스트랩 수 있을까?

    사용자가 로그인 s는 / 그 s는 / 그에게 속한 모든 역할에 대한 모든 옵션을 볼 필요 경우에 해당 될 수 있습니다. 그러나, 사용자는 "엔지니어"이며,이 역할에 대한 옵션은 거의 사용되지 않습니다. 응용 프로그램은 경우의에서 엔지니어에 대한 옵션을 표시해야하는이 방법은 / 그는 그들 클릭하고 싶어.

    이 작업은 사용자가 속한 역할을 시작 (1)과 (2)에서 응용 프로그램을 알려주는 문서를 달성 할 수있는 특정 역할에 연결된 이벤트에 대한 정보를 얻을 수 있습니다.

       {_id: ObjectID(),
        roles: [[“Engineer”, “ObjectId()”],
                [“Administrator”, “ObjectId()”]]
       }
    

    또는, 더 나은, 인덱스 role.name의 역할 컬렉션에서 필드, 당신은 포함 OBJECTID () 중 하나에 필요하지 않을 수도 있습니다.

    또 다른 예 : 역할이 모든 시간을 요청 ALL에 대한 정보는 무엇입니까?

    또한 케이스가 될 수있는 사용자 대시 보드에 로그인하여하고 "엔지니어"역할에 링크 된 시간의 작업을 수행 할의 90 %. 하이브리드 삽입은 나머지 부분에 대한 완전하고 킵 참조에서 특정 역할에 대해 수행 할 수있다.

    {_id: ObjectID(),
      roles: [{name: “Engineer”, 
               property1: value1,
               property2: value2
              },   
              [“Administrator”, “ObjectId()”]
             ]
    }
    

    스키마가되는 것은없는 NoSQL의 단지 특성 아니라,이 경우 장점이 될 수있다. 그것은 사용자 개체의 "역할"속성에서 객체의 둥지 다른 유형에 완벽하게 유효합니다.

  4. ==============================

    4.경우에시 직원과 회사 엔티티 객체입니다 스키마 다음 사용하려고 :

    경우에시 직원과 회사 엔티티 객체입니다 스키마 다음 사용하려고 :

    employee{
       //put your contract to employee
       contracts:{ item1, item2, item3,...}
    }
    
    company{
       //and duplicate it in company
       contracts:{ item1, item2, item3,...}
    }
    
  5. from https://stackoverflow.com/questions/2336700/mongodb-many-to-many-association by cc-by-sa and MIT license