2013-04-05 2 views
0

클라이언트 관리 웹 응용 프로그램을 작성하고 있습니다. 내 고객 - 지불 관계를 관리하는 올바른 방법을 알아 내려고 노력 중입니다. 하루에 한 번 응용 프로그램이 다른 API로 요청을 보내고 데이터베이스에 저장 한 각 클라이언트의 지불 금액을 동기화합니다. 나는 끊임없이 고객의 유형 (contract_type, sale_date 등)에 따라 지불 (지불액)에 관한 보고서를 실행해야합니다. 이미 clients 컬렉션이 있습니다. 나는 두 스키마 사이에 선택하려고 :MongoDB 스키마 디자인 (중첩 배열 대 별도 컬렉션)

{ 
     "client_id": "asdf123", 
     "client_last_name": "BB", 
     "address": "123 Main St", 
     "city": "ATLANTA", 
     "payments_history": [ 
     { 
      "contract_number": "asdf123", 
      "payment_date": ISODate("2012-09-02T07:00:00.0Z"), 
      "amount": 103.33, 
      "payment_number": NumberInt(1) 
     }, 
     { 
      "contract_number": "asdf123", 
      "payment_date": ISODate("2012-09-30T07:00:00.0Z"), 
      "amount": 103.33, 
      "payment_number": NumberInt(2) 
     }, 
     { 
      "contract_number": "asdf123", 
      "payment_date": ISODate("2012-11-04T07:00:00.0Z"), 
      "amount": 103.33, 
      "payment_number": NumberInt(3) 
     } 
     ] 
    } 

각 문서가 payment입니다 분리 수거 "payments"를 작성 수스. 이러한 데이터를 분리하는 것이 더 좋다고 생각합니다. 각 쿼리마다 엄청난 양의 데이터를 하나씩 증가시킬 것이기 때문에 (특정 필드를 선택하는 경우 여전히 많은 메모리가 필요합니다). 그러나 다른 한편으로는 (두 개의 서로 다른 컬렉션의 데이터를 기반으로하므로) 집계 보고서를 실행할 수 없습니다. 가장 좋은 방법은 무엇입니까? 서버 측 (PHP)에서 두 개의 다른 쿼리를 사용하여 이들을 분리하고 집계해야합니까?

+0

MongoDB 나 NoSQL을 사용하는 경우 매우 솔직하게 볼 수 있습니다. 매우 직관적 인 관계형 케이스처럼 보입니다. –

+0

알 수없는 필드와 같이 시간이 지나면 변경 될 수있는 복잡성이 있습니다. NoSQL을 사용하는 올바른 방법은 무엇입니까? – castt

+0

SQL의 제한 사항 중 일부에 대해 이미 부딪힌 것처럼 들립니다. 그러나 개별 레코드에 고정 스키마가 없다고 말한 것처럼 여전히 최상의 솔루션 일 수 있습니다. 나는 아래에 답을 쓸 것이다. –

답변

0

실제로 클라이언트 컨텍스트 (예 : 집계 된보고) 이외의 결제 데이터에 대해 문의해야하는 것처럼 들리므로 각 개별 지불 항목을 클라이언트 컬렉션 개체에 추가하고 싶지 않습니다.

지불 오브젝트 콜렉션을 작성한 다음 지불 오브젝트의 클라이언트 오브젝트에서 지불 키를 참조하고 지불 오브젝트의 클라이언트 키를 참조하여 어느 한쪽에서 다른 오브젝트를 연관시킬 확실한 f}을 갖게됩니다 클라이언트에게 결제에 매핑하는 세 번째 컬렉션이 있어야합니다.

여기서 바람직한 것은 실제로 액세스 패턴에 따라 달라질 수 있습니다. 예를 들어 관계를 설정해야하는 경우 조회가 항상 한 방향이 될 경우 두 세트의 오브젝트에 "외래 키"가 필요하지 않을 수도 있습니다.

+0

집계 중에 두 개의 콜렉션 문서를 "외래 키"(DBRef)로 연결하려는 목적이 무엇입니까? – castt