복붙노트

[MONGODB] MongoDB의 스키마 디자인 - 많은 작은 문서 또는 적은 수의 큰 문서?

MONGODB

MongoDB의 스키마 디자인 - 많은 작은 문서 또는 적은 수의 큰 문서?

배경 나는 MongoDB를 우리의 RDBMS 데이터베이스에서 변환을 프로토 타이핑하고 있습니다. 비정규 동안, 나는 두 가지 선택, 작은 문서의 많은 (수백만) 한 리드 또는 하나를 가지고있는 것처럼 보인다 적은 (수십만) 큰 문서에 리드.

나는 간단한 아날로그에 그것을 아래로 증류 할 수 있다면, 그것은 (자바)이 같은 적은 수의 고객 문서와 모음 사이의 차이가 될 것입니다 :

class Customer {
    private String name;
    private Address address;
    // each CreditCard has hundreds of Payment instances
    private Set<CreditCard> creditCards;
}

또는이 같은 많은, 많은 지불 된 문서 모음 :

class Payment {
    private Customer customer;
    private CreditCard creditCard;
    private Date payDate;
    private float payAmount;
}

질문 MongoDB가 많은, 많은 작은 문서 또는 적은 수의 큰 문서를 선호하도록 설계되어 있습니까? 대답은 대부분 내가 실행하려는 쿼리에 따라 달라 있습니까? (즉, 얼마나 많은 신용 카드 고객 X는?가 않습니다 모든 고객이 지난 달 지불 한 평균 금액이었다 어떤 대?)

나는 많은 둘러 보았다했지만 나는 내 질문에 대답 도움이 될 어떤 MongoDB의 스키마 모범 사례로 비틀 거림하지 않았다.

해결법

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

    1.당신은 확실히 당신이하고있는 쿼리를 최적화해야합니다.

    당신은 확실히 당신이하고있는 쿼리를 최적화해야합니다.

    여기에 귀하의 설명에 따라 나의 추측이다.

    당신은 아마 그래서 고객 개체 내에서 이들의 배열을 유지, 각 고객에 대한 모든 신용 카드를 알고 싶을 것이다. 당신은 또한 아마 각 지불에 대한 고객 레퍼런스를 갖고 싶어합니다. 이는 상대적으로 작은 지불 문서를 유지합니다.

    지불 객체는 자동으로 자신의 ID와 인덱스가됩니다. 당신은 아마 고객 기준에 인덱스를 추가 할뿐만 아니라 할 것입니다.

    이것은 당신이 신속하게 전체 고객 개체마다 시간을 저장하지 않고 고객이 지불을 검색 할 수 있습니다.

    이 같은 질문에 대답하려면 대신 /지도를 원하는 꽤 큰 데이터 집합 줄이기 위하여려고하고있다 "모든 고객이 지난 달 지불 한 평균 금액은 무엇". 이 응답 "실시간"점점 아닙니다. 당신은 고객에 대한 "참조"를 저장하는 충분한지도가-감소 이들에 대한 아마 것을 확인할 수 있습니다.

    그래서 직접 귀하의 질문에 대답하기 : IS MongoDB가 많은, 많은 작은 문서 또는 적은 수의 큰 문서를 선호하도록 설계?

    MongoDB를 매우 빠르게 인덱스 항목을 찾을 수 있도록 설계되었습니다. MongoDB를 큰 건초 더미에서 몇 바늘을 찾는 매우 좋다. MongoDB를은 건초 더미에서 바늘의 대부분을 찾는 매우 좋지 않다. 그래서 / 당신의 가장 일반적인 사용 사례 및 쓰기지도의 주위에 당신의 데이터를 구축 희소 사용 사례에 대한 작업을 줄일 수 있습니다.

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

    2.이 많은 작은 문서에 대한 설계와 같은 MongoDB를 자신의 문서에 따르면, 그것은 소리.

    이 많은 작은 문서에 대한 설계와 같은 MongoDB를 자신의 문서에 따르면, 그것은 소리.

    MongoDB의 성능 모범 사례에서 :

    제 1 부 : MongoDB의 스키마 설계를위한 엄지 손가락의 6 규칙에서 :

  3. ==============================

    3.시간이 지남에 따라 실질적으로 증가 문서는 시한 폭탄에 체크 할 수있다. 네트워크 대역폭 및 RAM 사용 가능성이 다시 시작하도록 강요 측정 병목이 될 것입니다.

    시간이 지남에 따라 실질적으로 증가 문서는 시한 폭탄에 체크 할 수있다. 네트워크 대역폭 및 RAM 사용 가능성이 다시 시작하도록 강요 측정 병목이 될 것입니다.

    고객 및 지불 : 먼저, 두 개의 컬렉션을 살펴 보자. 따라서, 입자가 매우 작은 : 지불 당 하나 개의 문서.

    당신은 신용 카드로, 계정 정보를 모델링하는 방법을 결정해야합니다 다음으로. 이제 새 계정 수집을해야하는지 여부를 고객이 문서는 계정 정보의 배열을 포함할지 여부를 생각해 보자.

    계정 문서는 모든 계정을로드, 고객 문서에서 별도의 메모리에 하나 개의 고객 인 경우 가져 오는 여러 문서가 필요합니다. 즉, 추가 메모리, I / O, 대역폭, CPU 사용으로 번역 할 수도 있습니다. 그 즉시 계정 수집이 나쁜 생각 의미합니까?

    당신의 결정은 지불 문서에 영향을 미칩니다. 계정 정보는 고객 문서에 포함되어있는 경우, 당신은 어떻게 그것을 참조하는 것? 별도의 계정 문서는 자신의 _id 속성을 가지고있다. 내장 된 계정 정보를 사용하여 응용 프로그램 중 하나를 계정에 대한 새로운 ID를 생성하는 것 또는 키의 계정의 속성 (예를 들어, 계좌 번호)를 사용합니다.

    지급 문서는 실제로 고정 기간에 수행 한 모든 지불 포함 할 수있다 (예를 들어, 하루에?). 이러한 복잡성은 읽고 지불 문서를 작성 모든 코드에 영향을 미칠 것입니다. 조기 최적화 프로젝트에 치명적일 수 있습니다.

    지불 문서가 하나의 지불을 포함로 계정 문서와 마찬가지로, 지불 쉽게 길이로 참조됩니다. 예를 들어 문서, 신용의 새로운 유형은 지불을 참조 할 수 있습니다. 그러나 당신은 신용 컬렉션을 만들 것입니다 또는 당신은 지불 내부 정보 신용 정보를 포함 할 것인가? 나중에 크레딧을 참조 할 필요하면 어떻게 될까?

    요약하자면, 나는 작은 문서와 많은 컬렉션의 많은 성공을 거두었 다. 나는 _id와 만 _id에 대한 참조를 구현합니다. 따라서, 내 응용 프로그램을 파괴 계속 성장하는 문서에 대해 걱정하지 마십시오. 스키마는 각 엔티티가 자신의 콜렉션을 가지고 있기 때문에 이해하고 인덱스 쉽다. 중요 기관은 다른 문서 안에 숨어되지 않습니다.

    나는 당신의 결과에 대해 듣고 싶어요. 행운을 빕니다!

  4. from https://stackoverflow.com/questions/3038703/mongodb-schema-design-many-small-documents-or-fewer-large-documents by cc-by-sa and MIT license