İki veri kaynağı arasındaki sıkı bağlantı nasıl azaltılır


10

Aşağıdaki mimari soruna uygun bir çözüm bulmakta sorun yaşıyorum.

In our ayarı (aşağıda kabataslak) biz veri kaynağı A tipi Foo öğeler için birincil kaynaktır 2 veri kaynakları, var. Bir Foo hakkında ek bilgi almak için kullanılabilen ikincil bir veri kaynağı vardır; ancak bu bilgi her zaman mevcut değildir.

Ayrıca, veri kaynağı A, Bar tipi öğeleri almak için kullanılabilir. Bununla birlikte, her bir Bar bir Foo'ya işaret eder. Buradaki zorluk, her bir Çubuğun, mevcutsa, veri kaynağı B tarafından artırılan bilgileri de içeren bir Foo'ya başvurmasıdır.

Benim sorum: SubsystemA.1 ve DataSourceB arasındaki sıkı bağlantı nasıl kaldırılır?

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


11
Bu çok güzel bir eskiz. Çizmek için hangi programı kullandınız?
Marcelo MD

Ayrıca çizmek için hangi programı kullandığınızı bilmek istiyorum. Lütfen.
Tulains Córdova

2
yuml.me , diyagram oluşturma olasılığı daha fazla kullandığı alandır .
Jason Turner

1
Olmadınız DataSourceAve DataSourceBayrılmış zaten? DataSourceAHer iki bağımlılık üzerinde SubSystemA.1ve SubSystemA.2ancak üzerinde DataSourceB.
Tulains Córdova

1
@fstuijt Hayır, değil. Başka bir SubsystemA.1şey kullanmak için değiştirirseniz DataSourceB, DataSourceAbilemezsiniz. DataSourceAsadece SubsystemA.1bir getFoo(id)yöntemi var umurunda . Arasında bir soyutlama var DataSourceAve DataSourceB.
Tulains Córdova

Yanıtlar:


3

Arkasında aynı veri mimarisine sahip bir uygulama oluşturdum; otomasyonun ve dahili günlük bilgilerin çoğunu içeren yerinde bir SQL veritabanına sahibiz ve daha sonra satış, hesap yönetimi, saha personeli vb. için kullanılan bir üçüncü taraf bulut hizmetine sahibiz. ve ekipmana girdim ve içeri girene kadar iki farklı uygulamadan alıyordum.

Uzun ve kısa, bir veri kaynağının diğerinin kayıtlarına referans olması gerektiğidir. Bizim durumumuzda, üçüncü taraf bulut verileri, yerinde verilere referanslar içerir, çünkü en çok kontrol ettiğimiz düzenleme budur. Şimdi, her iki veri kaynağından da bir kayıt kimliği ile her ikisinden de veri alabiliriz; bir bulut kimliği ile kaydı buluttan alıyoruz, yerinde kimliği alıyoruz ve yerinde verileri alıyoruz. Yerinde kimlikle, her iki veri kaynağını da bu kimliğe göre yoklarız.

Sistemimde, her iki nesneyi de etki alanı katmanında diğerinin alt öğesi yapmadım; her iki mağazadaki verilerin her türlü kullanımı iki nesne örneğini korumalıdır. İkisinin de var olması garanti edilmez, bu yüzden bunu böyle yaptım; uygulama yalnızca bulut verileriyle veya yerinde verilerle veya her ikisiyle birden çalışabilir.

Ancak, bunu değiştirmek zor değildir, özellikle de bir tarafın her zaman var olacağından eminseniz; nesneye, her zaman verinin var olacağı tarafı temsil eden, yani diğer veri deposunun kaydını temsil eden nesne türündeki bir özelliği eklemeniz yeterlidir. İki grafiğin daha gelişmiş bir "birleştirilmesi" mümkündür.

