2012-08-31 1 views
5

CQRS는 도메인 모델에서 읽기 모델을 분리하고 필요한 모든 도메인 모델 프로젝션에 대해 특정 읽기 모델을 사용한다고 주장합니다.CQRS : 수요에 따라 작성된 모델을 읽으시겠습니까?

사용 시점에서 읽은 모델을 저장하고 검색하는 방법은 투명해야합니다. 쿼리를 생성하고 작성 방법을 신경 쓰지 않고 읽기 모델을 얻습니다.

많은 예제와 아티클은 읽기 모델을 저장하고 도메인 모델 변경에 대한 응답으로이를 다시 생성하기위한 별도의 테이블을 사용합니다.

나는 다음과 같은 이유로 인해이 방법처럼 정말 수행 가능한 모든 읽기 모델이 종종 필요하지 않습니다

  • ;
  • 요구 사항을 변경하면 기존 읽기 모델이 무효화되어 모든 읽기 모델을 다시 생성해야 할 수 있습니다.
  • 어떤 이유로 읽기 모델에 세대에 저장할 수없는 속성이 있지만 계산해야하는 경우 저장 프로 시저/함수/뷰를 사용해야합니다.
  • 응용 프로그램 수준 캐싱이 도메인 모델 변경에 사용되는 경우 읽기 모델이 도메인 모델과 별개이므로 이전 읽기 모델을 캐시에서 제거해야한다고 모든 응용 프로그램에 알릴 필요가 있습니다.
  • 복잡한 개체 그래프를 완전히 비정규 화하는 것이 불가능할 수도 있으므로 특정 도메인 엔터티 버전에 대해 일관성있는 모델을 읽어야합니다. 즉, 동일한 트랜잭션에서 생성해야합니다.
  • 일부 도메인 엔티티는 자주 변경되지만 모든 읽기 모델에 포함되어야하는 속성이 있습니다. 내가 쿼리 서비스를 가지고 생각하고이를 바탕으로

해야 : 도메인 엔티티의 간단한 전망을 자주 생성해야 및/또는 숙지 모델의 경우

  • 는 : 보관하지만, 그것들을 생성하지 않는 ORM을 통해 데이터베이스의 도메인 모델 엔티티를 쿼리합니다.
  • 빈번하게 생성 될 필요가없고 복잡한 도메인 엔티티 예측이 생성하여 데이터베이스 테이블에 저장하는 읽기 모델의 경우.

또한 일부 사람들은 읽은 모델을 얼룩으로 저장하는 것이 좋습니다. 읽어들이는 모델을 얼룩으로 저장하는 문제는 인덱스를 검색 할 필요가있을 때 인덱싱을 위해 속성을 추출해야하고 전체 텍스트로 검색 할 필요가있는 경우에도 전체 텍스트로 이해할 수있는 형식으로 저장해야한다는 것입니다. 도구.

기본적으로 쿼리 실행 후에 만 ​​존재하며 도메인 변경 이벤트를 기반으로 생성 된 모델을 읽길 원합니다. 이 솔루션이 CQRS에 적합한가? 내가 CQRS를 조사하는 이유는 캐싱 가능한 뷰 모델을 사용자 작업 처리와 분리하고, AJAX에서 사용자 작업 후 비동기 업데이트를 사용하도록 설정하고, 주니어 개발자가 비즈니스 로직을 모두 배치하여 유지 보수 할 수없는 코드를 생성 할 수있는 공간을 줄이는 것입니다. 장소에 그리고 심지어 CQRS의 비 충실한 실행은 나에게 올바른 방향으로 나아가는 것처럼 보입니다.

답변

11

CQRS는 이 필요합니다. 읽기 모델이 별도의 테이블 (또는 문서 데이터베이스를 사용하는 경우 문서)에 저장되어 있어야합니다. 이는 종종 좋은 접근 방식이며 이벤트 소싱과 함께 잘 작동합니다.읽기 모델 의 경우 데이터베이스 뷰 또는 ORM 쿼리로 백업 할 수 있습니다.

이것은 레거시 시스템의 일부에 CQRS를 도입 할 때 좋은 접근 방법 일 수 있습니다.

여기에 제안 된 방법이 예전에 제안되었습니다 (예 : this post by Ayende 참조). 나는 그것이 "얇은 읽기 모델"또는 유사하다고 생각합니다. 나는 그것을 위해 간다고 말할 것입니다.

당신은