2012-01-10 4 views
2

CQRS의 읽기 편이 우리가 작성한 대형 문서 관리 응용 프로그램 (비디오/pdf 파일/etc)에서 어떻게 작동하는지 이해하려고합니다.큰 데이터 세트에 대한 사용 권한으로 읽을 때 CQRS

사용자가 수정 권한이있는 모든 문서의 목록 표시 (즉, 사용자가 편집 할 수있는 모든 문서 표시). 특정 사용자가 편집 할 수있는 10,000,000 개의 문서가있을 수 있습니다.

일반적으로 나는 하나의 "테이블"(플랫 구조)이 대부분의 화면에서 충분하고 권한으로 테이블 당 역할을 가질 수 있다고 읽었습니다.

특정 사용자에 대해 편집 할 수있는 문서를 신속하게 가져올 수 있도록 읽음 모델을 어떻게 디자인합니까?

현재 내 문서를 들고있는 테이블을 볼 수 있으며, 다른 사용자는 사용자와 문서 간의 "편집"역할을 연결하는 다른 테이블을 보유하고 있습니다. 그래서이 스크린의 데이터를 얻기 위해 조인을하고 있습니다. 또한

이이 경우에 올바른 방법인가를보고, 삭제하는 역할이 될 수 있을까?

JD는

답변

4

당신은 각각의 비정규 문서 정보와 함께 사용자 ID를 가지고 평평한 테이블을 제공 할 수 있습니다.

SELECT * FROM documents_editable_by_user WHERE UserId = @UserId 
SELECT * FROM documents_deletable_by_user WHERE UserId = @UserId 
SELECT * FROM documents_visible_for_user WHERE UserId = @UserId 

독자는 읽기 모델 저장소에서 사용자 당 테이블/목록을 동적으로 만들 수도 있습니다. SQL 기반의 읽기 저장소에서 NoSQL으로 전환하면 매우 간단 해집니다. (아직 입력하지 않은 경우)

특히 수만개의 문서가 사용자가 볼 수 있거나 편집 할 수있는 경우, 병합 된 테이블은 조인과 비교하여 실제 성능이 향상되었습니다.

+0

Dennis에게 답장을 보내 주셔서 감사합니다. 비정규 화 된 데이터로 SQL 기반 라우트를 간다면, 우리는 100,000 개의 문서를 말하고 단일 사용자는 가능한 300,000 개의 가능한 레코드를 가지며, 사용자가 편집/삭제 /보기 할 수 있습니다. 지금 우리에게 10 명의 사용자가 있다면 3 백만 달러가 있습니다 ... 제가 요점을 놓치지 않는 한, 이것은 성능 및 유지 보수 (업데이트) 측면에서 악몽이 될 것입니다. 그래서 내가 별도의 테이블을 사용하여 데이터를 결합하는 것에 대해 생각하고있었습니다. –

+1

필자는 귀하의 데이터와 귀하가 선택한 RDBMS에 대해 충분히 알지 못합니다. 하지만 이것을 고려해보십시오 : 100,000 개 이상의 항목에서 이중 조인을 수행하는 대신 300,000 개의 항목으로 하나의 비정규 화 테이블을 쿼리하는 것이 더 빠를 수 있습니다. 성능 측면에서 볼 때, 특히 작은 테이블을 여러 개 조인하는 것보다 큰 테이블을 쿼리하는 것이 더 빠릅니다. 특히 적절한 인덱스가있는 경우 더욱 그렇습니다. 그리고 업데이트에 관해서는, CQRS에서도 어쨌든 비동기 이벤트 핸들러에 의해 처리 될 것입니다. –

+0

데니스에게 도움을 주셔서 감사합니다. 나는 네가 말한 것을 모두 가져 갔다. –

1

필자는 필터링 검색 양식 (의도하지 않은 말)의 형태를 취한 읽기 모델을 사용할 때 인증 서비스의 기반으로 rhino-security를 ​​사용했습니다.

인증 서비스 테이블이 SQL Server의 pub-sub 시스템과 SQL Server 에이전트를 통해 부분적으로 비정규 화 된 데이터를 표시하는 클라이언트로 푸시되도록 시스템을 구성했습니다. 그러면 Rhino.Security이 인증 모델에 함께 참여하게합니다. 읽기 모델, 사용자 별. 나는 기본적으로 읽기 모델에서 읽기 모델의 권한 테이블에 쓴 적이 있기 때문에 인증은 서비스를 통해 변경 되었기 때문에

, 우리는, 권한 서비스의 데이타베이스와 논리에 좋은 캡슐을 가지고, 그것은 전 세계적으로 독특하고 특정 서비스 (일관성있는). 이는 고급 (계층 적 엔티티, 사용자 그룹, 사용자, 권한, 엔티티 권한 별) 권한 요구 사항을 처리하기위한 사용자 정의 GUI가이 권한 부여 모델에 대해 여전히 CRUD를 수행 할 수 있고 모든 실시간 모델에서 읽기 전용 모델로 푸시된다는 것을 의미합니다.