두 데이터 소스 간의 긴밀한 연결을 줄이는 방법


10

다음 아키텍처 문제에 대한 적절한 솔루션을 찾는 데 문제가 있습니다.

에서 우리의 설정 (아래 스케치) 우리는 데이터 소스 A는 Foo 타입의 항목에 대한 기본 소스 2 데이터 소스를 가지고있다. Foo에 대한 추가 정보를 검색하는 데 사용할 수있는 보조 데이터 소스가 있습니다. 그러나이 정보가 항상 존재하는 것은 아닙니다.

또한 데이터 소스 A를 사용하여 Bar 유형의 항목을 검색 할 수 있습니다. 그러나 각 막대는 Foo를 나타냅니다. 여기서 어려움은 각 막대가 사용 가능한 경우 데이터 소스 B에 의해 보강 된 정보를 포함하는 Foo를 참조해야한다는 것입니다.

내 질문은 : SubsystemA.1과 DataSourceB 사이의 단단한 결합을 제거하는 방법입니다.

http://i.stack.imgur.com/Xi4aA.png


10
아름다운 스케치입니다. 어떤 프로그램을 사용하여 그렸습니까?
Marcelo MD

또한 어떤 프로그램을 사용하여 그 프로그램을 사용했는지 알고 싶습니다. 부디.
Tulains Córdova

2
yuml.me 는 그가 다이어그램을 작성하기 위해 사용했던 사이트보다 더 많이 사용했습니다.
Jason Turner

1
되지 않은 DataSourceADataSourceB분리 이미? DataSourceA모두에 대한 종속성이 SubSystemA.1하고 SubSystemA.2, 그러나에를 DataSourceB.
Tulains Córdova

1
@fstuijt 아니오, 그렇지 않습니다. 당신이 수정 한 경우 SubsystemA.1가 아닌 다른 뭔가를 사용 DataSourceB, DataSourceA모르겠다. 방법 이있는 DataSourceA것만 신경 쓰십시오 . 와 사이에 추상화가 있습니다. SubsystemA.1getFoo(id)DataSourceADataSourceB
Tulains Córdova

답변:


3

나는 거의 동일한 데이터 아키텍처를 가진 앱을 만들었습니다. 우리는 대부분의 자동화 및 내부 일상 정보를 포함하는 현장 SQL 데이터베이스를 보유한 다음 영업, 계정 관리, 현장 직원 등에 사용되는 타사 클라우드 서비스를 보유하고 있습니다. 헬프 데스크는 고객의 실제 위치와 관련된 정보를 모두 필요 장비를 사용하고 들어가기 전까지 두 개의 서로 다른 응용 프로그램에서 가져 왔습니다.

길고 짧은 것은 한 데이터 소스가 다른 데이터의 레코드를 참조해야한다는 것입니다. 우리의 경우, 타사 클라우드 데이터에는 온 사이트 데이터에 대한 참조가 포함되어 있습니다. 이것이 우리가 가장 많이 통제 한 배열이기 때문입니다. 이제 어느 한 데이터 소스의 레코드에 대한 ID로 두 데이터 모두에서 데이터를 얻을 수 있습니다. 클라우드 ID를 사용하면 클라우드에서 레코드를 가져 와서 현장 ID를 가져오고 현장 데이터를 가져옵니다. 온 사이트 ID를 사용하면 해당 ID를 기반으로 두 데이터 소스를 모두 폴링합니다.

내 시스템에서는 도메인 계층에서 두 개체를 다른 개체의 자식으로 만들지 않았습니다. 두 상점 모두에서 데이터를 사용하면 두 개의 오브젝트 인스턴스를 유지해야합니다. 어느 쪽도 존재하지 않을 수 있습니다. 그래서 제가 그렇게 했어요. 앱은 클라우드 데이터 또는 온 사이트 데이터 또는 둘 다와 만 작동하며 데이터가 적을수록 더 많은 제한이 있습니다.

그러나 특히 한쪽이 항상 존재한다고 확신하는 경우에는 변경하기가 어렵지 않습니다. 데이터가 항상 존재하는면, 즉 다른 데이터 저장소의 레코드를 나타내는 개체 유형을 나타내는 속성을 개체에 포함하기 만하면됩니다. 두 개의 그래프를 하나의 고급 "병합"할 수 있습니다.