Bu tür bir düzenleme mutlaka belirli bir düzeyde birleştirilmelidir. Her iki veri deposuyla da arabirim oluşturabilen bir DAL'ye sahip olabilir veya her veri deposu için bir tane olmak üzere DAL'leri segmentlere ayırabilir ve Denetleyici gibi verileri daha yüksek bir katmandan her birinden alabilir ve birbirine yapıştırabilirsiniz. Ancak, bir düzeyde, programınızın bu iki farklı veri kaynağının verilerini bir araya getirecek akıllılara sahip olması gerekir.

Verilerin tam olarak nereden geldiğinin ayrıntılarını soyutlayarak çoğu durumda gerekli olan bağlantıyı azaltabilirsiniz. Oluşturulan sınıfların örnekleri olarak size verilen bir web hizmetinden veri alırsanız, hizmet sınıfının derin bir kopyasını kontrol ettiğiniz bir şeye dönüştürmek için bir dönüştürücü yerleştirin; kaynak yapar (yalnızca şema yaparsa).

Şimdi, bu çok büyük bir girişim olabilir; kullandığımız bulut, bazıları yüzlerce veri alanına sahip düzinelerce alan adı sınıfına sahiptir ve - işte kicker - farklı bir buluta veya başka bir uzaktan kumandaya geçmek için soyut veri türünde büyük değişiklikler yapmanız gerekebilir veri kaynağı. Bu nedenle rahatsız etmedim; Oluşturulan web hizmeti etki alanını doğrudan kullanıyorum ve şimdi buluttan bir saha dışı (ancak bizim kontrolümüz altında) bir veri deposuna bir değişiklik beliriyor, ayrıntıları hala bilmiyorum, sadece formları değiştirmeyi planlıyorum ve yeni şema ve / veya veri nesnelerini yansıtmak için verilerin "birleştirildiği" uygulamanın kod bağları. Hangi yolu dilerseniz seçin büyük bir iştir.


Bu cevap en iyi karşılaştığım problemi kapsamaktadır ve bence şimdiye kadarki en iyi yanıtı sunmaktadır. Ancak, birden çok kaynaktan veri birleştirmenin yaygın bir sorun olduğunu düşünürüm. Yardımcı olabilecek herhangi bir tasarım deseni var mı?
fstuijt

1
Fabrika modelindeki bazı varyasyonlar yararlı olabilir. Bir CloudInvoice ve bir SqlInvoice nesneniz varsa (ilgili veri kaynaklarından) ve tek bir birleşik Fatura oluşturmak istiyorsanız, oluşturmak üzere olan kaydın her bir yarısını almak için her iki veri kaynağı hakkında yeterli bilgiye sahip bir Fabrika oluşturun ve ardından bilgileri etki alanı sınıfınızla birleştirir.
KeithS

4

Bununla başa çıkmanın bir yolu, her iki veri kaynağındaki verileri tek bir yerde içeren birleştirilmiş veri kaynağı yapmaktır. Bir iş kaynaklarında değişiklikleri kontrol için periyodik aday olacağını Ave B, ve toplu veriler kaynağına "deltalar" yazılı. Bu, sıkıca bağlanmış iki veri kaynağını tek bir tutarlı veri kaynağına dönüştürür.

Birkaç şey bu yaklaşımı benimsemenizi engelleyebilir:

  • Veri miktarı yasaklayıcı olabilir - tam bir kopyası Ave Bihtiyaçları alan gereksinimlerini iki katına yapılacak.
  • Veriler yayınlanacaktır - Kaynaktaki verilerin değiştiği zaman ile toplama işi tarafından toplanan kaynağa yayıldığı zamanlar olacaktır.
  • Verileri orijinal kaynaklarla uzlaştırmanız gerekir - Bu yaklaşımı kullanırsanız değişiklikleri orijinal yerlerine geri taşıma görevi çok daha karmaşık hale gelir.

Katılıyorum, bir soyutlama katmanı getirmek tercih edilen yaklaşımdır
neontapir

2
Verileri kopyalamadan bir soyutlama katmanına sahip olabilirsiniz.
smp7d

