2011-09-12 5 views
17

사용자의 친구 및 친구의 친구 집합을 통해 쿼리를 신속하게 수행 할 수 있어야합니다. 이것은 관계형 데이터베이스에서 비교적 직관적이지만 MongoDB에서이를 달성하는 최선의 방법에 다소 머물러 있습니다. 우리는 사용자 문서의 배열에 사용자의 친구의 사용자 ID를 저장하기 때문에 확실한 해결책이하는 것입니다 : 사용자 문서 MongoDB에서 친구 관계의 친구 모델링

  • 풀 사용자 문서에서 모든 친구 배열에서

    • 풀 모든 친구의 사용자 ID를 (모든 친구 ID의 쿼리에서 $ 사용), 응용 프로그램 쪽을 하나의 집합으로 결합한 다음 첫 번째 수준의 친구 사용자 ID와 결합하여 모든 친구 및 친구의 집합을 가져옵니다.
    • 친구의 모든 친구 및 친구에게 최종 검색어 ($ in 사용)를 수행하십시오.

    간단하지만, 이것은 관계형 데이터베이스에서 조인으로 할 수있는 것과 비교할 때 막대한 양의 앞뒤로 보입니다. MongoDB에서보다 효율적인 방법이 있습니까? 아니면 RDBMS에 가장 적합한 문제입니까?

  • 답변

    7

    이 다시 엄청난 양의 것 같아 우리가 관계형 데이터베이스

    에 조인과 함께 무엇을 할 수 있는지에 비해 등,이 모든 매우 상대적이다. "친구의 친구"을 가져 오는 것에 대한 기본 가정은 정확합니다. 몇 가지 홉과 2 개의 메모리 "별개"입니다.

    그러나 "전체 작업 완료"라는 원시적 인 관점에서 볼 때 SQL을 사용했을 때의 결과와 크게 다르지 않습니다. 예, 상대적으로 단순한 SQL 쿼리이지만 서버 자체는 기본적으로 동일한 양의 작업을 수행하거나 네트워크 트래픽을주고받습니다.

    MongoDB에서보다 효율적인 방법이 있습니까? 아니면 RDBMS에 가장 적합한 문제입니까?

    MongoDB에서 더 좋은 방법이 있습니까? 아마도 그렇지 않습니다. 그러나 SQL에서 "자체 조인"을 수행하는 것은 여러 서버에서 쉽게 확장되지 않습니다. 사실 여러 서버에서이 작업을 수행하려고하면 기본적으로 MongoDB 프로세스와 비슷한 프로세스로 변경됩니다.

    기술적으로 이것은 MongoDB 또는 RDBMS가 아닌 그래프 데이터베이스에 의해 가장 잘 수행되는 작업입니다.

    그래프 데이터베이스의 경우 Trinity for .NET 또는 NEO4J을 살펴볼 수 있습니다.

    2

    "조인"작업을 명확하게 수행해야하므로 RDBMS (그래프 DB 제외)가 더 잘 처리 할 수 ​​있다고 생각합니다. RDBMS에서도 같은 방식으로 구현할 수 있지만 MongoDB보다 효율적으로 조인을 구현하고 정보를 효율적으로 배포 할 수 있습니다.

    이렇게하면 db 노드의 대규모 클러스터와 엄청난 양의 사용자가있는 경우 "조인"쿼리를 수행하는 오버 헤드가 너무 비싸게 보일 수 있습니다.

    쿼리의 일관성과 원 자성에 대해 걱정할 필요가없고 응용 프로그램과 DB간에주고받는 것을 방지하려는 경우 전체 쿼리를 수행하는 JavaScript 함수를 작성할 수 있습니다 보다 효율적인 분산 쿼리를 위해 MongoDB를 사용하거나 MapReduce 연산을 사용하십시오.

    13

    나는 Eliot Horowitz에게 MongoDB SV 컨퍼런스에서 이와 비슷한 질문을 최근 요청했다. 그는 각 사용자 친구들을 각 사용자의 임베디드 문서로 저장하는 방식으로 구조화 할 것이라고 말했다. 예를 들어, 구조는 다음과 같습니다

    { 
        _id : ObjectId("4e77bb3b8a3e000000004f7a"), 
        username : "alex", 
        friends : ["283956723823626626aa", "226567377578888888as", "8738783888aas88a8a88" ] 
    } 
    

    은 다음 user.friends

    http://www.mongodb.org/display/DOCS/Indexes#Indexes-IndexingArrayElements

    에 인덱스를 가질 수있다 "는 인덱스 키 필드에 대한 문서의 저장 값이 배열 인 경우 MongoDB는 배열의 각 요소를 색인합니다. 자세한 내용은 Multikeys 페이지를 참조하십시오. " 그래서

    는 "알렉스"모든 찾을 수의 친구를 내가 할 단지 수 있습니다

    db.user.find ({ '친구': '4e77bb3b8a3e000000004f7a를'});

    +1

    친구 관계가 항상 상호적임을 전제로합니다 ... alex가 jon과 친구이면 jon도 alex와 친구 여야합니다. – Jay

    +0

    친구를 사귀는 것은 어떨까요? –

    +0

    https://gist.github.com/levicook/4132037에서 친구를 찾습니다 – rodi