2013-01-07 6 views
1

스프링 데이터를 사용하여 MongoDB의 사용자를위한 친구 관계를 저장해야합니다. 내 "스키마"솔루션은 사용자 문서 내에 친구의 사용자 이름 (_id 임)을 저장하는 것입니다. DBRef를 사용하지 않고 있습니다. Spring 데이터와 DBRef에 문제가있는 것 같습니다 (친구는 users : p). 간단한 사용자 문서는 다음과 같습니다.mongoDB 친구 관계 및 원자 적 업데이트

{ 
"_id" : "user1", 
"email" : "[email protected]", 
"friendRequests" : { 
    "user4" : 0 
}, 
"friends" : ["user2", "user3" ], 
"password" : "$2a$10$9iJWLZjBSu3rq19wh7KTduNXIVcXozsNVjwVogO9eoz0uXO52Z2NC" 
} 

이 모델은 충분히 좋다고 생각합니다. 그러나 누군가가 친구 요청을 수락하면 사용자의 문서를 모두 업데이트해야하며 작업은 원 자성이 아닙니다. 이 중 하나만 업데이트되는 경우도있을 수 있습니다. 중요한 데이터는 아니지만이를위한 솔루션을 제공하는 것이 좋습니다. 나는 이것을 overthinking인가? 이 문서는 2 단계 커밋 http://cookbook.mongodb.org/patterns/perform-two-phase-commits/에서 발견되었지만 구현하기가 쉽지만이 상황에서는 너무 많이 보인다.

답변

1

응용 프로그램에서 데이터를 사용하는 방법을 모른 채 이러한 유형의 질문에 대답하기는 어렵습니다. MongoDB에는 기본적으로 동일한 데이터/스키마를 표현하는 여러 가지 방법이 있으므로, 애플리케이션에서 가장 잘 작동하는 방법은 애플리케이션의 요구에 맞는 방법이라는 것을 기억하십시오.

몇 가지 질문 :
각 사용자의 평균 친구 수를 알고 계십니까?
사용자의 친구를 어떻게 표시/쿼리/업데이트 하시겠습니까?
어떤 작업을 수행해야하며 절대적으로 최신이며 더 오래 걸리거나 나중에 배치 모드로 수행 할 수 있습니까?

데이터에 대해 가능한 각 스키마에 절충점이 있습니다. 각 사용자의 친구 배열에 계속해서 사용자 이름을 추가하면 문서가 지속적으로 증가합니다 (문서가 할당 된 공간을 초과 할 때 실적이 좋지 않은 업데이트이므로 다음에 업데이트 할 때 이동해야 함). 이것을 상쇄하기 위해서는 친구 배열을 이런 방식으로 저장할 때 얻을 수있는 것을 고려해야합니다. 사용자에 대한 모든 정보를 가져올 때 단 한 번의 읽기 만 할 수 있습니까? 또는 다른 배열을 다시 읽어야 할 필요가 있습니까? 친구 배열에있는 각 사용자에 대한 추가 정보를 얻기 위해 사용자 컬렉션을 다시 쿼리해야합니까?

데이터 일관성 유지에 도움이되는 업데이트의 원 자성에 대해 이미 생각하고 있습니다. 당신이 올바르게 메모, 이것은 귀하의 응용 프로그램이 처리 할 수있는 무언가입니다 (또는 당신은 실행하고 "부분 방식"우정 업데이트를 감지하고 그들을 청소 배경 작업을 가질 수 있습니다.)

당신은 또한 컬렉션에 대한 인덱스 - 쿼리에 대한 SLA를 충족시키기 위해 단일 컬렉션에서 많은 인덱스가 필요한 경우 업데이트/삽입이 더 느려집니다 (더 많은 인덱스를 업데이트해야하기 때문에). 결정을 내릴 수있다. 그 트레이드 오프

이 정보가 도움이되기를 바랍니다.

+0

답변 해 주셔서 감사합니다. 사용자가 얼마나 많은 친구가 될지 지금 말하기는 어렵습니다. 최소한 응용 프로그램의 핵심 기능은 아닙니다. stackoverflow에 대한 다른 답변을 제안했기 때문에이 솔루션을 사용했습니다. 현재 내 마음에 오는 유일한 해결책은 다른 컬렉션을 사용하여 우정을 저장하는 것입니다. – alex