2012-07-19 5 views
18

작동/트랜잭션 유형의 응용 프로그램에서 작업 할 경우 DDD가 자연 스럽다는 것을 발견했습니다. 그러나 나는 항상 합리적인 방법으로보고 유형의 함수를 처리하는 stucked입니다.도메인 기반 디자인은 어떻게보고를 처리합니까?

내가 말하는 내용은 보고서 작성에 한정되지 않고 비교적 복잡한 쿼리를 수행하는 기능입니다. (예 : 상인이 수행 한 모든 주문의 요약을 제공하거나 특정 재고가있는 거래 계좌에 대한 계정 요약을 표시하는 것). 그것들은 단순히 이러한 쿼리와 함께 사용되는 쿼리 또는 지원 기능 일 수 있습니다.

이러한 함수의 경우 SQL (또는 다른 쿼리 언어)에서 조인을 수행하고 관심있는 열을 가져 와서 마사지 된 결과 집합을 반환하면 매우 자연 스럽습니다. 그러나 DDD를 사용하면 그렇게 잘 진행되지 않을 것입니다. 특별한 저장소가 필요하거나 기존의 가장 관련있는 저장소가 특수한 "엔티티/값 개체"(특수 결과 집합)를 반환해야합니다. 이러한 종류의 특수한 엔티티는 실제로 도메인 의미가 없습니다.

의미있는 도메인 계층을 사용하려는 경우 다른 저장소에서 많은 추가 조회가 생성되고 도메인 또는 서비스 계층에서 많은 집계 작업이 발생하여 성능 저하가 쉽게 발생할 수 있습니다.

"DDD 경로"를 거치지 않고 DB에서 보고서 데이터를 가져 와서 표시 결과를 작성하는 이러한 종류의 기능에 다른 "경로"가 있다고 생각했습니다. 그러나 응용 프로그램을 불필요하게 복잡하게 만들뿐만 아니라 전통적인 DB 지향 개발에 익숙한 개발자가 적절하지 않은 경우에도이 경로를 사용하는 경향이있는 추가 경로를 제공합니다.

나는 그런 상황이 꽤 일반적이라고 생각했다. (보통 큰 시스템은 운영뿐만 아니라보고 및 조회 기능을 포함하지 않을 것이다.) 나는 사람들이 그것을 어떻게 다루고 있는지 알고 싶다.

답변

2

최근 시스템 개발을 위해 DDD를 사용하고 있습니다. 나는 당신과 같은 우려를 가지고 있었지만 결국 CQRS (Command Query Responsibility Segregation) [Fowler, Young, Dahan]를 위해 정착했습니다. 그것은 쿼리를위한 "DB 경로"가 필요하지만, 나는 명령에 대한 DB (도메인 상태를 변경하는 것들)에 직접적으로 유혹을 느끼는 것을 전혀 느끼지 못한다. 분리는 매우 명확합니다. 명령은 도메인을 통과하고, 쿼리는 DB로 직접 이동합니다.

+0

솔직히 어느 것이 옳은지 결정하기가 어렵지만 CQRS를 사용하는 것이 가장 합리적인 것처럼 보입니다. (그리고 나는 domaindrivendesign.org에서도 가장 확실한 답변입니다) –

1

하나의 접근법은 앱의 데이터 저장소에있는 데이터 피드를 실행하여 다른 관계형 데이터로 다른 데이터 사본을 저장하는 별도의보고 시스템을 사용하는 것입니다.

내가 사용한 단축키는 조인 된 데이터를 간단한 바보 같은 개체로 반환하는보기 또는 저장 프로 시저를 만드는 것입니다.

+0

사실 내 두 가지 제안은 내 원래의 질문에서 제안한 것입니다. 내 걱정을 해결하기 위해 몇 가지 설명이나 근거를 갖고 싶습니다. 그리고 다시 강조하기 위해 내가 말하고있는 "보고"는 "보고"일 필요는 없으며 운영 기능과 밀접하게 사용되는 일부 조회 기능입니다. –

0

비교적 복잡한 쿼리입니다. (예 : 상인이 수행 한 모든 주문의 요약을 제공하거나 특정 주식을 보유한 거래 계좌에 대한 계좌 요약을 표시하는 것)

리포지토리는 이러한 작업을 수행하는 것이 일반적입니다. 이 방법을 효율적으로 구현하는 방법에 대해 걱정하고 있다고 생각합니다. 그 대답은 "게으른로드"입니다.

예를 들어, "거래자가 수행 한 모든 주문에 대한 요약"을 예로 들어 봅시다. "요약"은보고 작업이므로 무시하겠습니다. 도메인 태스크는 "상인에 대한 모든 주문 찾기"입니다. 다음과 같은 저장소 방법을 사용할 수 있습니다.

List<Order> findOrdersByTrader(Trader trader); 

각 주문에 대한 최소한의 (요약) 정보 만로드하여 구현할 수 있습니다. 저장소 인터페이스를 Order 엔티티에 삽입하면 엔티티 자체가 저장소를 호출하여 필요할 때 추가 하위 엔티티를로드 할 수 있습니다.


업데이트 : 귀하의 의견은 문제를 명확하게 - 나는 집계 일부 이전 오해. 마치 "주문 요약"이 실제로 귀하의 도메인에 속한 것처럼 보입니다. 때로는 개념이 도메인의 일부라는 것이 분명하지 않지만 사용자가 이야기하는 기능 ("이 상인이 수행 한 주문 요약을보고 싶다")이 수행 할 수있는 기존 객체가 없다면 이는 도메인에서 숨겨진 개념의 신호입니다. 결국 일부 개체는 "각 주식의 주문 수"를 추적해야하며이 개체가 도메인의 일부가 될 수있는 이유가 없습니다.

+1

하지만 정확히 내가 두 번째 대안 인 도메인 모델을 사용하고 도메인/서비스 계층에서 집계 등을 수행하는 것을 걱정하고 있습니다. 예를 들어,이 함수는 상인이 배치 한 각 주식의 주문 수를 말해야합니다. 우리가 질의를 할 수 있다면 아마도 수십 가지의 결과를 가진 "비교적 복잡한"SQL (복잡한 것은 아니지만) 일 것입니다. 우리가 상인의 모든 주문 실체를 얻고 집계를한다면, 그것은 수천의 기록을 얻는 것과 같습니다. 성능 차이가 아주 분명합니다. (여전히 단순화 된 사례로 말하고 있습니다) –

+0

@AdrianShum : 내 업데이트를 참조하십시오. – casablanca

18

DDD보고의 경우 대부분의 경우 도메인 기반 디자인이 과도하게 사용되는 별도의 경계 컨텍스트와 지원 하위 도메인이 있습니다. DDD의 가장 중요한 개념을 기억하십시오. 핵심 도메인에 모델링 노력을 집중시키고 가능한 가장 간단한 솔루션을 사용하여 다른 모든 것을 구현하십시오.