@ smp7d Bu, bağlantıyı hoş bir ön ucun arkasına gizler; Yine de sisteminizde böyle bir şey yaptığınızı varsaydım, çünkü aksi takdirde karmaşıklık tüm tasarımınıza yayılacaktır.
dasblinkenlight

DB ortamına bağlı olarak bu, veri kopyalama ihtiyacını ortadan kaldırarak bir / daha fazla Görünüm ile de ele alınabilir.
Walter

Olmadınız DataSourceAve DataSourceBayrılmış zaten? DataSourceAHer iki bağımlılık üzerinde SubSystemA.1ve SubSystemA.2ancak üzerinde DataSourceB.
Tulains Córdova

1

Görünüşe göre üst düzeyde iki tür var: Foo ve Bar ve sadece iki üst düzey eyleminiz var: findFoo(...)ve findBar(...). Bu, G / Ç katmanının arabirimidir.

: Veri kaynaklarının Açıklamanızın A iki yöntem vardır ifade eder findFoove findBarve B bir yöntem: findFooAuxiliaryInformation. İçinde findFooA ve B'den gelen bilgileri birleştirmeniz gerekecek.

Hangi "sıkı bağlantı" dan bahsettiğinizden emin değilim. İki veri kümelerinde bulunan üç veri türleri şunlardır: Bar, Foove FooAuxData. Arasındaki bağlantı Foove FooAuxDataveri girişi doğasında vardır ve indirgenemez. Ancak bu bağlantı sadece findFooyöntemde görünmelidir . Yapabileceğin en iyi şey bu. Gereksinim tek bir yerde uygulanır. Değişirse, bu kodu değiştirmeniz gerekir.


0

Yapamazsın.

Eğer doğru anlarsam Foove Bargelirsem dsA. Bars ait Foo.
Tercihen, İstemediğiniz Baratanan s Foosürece, s Fooile desteklenmiştir Foo.enhancedInfoo geliyor dsB.

S'yi Bars'ye atama tercihiniz Foosıkı bağlantınızı yaratan şeydir. Sizi belirli bir yolda ilerlemeye zorlayan bir "ihtiyaçlar meydan okuması" olarak nitelendiririm.

Dolayısıyla teknik zorluklar, dsBherhangi bir bilgi hakkında bilgi sahibi olabilir veya olmayabilir Foove dsBhatta mevcut olmayabilir.

Bu tercihin ne kadar zor ve hızlı olduğuna karar vermelisiniz Foo.enhancedInfo. Bu gereksinime dayanarak, bir Foo+ Barnesnesi sağlamaya veya vermemeye karar verebilirsiniz . Geliştirilmemiş bir Fookişinin sağlanmasına izin vermek sadece mantığı karmaşıklaştırır ve bana tercihin göründüğü kadar katı olmadığını söyler. Varyantları belirlemek Foo, Foo.enhancedve Baruygulamanız (ler) destekleyebilir ve size nihai cevabı gerekecek.

Fooİlgili bilgileri birbirine yaklaştırmak için yapabileceğiniz başka şeyler de vardır ve bu da bu sorunların bazılarını çözebilir. Sorunuzun ifade şekli gibi, veri nesnesi düzeyinde sorunla uğraştığınız anlaşılıyor ve altyapı türü değişikliklerini göz önünde bulunduramayabilirsiniz.


Diğer yol 'Foo: Bar s
fstuijt

@fstuijt Cevabımı biraz güncelleyeceğim. Temel olarak, aynı kalacaktır. Bar + Foo's'un nasıl sunuculaştırılacağına karar vermelisiniz.

0

Veri kaynağı B'deki veriler kendi başına duramazsa, mümkünse veri kaynağı A'ya geçirmek isteyebilirsiniz.

Bağımsız ancak ilgili iseler, veri sanallaştırmaya bakmalısınız . Bu, uygulamaların verileri agnostik bir şekilde bir set (uygun olduğunda) olarak işlemesine izin verecektir. Platformunuza bağlı olarak, muhtemelen bunu uygulamanıza yardımcı olabilecek mevcut bir çerçeve / kütüphane olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.