복붙노트

[MONGODB] NoSQL이 많은 관계 많은 (및 MongoDB를 몽구스)

MONGODB

NoSQL이 많은 관계 많은 (및 MongoDB를 몽구스)

내가 MongoDB를하고 mongoose.js 많은 많은과 관계를하고 있어요, 내가 많은 옵션이 있다는 것을 알고, 내 상황은 이것이다 :

나는 두 문서, 사용자 및 프로젝트, 한 사용자가 많은 프로젝트를 가질 수 있고 하나 개의 프로젝트는 많은 사용자 수를했습니다, 그래서 내 경우에는 내가 4 옵션을했습니다 :

옵션 1과 2는 전 사용자의 모든 프로젝트를 발견하고자한다면, 옵션 1의 시나리오에서 상상하기 때문에, 내가이 배열을 통과 (사용자의 모든 프로젝트 문서 배열 내부의 사용자 ID를 찾아해야합니다, 사용할 수없는 모든 프로젝트),이 확실히 좋은 방법이 아닙니다.

옵션 3가 좋다하지만 난 두 문서가 작성 될 수 있도록하는 거래의 어떤 종류를해야 할 것이다, 나쁜, 두 문서는 훨씬 더 기록보다 읽을 수 있기 때문에이지 않는다

내가 프로젝트에 한 명의 사용자를 추가 할 때, 그것은으로 새 문서를 추가 할 그냥 때문에 옵션 4 간단 모두 ID의 (내가 거래에 대해 신경 쓸 필요가없는 것이기 때문에 그것이 좋은 솔루션입니다, 내가 생각하는 좋은 해결책인가?)

그래서 최선의 해결책은 무엇인가?

