0

나는 뿌리 집합에 대해 토론하고 탐색 속성을 사용하여 자식 객체를 탐색합니다.MVC DDD EF 컴플렉스 자식 객체 탐색

시나리오 1 :

  • 고객은
  • 주소 연락처

고객이 여러 개의 주소를 가질 수있는 개체이고 주소가 여러 개있을 수 있습니다

  • 기업에게이다 집계 루트 콘택트 렌즈. 고객 ID를 사용하여 고객 저장소를 쿼리하고 고객 개체를 반환합니다.
    Dim customer as Customer = _customerRepository.GetById(request.Id) 
    

    우리는 고객을 ACESS해야하는 경우

    우리가 다음 아래와 같은 고객의 개체 내에서 주소를 통해 통과 해결합니다.
    Dim address as Address = customer.RetrieveAddress(request.AddressId) 
    

    이 접근

    는 자식 개체의 X 번호에 수행 될 것이다. 내가 보여준 예제는 단순한 것이지만, 수백만 개의 레코드를 포함하는 DB 테이블의 관점에서 보면, 일단 합계 루트 객체가 큐잉되어 반환 된 후에 여러 자식 객체를 통과 할 때 다른 사람들이 성능 문제로 어떻게 관리합니까?

    시나리오 2 : 위의 대신 고객 저장소를 쿼리하고 고객 객체를 반환

    같은 예를 들어, 우리는 대신 자식 개체를 반환합니다.

    Dim address as Address = _customerRepository.GetAddressById(request.AddressId) 
    

    이제 주소 개체를 쿼리 했으므로 고객 개체를 검색 할 필요가 없습니다. 비록 고객 저장소를 사용하여 주소 테이블을 직접 쿼리하고 주소 개체를 반환하는 것은 DDD를 따르는 경우 허용되는 것입니까? 아니면 시나리오 1을 사용하여 고객 리포지토리를 쿼리하고 집계 루트이고 고객 개체를 통과하는 고객 개체를 반환해야합니까?

    우리가 묻는 이유는 우리의 DB 다이어그램에 우리의 집계 루트를 통과 할 여러 테이블이 있고 잠재적으로 시간이 지남에 따라 수백만 개의 레코드가 포함되어 성능을 저하시킬 수 있기 때문입니다.

    네비게이션 속성을 사용하자마자 EF를 사용할 때 잠재적으로 100 개 이상의 쿼리를 보내는 각 하위 개체에 대한 쿼리를 전송하기 때문에 다른 사람들이 성능을 저하시키지 않으면 서 어떻게 DDD를 완벽하게 적용 할 수 있는지 궁금 할뿐입니다. for 루프에서.

    마이크

  • 답변

    1

    집계는 까다로운 비즈니스이며 집계 경계를 결정할 때는 많은 생각이 필요합니다. 질문 읽기 나는 DB 엔티티 관계가 아닌 행동을 기반으로 집계를 설계하고 있는지 잘 모르겠습니다. Eben이 말했듯이, 후자의 접근 방법으로는 그리 멀지 않게 될 것이고, 귀하의 집계는 결국 (자식 개체의 수를 기준으로) 상당히 커지게 될 것입니다.

    내가 주제에서 읽은 가장 통찰력있는 것들 중 하나는 Effective Aggregate Design by Vaughn Vernon입니다. 확실히 그것을 권하고 싶습니다. 그가 이야기하는 한 가지 중요한 사실은 집계를 가능한 작게 만드는 것입니다. 자연스럽게 성능에 도움이됩니다.

    자식이 엔티티 엔티티의 상태를 돌리면서 합병 루트를 통해 변경하지 않아야하므로 시나리오 2에서 수행 한 작업을 수행하지 않습니다. 이것은 불변성을 유지합니다. 즉, 값 개체이 될 가능성이있는 주소 개체를 사용하므로 성능상의 이유로 별도의 주소 저장소를 사용하는 것이 좋습니다.

    DDD로 시작하는 경우 디자인 선택에있어 여전히 실용적이어야한다는 점을 상기하는 것이 중요하다고 생각합니다. DDD는 모든 문제를 해결하지 못합니다. 대부분의 경우 설계 선택은 성능과 같은 것에 대한 절충입니다.

    1

    당신은 집계 :

    소유권은 반드시 집계를 추측하지 않습니다를 결정하는 ER 다이어그램을 사용하여 아주 멀리 얻을 수 없습니다. 단순히 관계 순회를 말하는 것입니다. 집계 루트는 까다로운 사업입니다. 내 사이트 에 이것에 대해 약간의 블로그했고 특히이보고 할 수 있습니다 :

    Natural vs. Synthetic Aggregates

    집계는 그 경계가 어디 있는지 결정하기 위해 특정 도메인 지식을 필요로 뚜렷한 경계를 가지고있다. 그 후에는 단순히 소유권 또는 약한 참조가됩니다.