Saya mengalami kesulitan menemukan solusi yang tepat untuk masalah arsitektur berikut.
Dalam pengaturan kami (digambarkan di bawah) kami memiliki 2 sumber data, di mana sumber data A adalah sumber utama untuk item jenis Foo. Ada sumber data sekunder yang dapat digunakan untuk mengambil informasi tambahan di Foo; namun informasi ini tidak selalu ada.
Selanjutnya, sumber data A dapat digunakan untuk mengambil item dari tipe Bar. Namun, setiap Bar mengacu pada Foo. Kesulitan di sini adalah bahwa setiap Bar harus merujuk ke Foo yang, jika tersedia, juga mengandung informasi yang ditambah oleh sumber data B.
Pertanyaan saya adalah: bagaimana cara menghapus kopling ketat antara SubsystemA.1 dan DataSourceB?
architecture
fstuijt
sumber
sumber
DataSourceA
danDataSourceB
sudah dipisahkan?DataSourceA
memiliki ketergantungan pada keduanyaSubSystemA.1
danSubSystemA.2
, tetapi tidak padaDataSourceB
.SubsystemA.1
untuk menggunakan sesuatu selainDataSourceB
,DataSourceA
tidak akan tahu.DataSourceA
hanya peduli yangSubsystemA.1
memilikigetFoo(id)
metode. Ada abstraksi antaraDataSourceA
danDataSourceB
.Jawaban:
Saya membuat aplikasi dengan banyak arsitektur data yang sama di belakangnya; kami memiliki basis data SQL di tempat yang berisi sebagian besar informasi internal dan otomatisasi sehari-hari, dan kemudian layanan cloud pihak ketiga yang digunakan untuk penjualan, manajemen akun, personel lapangan, dll. Helpdesk memerlukan informasi dari keduanya mengenai lokasi fisik klien dan peralatan, dan telah mendapatkannya dari dua aplikasi yang berbeda sampai saya melangkah.
Yang panjang dan pendek adalah bahwa satu sumber data perlu memiliki referensi ke catatan yang lain. Dalam kasus kami, data cloud pihak ketiga berisi referensi ke data di tempat karena pengaturan itulah yang paling kami kontrol. Sekarang, dengan ID untuk catatan dari kedua sumber data, kita bisa mendapatkan data dari keduanya; dengan ID cloud, kami menarik catatan dari cloud, mendapatkan ID tamu, dan menarik data tamu. Dengan ID di tempat, kami menyurvei kedua sumber data berdasarkan ID itu.
Dalam sistem saya, saya tidak membuat salah satu objek menjadi anak lain di lapisan domain; setiap penggunaan data dari kedua toko harus mempertahankan dua instance objek. Tidak ada yang dijamin ada, itulah sebabnya saya melakukannya dengan cara itu; aplikasi hanya dapat bekerja dengan data cloud, atau dengan data di tempat, atau keduanya, dengan lebih banyak keterbatasan semakin sedikit data yang dimilikinya.
Namun, itu tidak sulit untuk diubah, terutama jika Anda yakin bahwa satu sisi akan selalu ada; cukup sertakan properti dalam objek yang mewakili sisi yang datanya akan selalu ada, yaitu tipe objek yang mewakili catatan penyimpanan data lainnya. "Penggabungan" yang lebih maju dari dua grafik menjadi satu adalah mungkin.
Pengaturan semacam ini tentu harus digabungkan pada tingkat tertentu. Anda dapat memiliki DAL yang dapat berinteraksi dengan kedua penyimpan data, atau Anda dapat mengelompokkan DAL, satu per penyimpanan data, dan memiliki lapisan yang lebih tinggi seperti Pengontrol mendapatkan data dari masing-masing dan menggabungkannya. Tetapi, pada tingkat tertentu, program Anda harus memiliki kecerdasan untuk menyatukan data dua sumber data yang berbeda ini.
Anda dapat mengurangi kopling yang dibutuhkan dalam kebanyakan kasus dengan mengabstraksikan detail dari mana data berasal. Jika Anda mendapatkan data dari layanan web, yang diberikan kepada Anda sebagai instance dari kelas yang dihasilkan, maka pasang konverter untuk membuat salinan mendalam dari kelas layanan menjadi sesuatu yang Anda kontrol, yang tidak perlu diubah jika data sumber tidak (hanya jika skema itu).
Sekarang, ini bisa menjadi usaha besar; cloud yang kami gunakan memiliki lusinan kelas domain, beberapa di antaranya memiliki ratusan bidang data, dan - inilah kicker - Anda bisa dengan mudah harus membuat perubahan besar pada tipe data abstrak untuk mengakomodasi perpindahan ke cloud yang berbeda atau remote lain sumber data. Untuk alasan itu, saya tidak repot-repot; Saya menggunakan domain layanan web yang dihasilkan secara langsung, dan sekarang setelah perubahan dari cloud ke data di luar kantor (tetapi di bawah kendali kami) menjulang, detail yang masih belum saya ketahui, saya hanya berencana untuk mengubah formulir dan kerangka kode aplikasi, yang merupakan tempat data "digabungkan", untuk mencerminkan skema baru dan / atau objek data. Ini adalah pekerjaan besar dengan cara apa pun Anda mengirisnya.
sumber
Salah satu cara untuk mengatasinya adalah dengan membuat sumber data teragregasi yang berisi data dari kedua sumber data di satu tempat. Pekerjaan akan berjalan secara berkala untuk memeriksa perubahan sumber
A
danB
, dan menulis "delta" ke sumber data agregat Anda. Ini akan mengubah dua sumber data yang digabungkan secara ketat menjadi satu sumber data yang koheren.Beberapa hal dapat mencegah Anda mengambil pendekatan ini:
A
danB
perlu dibuat, menggandakan persyaratan ruang.sumber
DataSourceA
danDataSourceB
sudah dipisahkan?DataSourceA
memiliki ketergantungan pada keduanyaSubSystemA.1
danSubSystemA.2
, tetapi tidak padaDataSourceB
.Tampaknya di tingkat atas ada dua jenis: Foo dan Bar, dan Anda hanya memiliki dua tindakan tingkat atas:
findFoo(...)
danfindBar(...)
. Itu adalah antarmuka ke lapisan I / O.Deskripsi Anda dari sumber data menunjukkan bahwa ada dua metode di A:
findFoo
danfindBar
dan satu metode pada B:findFooAuxiliaryInformation
. DalamfindFoo
Anda akan perlu untuk menggabungkan informasi dari A dan B.Saya tidak yakin apa "kopling ketat" yang Anda maksud. Ada tiga jenis data yang terdapat dalam dua dataset:
Bar
,Foo
, danFooAuxData
. Kopling antaraFoo
danFooAuxData
melekat pada data input, dan tidak dapat dikurangi. Tetapi kopling itu harus muncul hanya dalamfindFoo
metode. Itu yang terbaik yang bisa Anda lakukan. Persyaratan diterapkan di satu tempat. Jika berubah, Anda harus mengubah kode itu.sumber
Kamu tidak bisa
Jika saya mengerti dengan benar,
Foo
danBar
berasal daridsA
.Bar
MilikFoo
s.Lebih disukai, Anda tidak ingin
Bar
ditugaskan keFoo
, kecuali jikaFoo
telah dilengkapi denganFoo.enhancedInfo
yang berasal daridsB
.Preferensi Anda untuk menugaskan
Bar
kepadaFoo
s adalah apa yang membuat kopling ketat Anda. Saya akan memenuhi syarat itu sebagai "tantangan persyaratan" yang memaksa Anda menempuh jalan tertentu.Jadi tantangan teknisnya adalah yang
dsB
mungkin atau mungkin tidak memiliki informasi tentang apa pun yang diberikanFoo
dan yangdsB
bahkan mungkin tidak tersedia.Anda perlu memutuskan seberapa keras dan cepat preferensi itu untuk yang
Foo.enhancedInfo
sebenarnya. Berdasarkan persyaratan itu, Anda dapat memutuskan untuk memberikan objekFoo
+Bar
, atau tidak. Mengizinkan yang tidak disempurnakanFoo
untuk diberikan hanya mempersulit logika dan memberi tahu saya bahwa preferensi tidak seketat yang mungkin muncul. Tentukan varian apa dariFoo
,,Foo.enhanced
danBar
aplikasi Anda yang dapat didukung dan Anda akan memiliki jawaban pamungkas.Ada hal-hal lain yang dapat Anda lakukan untuk memindahkan
Foo
informasi terkait lebih dekat bersama-sama, dan itu mungkin menyelesaikan beberapa masalah ini. Cara pertanyaan Anda diutarakan, sepertinya Anda berurusan dengan masalah di tingkat objek data dan Anda mungkin tidak dapat mempertimbangkan perubahan tipe infrastruktur.sumber
Jika data dalam sumber data B tidak dapat berdiri sendiri, Anda mungkin ingin memindahkannya ke sumber data A jika memungkinkan.
Jika mereka independen tetapi terkait, Anda harus melihat ke dalam virtualisasi data . Ini akan memungkinkan aplikasi memperlakukan data sebagai satu set (bila perlu) secara agnostik. Bergantung pada platform Anda, mungkin akan ada kerangka / pustaka yang ada yang dapat membantu Anda menerapkan ini.
sumber