해결법

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

    1.반대로, 솔루션 1과 2는 당신의 최선의 방법이다. 업데이트 / 생성 빈도가 매우 적은 프로젝트 생성 /도 갱신에 것처럼 사용자의 주파수를 읽어 비교 될 때 해결 방법 3이 고려 될 수있다, 그것은 두 개의 쿼리가 필요 읽기의 용이성은 만회 될 것이다.

    반대로, 솔루션 1과 2는 당신의 최선의 방법이다. 업데이트 / 생성 빈도가 매우 적은 프로젝트 생성 /도 갱신에 것처럼 사용자의 주파수를 읽어 비교 될 때 해결 방법 3이 고려 될 수있다, 그것은 두 개의 쿼리가 필요 읽기의 용이성은 만회 될 것이다.

    솔루션 1, 2 중에서 선택하려면 읽기 주파수를 고려해야합니다. 당신은 더 자주 프로젝트의 사용자 또는 용도의 프로젝트를해야합니다 그에 따라 선택합니다. 당신은 둘 다 상대적으로 동일한 주파수로 느끼는 경우 적은 가능한 클러스터로 사용자 개체를 유지하는 것이 좋습니다. 당신이 선택하든 옵션 (프로젝트 또는 사용자)을 _ids를 저장하는 배열에 인덱스를 유지하는 것이 좋습니다.

    예를 들어.

    userSchema = new Schema(
                {//otherstuff
                   project_ids: [{type: Schema.Types.ObjectId, ref: 'Project'}})
                  ...
                }) 
    userSchema.index({'project_ids':1})
    

    또는

    projectSchema = new Schema(
                {//otherstuff
                   user_ids: [{type: Schema.Types.ObjectId, ref: 'User'}})
                  ...
                }) 
    projectSchema.index({'user_ids':1})
    

    당신은 상당한 오버 헤드가있을 것입니다 두려워 곳 _id의 배열에 인덱스를 유지하는 것이 훨씬 측면에 쿼리 '속도를 향상시킬 수 있습니다.

    이 관계는 쿼리가 많이 벌어와 중요한 관계 만한다면 인덱스를 유지한다. 이 프로젝트의 단지 측 기능입니다 경우에, 당신은 너무 인덱스없이 할 수 있습니다.

    사용자가 물건을 많이 할과 관계를 많이 가지고 할 수 있다면, 당신은 당신의 응용 프로그램이 특정 프로젝트되지 않은 경우 그래서, 그것은 사용자 스키마에서 프로젝트 ID를 넣어 잘하지하는 것입니다 앱을 통해 지속적으로 해당 사용자 개체를 필요로한다 . 우리는 단지 ID를 가하고 있습니다하지만, 어쨌든 많은 오버 헤드의 아니다. 그것에 대해 걱정할 필요가 없습니다.

    모두 배열에 등록 지수 : 예 당신은 당연히 할 수 있습니다. 당신이 솔루션 3에 갈 때 사용자 또는 프로젝트에 사용자 목록의 프로젝트 목록을 가져올 쿼리를 수행하지 않습니다하지만, 당신은 전혀 인덱스가 필요하지 않습니다. 해결 방법 3은 매우 쉽게 읽을 수 있지만 약간의 불편을 작성합니다. 당신이 작성 >> 사용 사례 읽기 포함 언급하지만, 솔루션 3으로 가야하지만, 당신이 알아서해야 할 데이터 불일치의 위험이 항상있다.

    색인은 빠르게 일을한다. 워드 프로세서를 통해 이동하고 인터넷 검색의 약간을한다. 아무것도 공상. 인덱스 배열을 통해 쿼리 정상적인 배열보다 더 효율적이다. 예를 들어. 우리는 당신이 솔루션 2를 사용하는 가정하자. project_ids 필드에서 프로젝트 ID를 저장합니다.

    당신은 쉽게 사용자의 프로젝트를 얻을 수 있습니다. 이것은 정직이다.

    그러나 프로젝트 1의 사용자를 얻을 수 있습니다. 이 같은 쿼리해야합니다.

    User.find({project_ids:project._id},function(err,docs){
         //here docs will be the list of the users of project1
    })
    //The above query might be slow if the user base is large. 
    //But it can be improved vastly by indexing the project_ids field in the User schema.
    

    솔루션 1. 유사 각 프로젝트는 사용자 ID field.Let가있다 우리는 우리가 사용자 1이 가정합니다. 사용자의 프로젝트를 얻으려면 우리는 folowing 쿼리를 수행

    Project.find({user_ids:user1._id},function(err,docs){
          //here docs will be the projects of user1
          //But it can be improved vastly by indexing the user_ids field in the Project schema.
    

    당신이 솔루션 2 대 솔루션 1 이상 숙고하는 경우, 솔루션 (1) 내가 생각 낫다. 이 당신이 그의 프로젝트없이 사용자가 필요한 경우 수 있지만 사용자없이 프로젝트를 필요로의 가능성은 매우 낮다 수 있습니다. 그러나 정확한 사용 사례에 따라 달라집니다.

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

    2.잘 솔루션 1과 2는 그렇게 나쁘지 찾고되지 않습니다! 하며 Object의 당신이 만약 인덱스 배열 할 수 있습니다 후 직접 당신이 원하는에 액세스 할 수 있습니다.

    잘 솔루션 1과 2는 그렇게 나쁘지 찾고되지 않습니다! 하며 Object의 당신이 만약 인덱스 배열 할 수 있습니다 후 직접 당신이 원하는에 액세스 할 수 있습니다.

    해결 방법 3도 좋은 찾고,하지만 당신은 프로젝트와 사용자의 관계 사이에 많은 변화가있을 때 4, 정말, 당신은 제외하고, 더 질의를 필요로하지만 그 자체.

    나는 배열 인덱스 솔루션 1을 선호합니다. 그래서 .find () 당신이 원하는 모든 것을 할 것입니다, 사용자 또는 직접 ID로 달려 프로젝트 개체를 얻을 필요가 시간을 많이 생각한다. 나는 그들이 분리 물체처럼 보이는 당신은 다른 목적을해야 할 수도 있습니다, 그것은 최소한의 정보로 사용자 스키마를 유지하기 위해 나쁘지 않다 생각합니다.

  3. from https://stackoverflow.com/questions/25101386/many-to-many-relationship-with-nosql-mongodb-and-mongoose by cc-by-sa and MIT license