이런 종류의 배열은 반드시 어떤 수준에서 연결되어야합니다. 두 데이터 저장소와 인터페이스 할 수있는 DAL이 있거나 데이터 저장소 당 하나씩 DAL을 세그먼트화할 수 있으며 Controller와 같은 상위 계층이 각 데이터를 가져 와서 함께 스냅 할 수 있습니다. 그러나 어떤 수준에서 프로그램은이 두 개의 서로 다른 데이터 소스의 데이터를 결합 할 수있는 영리한 능력을 갖추어야합니다.

대부분의 경우 데이터의 정확한 위치를 추상화하여 필요한 커플 링을 줄일 수 있습니다. 생성 된 클래스의 인스턴스로 제공되는 웹 서비스에서 데이터를 가져 오는 경우 서비스 클래스의 딥 카피를 사용자가 제어하는 ​​대상으로 만들기 위해 변환기를 배치하십시오. 데이터의 경우 변경하지 않아도됩니다. 소스가 수행합니다 (스키마가 수행하는 경우에만).

이제 이것은 큰 사업이 될 수 있습니다. 우리가 사용하는 클라우드에는 수십 개의 도메인 클래스가 있으며 그중 일부에는 수백 개의 데이터 필드가 있으며 여기에는 키커가 있습니다. 다른 클라우드 또는 다른 원격으로의 이동을 수용하기 위해 추상 데이터 유형을 크게 변경해야 할 수 있습니다 데이터 소스. 그런 이유로, 나는 귀찮게하지 않았다; 생성 된 웹 서비스 도메인을 직접 사용하고 이제 클라우드에서 오프 사이트 (하지만 우리의 통제하에있는) 데이터 저장소로의 변경이 이루어지고 있습니다. 세부 정보는 아직 알지 못합니다. 단순히 양식을 변경하려고합니다. 새로운 스키마 및 / 또는 데이터 객체를 반영하기 위해 데이터가 "결합"되는 앱의 코드 숨김. 어떤 식 으로든 슬라이스하는 것은 큰 일입니다.


이 답변은 내가 겪은 문제를 가장 잘 다루고 있으며 지금까지 가장 좋은 답변을 제공합니다. 그러나 여러 소스의 데이터를 결합하는 것이 일반적인 문제라고 생각합니다. 도움이 될만한 디자인 패턴이 있습니까?
fstuijt

1
팩토리 패턴의 일부 변형이 유용 할 수 있습니다. CloudInvoice 및 SqlInvoice 객체 (각 해당 데이터 소스에서)가 있고 단일 통합 송장을 작성하려는 경우, 작성하려는 레코드의 각 절반을 검색하기 위해 두 데이터 소스에 대해 충분히 알고있는 팩토리를 작성하십시오. 정보를 도메인 클래스로 병합합니다.
KeithS

4

이를 처리하는 한 가지 방법은 한 곳에서 두 데이터 소스의 데이터를 포함하는 집계 된 데이터 소스를 만드는 것입니다. 소스 A및의 변경 사항을 확인하고 B집계 데이터 소스에 "델타"를 기록하기 위해 작업이 주기적으로 실행됩니다 . 이것은 밀접하게 연결된 두 개의 데이터 소스를 단일 코 히어 런트 데이터 소스로 변환합니다.

여러 가지 방법으로이 방법을 사용할 수 없습니다.

  • 데이터의 양이 금지 될 수있다 -의 전체 사본 AB요구는 공간 요구 사항을 배가 할 수 있습니다.
  • 실시간 데이터 -소스의 데이터가 변경된 시간과 집계 작업이 집계 된 소스로 데이터를 전파 한 시간 사이에 기간이 있습니다.
  • 원래 소스와 데이터를 조정해야합니다 .이 방법을 사용하면 변경 사항을 원래 위치로 다시 이동하는 작업이 훨씬 더 복잡해집니다.

I는 추상화 계층을 도입하는 것은 바람직한 방법 동의
neontapir

2
데이터를 복사하지 않고 추상화 계층을 가질 수 있습니다.
smp7d

