2012-01-24 2 views
4

저는 MongoDB를 사용하여 사용자 프로필을 저장하고 있습니다. 이제 GridFS를 사용하여 각 프로필에 대한 그림을 저장하려고합니다. 나는이 문서를 연결 비교하고있어문서의 gridFS 파일에 대한 참조를 저장하는 가장 좋은 방법은 무엇입니까?

두 가지 방법은 다음과 같습니다)

User: 
{ 
    "_id": ObjectId('[user_id here]'), 
    "username": 'myusername', 
    "image": ObjectId('[file_id here]') 
} 

B에 대한 참조를 저장 :

A)는 사용자의 image 필드에 파일의 ID에 대한 참조를 저장 파일의 메타 데이터에 사용자 :

File metadata: 
{ 
    "user_id": ObjectId('[user_id here]') 
} 

나는 그것이 응용 프로그램의 내역에 나에게 종속의 방법을 많이 알고있다 (이것은 그 도움이된다면, 이동 될 수 있습니다)하지만 한 가지 방법이나 다른 방식으로하는 것이 보편적으로 도움이되는지 궁금합니다.

답변

3

여기에 대한 답변은 실제로 응용 프로그램의 사용 패턴에 따라 다릅니다. -> 찾기 사용자 -> 디스플레이 프로필 (사진 가져 오기)

이 일반화 된 사용 사례와

찾다 사용자 : 내 가정은 (정정 해줘 주시기 바랍니다) 가장 가능성있는 패턴이 같은 점이다 , 메소드 A와 함께, 이미지 오브젝트 ID가 들어있는 사용자 문서를 찾고 프로파일을 표시 한 후 해당 ID를 사용하여 파일을 가져옵니다 (2 개의 기본 조작과 완료).

참고 : GridFS에서 파일을 실제로 가져 오는 중 하나의 논리 연산으로 처리하고 있습니다. 실제로는 여러 연산이 포함되어 있지만 대부분의 드라이버/API는이를 어둡게합니다.

메소드 B를 사용하면 사용자 문서를 찾은 다음 파일 메타 데이터 모음에서 관련 user_id를 찾은 다음 파일을 가져와야합니다. 내 계산에 따르면, 그것은 세 가지 작업입니다 (추가로 메서드 A가없는 것을 알 수 있습니다).

의미가 있습니까?

물론 내 가정이 올바르지 않고 응용 프로그램이 (예를 들어) 이미지 기반이라면 쿼리 패턴에 다른 대답이 생길 수 있습니다.

+0

감사합니다. 말씀해 주시겠습니까? 나는 방법 B로 1) 사용자를 가져오고, 2) 이전에 검색된 사용자의 사용자 아이디로 메타 데이터가있는 파일을 가져올 수 있다고 가정했습니다. 필자는 파일 메타 데이터에 대한 경험이 없으므로이 내용은 잘못 될 것입니다.하지만 $ grid-> findOne (array ('metadata'=> array ('user_id'=> ObjectId ('user_id 여기]])))) (PHP 드라이버 사용) .. 그게 가능하지 않나요? –

+0

당신이 메타 데이터를 언급했을 때 나는 GridFS가 사용하는 파일 컬렉션이 아닌 별도의 콜렉션을 언급한다고 생각했다 - 기본적으로 user_id를 포함하지 않을 것이기에 나는 머리에 위의 내용을 기본값으로 사용했다. 물론 파일 컬렉션에 user_id를 추가하여 직접 쿼리 할 수 ​​있습니다. 그렇다면 "표준"GridFS 설정을 사용하는 대신 쿼리에 맞게 파일 컬렉션을 올바르게 인덱싱해야합니다. 더 기억하기 쉽지만 유효합니다. 나는 결과로 A 방법을 사용하지만 여전히 당신에게 달려 있습니다 :) –

+0

도움을 주셔서 감사합니다. –

관련 문제