2014-05-01 4 views
2

MongoDB에 사용자 컬렉션이 있습니다. _id는 현재 표준 MongoDB가 생성 한 ObjectId입니다. 필요한 '이메일'필드에 대해 고유 한 키 제약 조건이 있습니다. 이것은 낭비처럼 보인다.MongoDB 사용자 컬렉션에서 _id로 이메일 보내기

'이메일'입력란을 버리고 해당 입력란을 _id 입력란으로 지정해야하는 이유가 있습니까?

답변

6

나는 Neil의 대답을 읽었으며 부분적으로 동의한다. ('상당한 성능 향상'에 대해서도 회의적이다.) 귀하의 질문에서 찾지 못한 한 가지는 '이 이메일을 가지고 무엇을 할 것입니까?'입니다. 그걸로 검색하려고합니까 아니면 그냥 거기에 저장되어 있습니까? 그리고 이전 답변에서 다루지 않은 가장 중요한 것들 중 하나는 바뀔 것인가?

시스템을 사용하는 사람들이 전자 메일을 변경하게됩니다 (유실/더 이상 사용되지 않음). _id을 이메일로 보내 주시면 쉽게 변경할 수 없으므로 _id을 mongo에서 수정할 수 없습니다. 이 경우에는 새로운 원소를 복사하거나 제거해야합니다 (원자가되지 않습니다).

그래서 나는 그렇게하지 않을 큰 이유 중 하나라고 생각했습니다. 그러나 사람들이 전자 메일 주소를 변경할 수 있는지 여부를 결정해야합니다.

+3

+1 사용 사례를 찾아 주셔서 감사합니다. 살바도르! 그리고 나는 당신의 작품을 좋아합니다 ... – Guy

+0

드문 유스 케이스 - 전자 메일 변경 - 실제 전자 메일과 별도의 문서/행/열을 추가하여 피할 수 있습니까? 모든 데이터를 복사 할 필요는 없습니다. 알림 이메일에 실제 이메일을 추가하기 만하면됩니다. –

+0

@NikolayFominyh 이렇게 드문 경우는 아닙니다. 그리고 _id 필드로 전자 메일을 보내지 않고 새로운 정보를 추가하는 것이 더 쉽다는 점은 매우 의심 스럽습니다. –

4

일반적으로 실제적인 이유는 없으며 실제로 "전자 메일"을 기본 키로 사용하면 상당한 성능 향상이 실현됩니다. 당신 조회의 대부분이 기본 키에 실제로

  1. . 심지어 다른 필드에 대해 고유 한 키를 만드는 경우에도 MongoDB는 _id "찾기"가 아무렇지도 않게 최적화되어 있습니다. 항상 거기에 있습니다.

  2. 색인에 추가 공간을 사용하지 않습니다. 따라서 기본 키를 찾고있는 곳에서 기본 색인 이외의 다른 항목을 가져올 필요가 없으며 디스크 공간을 절약 할뿐만 아니라 I/O 비용을 절약 할 수 있습니다.

아마 샤프와 관련된 유일한 고려 사항은 샤딩입니다. 그리고 그것은 예를 들어 사용 사례가 "고/저"볼륨 사용자의 "버킷으로 된"분배의 다른 형태에 더 적합 할 경우에만 해당됩니다. 이 경우이를 촉진하기 위해 기본 키의 다른 형태가 필요할 것입니다.

일반적으로 _id 필드를 차지하는 기본값 인 ObjectId 유형은 자연 삽입 순서를 유지하고 일반 범위 기반 쿼리 또는 시간 기반 쿼리 (이유 있음)와 같은 작업을 수행 할 수도 있으므로 유용합니다. 자연스러운 삽입 순서가 필요한 곳에서는 일반적으로 최선의 선택이며 매우 충돌 안전합니다.

하지만 당신은 일반적으로 기본 키 값을 효율적으로 조회, 자연의 기본 키가 이상적으로 한이 고유성을 보장 한, 컬렉션의 _id 필드에 넣어 역할을 한 후 어떤 찾고 있다면.

+0

+1 위대한 답변 Neil - 감사합니다! – Guy