@ smp7d 멋진 프론트 엔드 뒤에 커플 링을 숨길 것입니다. 그러나 시스템에서 이미 이와 같은 작업을 수행하고 있다고 가정했습니다. 그렇지 않으면 전체 디자인에 복잡성이 분산되기 때문입니다.
dasblinkenlight

DB 환경에 따라 하나 이상의 뷰로 처리 할 수있어 데이터를 복사 할 필요가 없습니다.
Walter

되지 않은 DataSourceADataSourceB분리 이미? DataSourceA모두에 대한 종속성이 SubSystemA.1하고 SubSystemA.2, 그러나에를 DataSourceB.
Tulains Córdova

1

최상위 수준에 두 가지 유형이 있다는 것을 보인다 푸와 바, 그리고 당신은 두 개의 최상위 행동을 가지고 findFoo(...)findBar(...). 이것이 I / O 계층에 대한 인터페이스입니다.

: 데이터 소스 귀하의 설명 A의 두 가지 방법이 있다는 것을 의미 findFoo하고 findBar와 B에 대한 하나의 방법은 : findFooAuxiliaryInformation. 에서 findFoo당신은 A와 B의 정보를 병합해야합니다

나는 당신이 말하는 "꽉 커플 링"을 확실하지 않습니다. 이 두 데이터 세트에 포함 된 세 가지 데이터 유형은 다음과 같습니다 Bar, Foo그리고 FooAuxData. 입력 데이터 Foo와 의 결합 FooAuxData은 입력 데이터에 내재되어 있으므로 줄일 수 없습니다. 그러나 그 결합은 findFoo방법 에만 나타나야합니다 . 그것이 당신이 할 수있는 최선입니다. 요구 사항은 한 곳에서 구현됩니다. 변경되면 해당 코드를 변경해야합니다.


0

당신은 할 수 없습니다.

내가 제대로 이해하는 경우 FooBar출신 dsA. Bars에 속해 Foo있습니다.
바람직하게는, 당신이 원하지 않는 Bar할당의 Foo가되지 않는 한,들 Foo에 의해 보충 된 Foo.enhancedInfo그에서 비롯됩니다 dsB.

Bars를 할당하는 것을 선호 Foo하는 것은 타이트한 커플 링을 만드는 것입니다. 나는 당신이 특정한 길을 강요하는 "요구 사항 도전"으로서 자격을 부여 할 것입니다.

따라서 기술적 인 문제는 dsB주어진 정보에 대한 정보 FoodsB있거나 없을 수도 있고 심지어는 사용할 수없는 것입니다.

당신이 선호하는 Foo.enhancedInfo것이 얼마나 힘들고 빠른지 결정해야합니다 . 해당 요구 사항에 따라 Foo+ Bar개체 를 제공할지 여부를 결정할 수 있습니다 . 비 강화 Foo가 제공되도록 허용하면 논리가 복잡해지며 선호도가 표시되는 것만 큼 엄격하지 않다는 것을 알려줍니다. 변종 결정 Foo, Foo.enhancedBar응용 프로그램 (들)이 지원할 수있는 당신이 당신의 궁극적 인 답을해야합니다.

Foo관련 정보를 더 가깝게 이동시키기 위해 수행 할 수있는 다른 작업이 있으며 이러한 문제 중 일부를 해결할 수 있습니다. 질문이 표현되는 방식은 데이터 객체 수준에서 문제를 다루는 것처럼 들리며 인프라 유형 변경을 고려하지 못할 수 있습니다.


다른 방법으로 '라운드 : 푸는 바에 속한다
fstuijt

@ fstuijt 내 답변을 조금 업데이트하겠습니다. 기본적으로 동일하게 유지됩니다. Bar + Foo를 어떻게 서버 업할 것인지 결정해야합니다.

0

데이터 소스 B의 데이터가 자체적으로 독립 할 수없는 경우 가능하면 데이터 소스 A로 데이터를 마이그레이션 할 수 있습니다.

독립적이지만 관련이있는 경우 데이터 가상화를 조사해야합니다 . 이를 통해 응용 프로그램은 데이터를 하나의 세트 (적절한 경우)로 독립적으로 처리 할 수 ​​있습니다. 플랫폼에 따라이를 구현하는 데 도움이되는 기존 프레임 워크 / 라이브러리가있을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.