RDBMS (예 : SQL Server)를 사용하여 이벤트 소싱 데이터를 저장하는 경우 스키마는 어떻게 생겼을까 요?
나는 추상적 인 의미에서 몇 가지 변이를 보았지만 구체적인 것은 아니다.
예를 들어 "제품"엔터티가 있고 해당 제품에 대한 변경 사항은 가격, 비용 및 설명의 형태로 제공 될 수 있습니다. 내가 다음과 같은지에 대해 혼란 스럽습니다.
- 제품에 대한 모든 필드가 포함 된 "ProductEvent"테이블이 있습니다. 여기서 각 변경은 해당 테이블의 새 레코드를 의미하고 "누가, 무엇을, 어디서, 왜, 언제, 어떻게"(WWWWWH)를 적절하게 의미합니다. 비용, 가격 또는 설명이 변경되면 제품을 나타내는 완전히 새로운 행이 추가됩니다.
- 외래 키 관계를 사용하여 제품 테이블에 조인 된 별도의 테이블에 제품 비용, 가격 및 설명을 저장합니다. 이러한 속성이 변경되면 적절하게 WWWWWH로 새 행을 작성합니다.
- WWWWWH와 이벤트를 나타내는 직렬화 된 개체를 "ProductEvent"테이블에 저장합니다. 즉, 지정된 제품에 대한 응용 프로그램 상태를 다시 빌드하려면 이벤트 자체를 내 응용 프로그램 코드에서로드, 역 직렬화 및 재생해야합니다. .
특히 위의 옵션 2에 대해 걱정합니다. 극단적으로 생각해 보면 제품 테이블은 속성 당 거의 하나의 테이블이 될 것입니다. 여기서 주어진 제품에 대한 애플리케이션 상태를로드하려면 각 제품 이벤트 테이블에서 해당 제품에 대한 모든 이벤트를로드해야합니다. 이 테이블 폭발은 나에게 잘못된 냄새가 난다.
나는 "상황에 따라 다르다"고 확신하고 "정답"은 하나도 없지만 받아 들일 수있는 것과 완전히 받아 들일 수없는 것에 대한 느낌을 얻으려고 노력하고 있습니다. 또한 NoSQL이 여기에서 도움이 될 수 있음을 알고 있습니다. 여기서 이벤트는 집계 루트에 대해 저장 될 수 있습니다. 즉, 개체를 다시 빌드 할 이벤트를 가져 오기 위해 데이터베이스에 대한 단일 요청 만 수행 할 수 있습니다. 순간 그래서 나는 대안을 찾고 있습니다.