는
좋은 생각을 읽습니다. 너 Command Query Responsibility Segregation(CQRS)의 길을 가고있는 것처럼 들린다. NoSql 데이터베이스는 뛰어난 읽기 저장소를 만듭니다. 이것은 내가 '콤보'(결합) 저장소에 의해 의미가 무엇인가 -
link 당신이 참조
는 SQL Server를 결합하고 MongoDB를이 자 NHibernate를 사용하여 업데이트하는 기술에 대해 설명합니다. "콤보 저장소"는 표준 패턴이 아닙니다. 저자 인용 :
물론 이론적으로 모든 데이터를 NoSQL 저장소로 옮길 수는 있지만 관계형 데이터베이스를 완전히 없애지 않으려면 어떻게해야할까요? 은 어떻게 함께을 결합 할 수 있습니까? 추측으로는 데이터 지속성 주위에 매우 일반적인 추상화 계층 인 Polyglot space
Repository Pattern에있을 수 있도록
당신은 Sql-Server
과 NoSql
데이터베이스를 모두 원래의 질문을 태그했습니다.
참조한 "결합"링크는 특히 다 대다 관계 (종종 SQL에서 접합 테이블이라고 함)의 문제를 해결하고 그러한 관계가 많을 때 성능에 미치는 영향을 해결합니다.
보다 일반적인 의미에서, NHibernate에서 차단 점을 제공하는 대신에 저장소 패턴을 통해 추상화 된 데이터 액세스를 할 수도 있고하지 않을 수도 있습니다.
public interface IWidgetRepository
{
Task<Widget> FetchWidget(string widgetKey);
Task SaveWidget(Widget toBeSaved);
}
가정 해 우리가 이미 SqlRepository 있습니다 :
다음은 C#에서 초 간단 (및 제네릭이 아닌) 저장소 인터페이스의
public class SqlWidgetRepository : IWidgetRepository
{
public async Task<Widget> FetchWidget(string widgetKey)
{
... Code to use Obtain an NHibernate session and retrieve and deserialize Widget
}
... Other methods here
}
당신은 또한 선택할 수있는 MongoDb
구현을 제공하기 위해
public class MongoWidgetRepository : IWidgetRepository
{
public async Task<Widget> FetchWidget(string widgetKey)
{
... Code to connect to a MongoDb secondary and Find() the
widget and deserialiaze into Widget
}
... Other methods here
}
두 데이터베이스를 동시에 유지 관리하려면 교활한, 여기이 "콤보"저장소 볼 수있는 방법의 예 : 위의 "콤보"저장소가 아니라 단일 시스템의 요구를 충족 할 수
public class ComboWidgetRepository : IWidgetRepository
{
private readonly IWidgetRepository _repo1;
private readonly IWidgetRepository _repo2;
public ComboWidgetRepository(IWidgetRepository repo1, IWidgetRepository repo2)
{
repo1 = repo1;
repo1 = repo2;
}
public async Task<Widget> FetchWidget(string widgetKey)
{
// Just need the one ... first one wins
return await Task.WhenAny(repo1.FetchWidget(widgetKey),
repo2.FetchWidget(widgetKey));
}
public async Task SaveWidget(Widget toBeSaved)
{
// Need both to be saved
await Task.WhenAll(repo1.SaveWidget(toBeSaved),
repo2.SaveWidget(toBeSaved));
}
(그리고 두 개의 데이터베이스를 유지하는 많은 다른 방법이 있습니다 동기화) .
그러나 CQRS는 엔터프라이즈 급 (즉, 많은 시스템과 많은 데이터베이스가있는 곳)에서 자주 사용됩니다.
Enterprise Service Bus에 대한 내 의견은 기업 전체에 데이터를 배포해야하는 경우에만 의미가 있습니다.
개념은 버스를 통해 (예를 들어, "위젯 추가")
- 명령은 트랜잭션 시스템에 대기하고 간단합니다.
- 시스템 처리 위젯은
Widget
시스템은 다음 새로운 위젯이 모든 관련 위젯 정보 (추가 된 것을 자세히 버스에 (방송) 메시지를 게시 (예 : 데이터베이스에 위젯을 삽입) 트랜잭션을 수행)
- 위젯에 대한 업데이트에 관심이있는 기업의 다른 시스템은이 메시지를 구독하고 자신의
Read Store
위젯 표현을 업데이트합니다 (예 : NoSql 데이터베이스 또는 캐시 및 가장 이해하기 쉬운 형식으로 업데이트).).
- 사용자가 이러한 다른 시스템에 액세스하고 '위젯'에 대한 화면을 볼 때 시스템은
Widget
시스템 자체에서 데이터를 요청하지 않고 자체 읽기 저장소의 데이터를 제공 할 수 있습니다.
포괄적 인 대답은 +1입니다. Combo Repository가 새로운 저장소에 사용되어야하고 NHibernate Interceptor/NHibernate Event Listener가 기존 저장소에 사용되어야한다고 말하는 것이 합당한가? – w0051977
원래 당신의 원래 질문은 관계형 DB 모델을 NoSql 문서로 반복하는 것이 었습니다. 두 가지 DB를 동기화하는 방법이 무엇이든간에 가장 쉬운 방법 인 간단한 시작을 제안합니다. (NoSql 데이터베이스의 사용 사례는 성능상의 이유로 관계형 데이터베이스의 캐시 일 가능성이 높습니다.)하지만 시스템이 커짐에 따라 테스트 할 수 있도록 두 저장소 (예 : SOLID 스타일)를 분리해야합니다. 앱이 한 시스템 이상으로 성장한 경우에만 CQRS 및 버스 기반 기업을 고려해야합니다. – StuartLC
내 독서는 cqrs가 단일 데이터베이스가있는 앱과 관련이 있음을 알려줍니다. 결국에는 명령과 쿼리가 있습니다. – w0051977