Praktik terbaik atau pola desain untuk pengambilan data untuk pelaporan dan dasbor dalam aplikasi yang kaya domain

44

Pertama, saya ingin mengatakan bahwa ini sepertinya pertanyaan / area yang terabaikan, jadi jika pertanyaan ini perlu diperbaiki, bantu saya menjadikan ini pertanyaan besar yang dapat bermanfaat bagi orang lain! Saya mencari saran dan bantuan dari orang yang telah mengimplementasikan solusi yang memecahkan masalah ini, bukan hanya ide untuk dicoba.

Dalam pengalaman saya, ada dua sisi aplikasi - sisi "tugas", yang sebagian besar didorong oleh domain dan merupakan tempat pengguna berinteraksi secara kaya dengan model domain ("mesin" aplikasi) dan sisi pelaporan, tempat pengguna dapatkan data berdasarkan apa yang terjadi di sisi tugas.

Di sisi tugas, jelas bahwa aplikasi dengan model domain kaya harus memiliki logika bisnis dalam model domain dan database harus digunakan sebagian besar untuk kegigihan. Pemisahan keprihatinan, setiap buku ditulis tentang hal itu, kita tahu apa yang harus dilakukan, luar biasa.

Bagaimana dengan sisi pelaporan? Apakah gudang data dapat diterima, atau apakah desainnya buruk karena menggabungkan logika bisnis dalam database dan data itu sendiri? Untuk menggabungkan data dari database menjadi data gudang data, Anda harus menerapkan logika bisnis dan aturan pada data, dan bahwa logika dan aturan itu tidak berasal dari model domain Anda, itu berasal dari proses pengumpulan data Anda. Apakah itu salah?

Saya bekerja pada aplikasi manajemen proyek dan keuangan yang besar di mana logika bisnisnya luas. Saat melaporkan data ini, saya akan sering memiliki BANYAK agregasi yang harus dilakukan untuk menarik informasi yang diperlukan untuk laporan / dasbor, dan agregasi memiliki banyak logika bisnis di dalamnya. Demi kinerja, saya telah melakukannya dengan tabel yang sangat teragregasi dan prosedur yang tersimpan.

Sebagai contoh, katakanlah sebuah laporan / dashboard diperlukan untuk menampilkan daftar proyek aktif (bayangkan 10.000 proyek). Setiap proyek akan membutuhkan serangkaian metrik yang ditunjukkan dengannya, misalnya:

  1. total anggaran
  2. upaya sampai saat ini
  3. tingkat pembakaran
  4. tanggal habis anggaran pada laju pembakaran saat ini
  5. dll.

Masing-masing melibatkan banyak logika bisnis. Dan saya tidak hanya berbicara tentang mengalikan angka atau logika sederhana. Saya sedang berbicara tentang untuk mendapatkan anggaran, Anda harus menerapkan lembar tarif dengan 500 tarif berbeda, satu untuk setiap waktu karyawan (pada beberapa proyek, yang lain memiliki pengganda), menerapkan biaya dan penambahan yang sesuai, dll. Logikanya luas. Butuh banyak agregasi dan penyetelan kueri untuk mendapatkan data ini dalam jumlah waktu yang wajar bagi klien.

Haruskah ini dijalankan melalui domain terlebih dahulu? Bagaimana dengan kinerja? Bahkan dengan query SQL langsung, saya hampir tidak mendapatkan data ini cukup cepat untuk ditampilkan klien dalam jumlah waktu yang wajar. Saya tidak bisa membayangkan mencoba untuk mendapatkan data ini ke klien cukup cepat jika saya rehydrating semua objek domain ini, dan mencampur dan mencocokkan dan menggabungkan data mereka di lapisan aplikasi, atau mencoba untuk mengumpulkan data dalam aplikasi.

Tampaknya dalam kasus-kasus ini SQL baik dalam mengolah data, dan mengapa tidak menggunakannya? Tetapi kemudian Anda memiliki logika bisnis di luar model domain Anda. Setiap perubahan pada logika bisnis harus diubah dalam model domain Anda dan skema agregasi pelaporan Anda.

Saya benar-benar bingung bagaimana merancang bagian pelaporan / dasbor aplikasi apa pun sehubungan dengan desain yang digerakkan domain dan praktik yang baik.

Saya menambahkan tag MVC karena MVC adalah desain rasa du jour dan saya menggunakannya dalam desain saya saat ini, tetapi tidak tahu bagaimana data pelaporan cocok dengan jenis aplikasi ini.

Saya mencari bantuan di bidang ini - buku, pola desain, kata kunci ke google, artikel, apa saja. Saya tidak dapat menemukan informasi tentang topik ini.

CONTOH EDIT DAN LAINNYA

Contoh sempurna lain yang saya jumpai hari ini. Pelanggan menginginkan laporan untuk Tim Penjualan Pelanggan. Mereka menginginkan apa yang tampak seperti metrik sederhana:

Untuk setiap Tenaga Penjualan, apa penjualan tahunan mereka sampai saat ini?

Tapi itu rumit. Setiap tenaga penjualan berpartisipasi dalam berbagai peluang penjualan. Sebagian mereka menang, sebagian lagi tidak. Dalam setiap peluang penjualan, ada beberapa orang penjualan yang masing-masing dialokasikan persentase kredit untuk penjualan sesuai peran dan partisipasi mereka. Jadi sekarang bayangkan melalui domain untuk ini ... jumlah rehidrasi objek yang harus Anda lakukan untuk menarik data ini dari database untuk setiap orang Sales:

Dapatkan semua SalesPeople->
Untuk setiap mendapatkan mereka SalesOpportunities->
Untuk setiap mendapatkan persentase penjualan mereka dan menghitung jumlah Penjualan mereka
lalu Tambahkan semua SalesOpportunityjumlah Penjualan mereka .

Dan itu SATU metrik. Atau Anda dapat menulis kueri SQL yang dapat melakukannya dengan cepat dan efisien dan menyesuaikannya dengan cepat.

EDIT 2 - Pola CQRS

Saya sudah membaca tentang Pola CQRS dan, meskipun menarik, bahkan Martin Fowler mengatakan itu tidak diuji. Jadi bagaimana masalah ini TELAH dipecahkan di masa lalu. Ini harus dihadapi oleh semua orang pada satu titik atau lainnya. Apa pendekatan yang mapan atau usang dengan catatan keberhasilan?

Edit 3 - Sistem / Alat Pelaporan

Hal lain yang perlu dipertimbangkan dalam konteks ini adalah alat pelaporan. Layanan Pelaporan / Crystal Reports, Layanan Analisis dan Cognoscenti, dll. Semua mengharapkan data dari SQL / database. Saya ragu data Anda akan datang melalui bisnis Anda nanti untuk ini. Namun mereka dan orang lain seperti mereka adalah bagian penting dari pelaporan di banyak sistem besar. Bagaimana data untuk ini ditangani dengan benar di mana bahkan ada logika bisnis dalam sumber data untuk sistem ini serta mungkin dalam laporan itu sendiri?

richard
sumber
3
Maaf tidak bermaksud demikian. Mod menyuruh saya untuk memposting ulang di sini, tetapi kemudian ternyata bisa melakukan migrasi pertanyaan yang sama jadi saya punya dua. Maaf soal itu.
richard
Saya bingung. Apakah tidak ada yang melakukan ini? Tidak ada yang menghadapi masalah ini?
richard
Bukankah tugas / laporan 'pemisahan kekhawatiran' Anda agak teoretis? Anda bisa mengatakan sisi pelaporan memiliki aturan bisnis juga, jadi Anda tidak bisa menghindari menempatkan logika bisnis ke dalam seluruh rantai. Apa pun alat BI yang Anda gunakan, Anda harus membuat hasil antara sepanjang jalan dari tugas input ke tahap pelaporan (mendefinisikan objek agregat dan sebagainya). Kemudian memunculkan pertanyaan di mana untuk crunch apa. Mungkin Anda bisa mendekati masalah dengan piramid (dengan potongan terputus) atau metafora corong.
Jan Doggen
@ JanDoggen Itulah poin saya. Alat BI akan HARUS memiliki logika BL di dalamnya. Sekarang saya menduplikasi BL yang ada di domain kaya produk perangkat lunak saya. Apakah itu oke?
richard

Jawaban:

16

Ini adalah jawaban yang sangat fasih, tetapi langsung menuju inti permasalahan:

Dalam hal DDD mungkin menganggap pelaporan sebagai Bounded Context ?, jadi daripada berpikir dalam hal model domain "THE", Anda harus mau berpikir bahwa boleh saja memiliki lebih dari satu model. Jadi ya tidak apa-apa jika domain pelaporan memiliki logika bisnis pelaporan di dalamnya, sama seperti tidak apa-apa bagi domain transaksional untuk memiliki logika bisnis transaksional di dalamnya.

Mengenai pertanyaan, misalkan prosedur tersimpan SQL vs model domain dalam kode aplikasi, pro dan kontra yang sama berlaku untuk sistem pelaporan seperti untuk sistem transaksional.

Karena saya melihat bahwa Anda menambahkan hadiah untuk pertanyaan, saya membaca pertanyaan itu lagi dan memperhatikan bahwa Anda meminta sumber daya spesifik tentang hal ini, jadi saya pikir saya akan mulai dengan menyarankan agar Anda melihat pertanyaan Stack Overflow lainnya mengenai masalah ini, dan saya menemukan ini https://stackoverflow.com/questions/11554231/how-does-domain-driven-design-handle-reporting

Inti umum dari hal itu adalah menggunakan CQRS sebagai pola untuk sistem Anda, yang konsisten dengan DDD, dan bergantung pada tanggung jawab sisi permintaan sebagai cara untuk menyelesaikan pelaporan, tetapi saya tidak yakin itu adalah jawaban yang bermanfaat dalam kasus Anda.

Saya juga menemukan ini http://www.martinfowler.com/bliki/ReportingDatabase.html , yang saya temukan ditautkan dari sini: http://groups.yahoo.com/neo/groups/domaindrivendesign/conversations/topics/2261

Berikut ini adalah artikel yang menarik dari ACM tentang masalah ini: http://dl.acm.org/citation.cfm?id=2064685 tapi itu di belakang paywall jadi saya tidak bisa membacanya (bukan anggota ACM :().

Ada juga jawaban ini di sini untuk pertanyaan serupa: https://stackoverflow.com/questions/3380431/cqrs-ddd-synching-reporting-database

dan yang ini: http://snape.me/2013/05/03/applying-domain-driven-design-to-data-warehouses/

Semoga ini membantu!

RibaldEddie
sumber
Hai @RibaldEddie. Terima kasih balasannya. Tampaknya tidak fasih bagi saya. Jadi Anda mengatakan tidak apa-apa untuk memperlakukan prosedur tersimpan sebagai lapisan domain untuk pelaporan Bounded Context?
richard
Jika Anda memiliki alasan kuat untuk melakukan itu dalam situasi Anda maka itu tidak masalah. Secara pribadi saya tidak yakin bahwa saya akan menggunakan SP dalam hal apa pun kecuali mungkin untuk beberapa validasi data atau membersihkan, kalau tidak saya cenderung menghindar dari itu dalam setiap kasus.
RibaldEddie
4

Pemahaman saya dari pertanyaan Anda adalah ini: Aplikasi untuk tugas sehari-hari miliki

Lihat >> Pengendali >> Model (BL) >> Database (Data)

Aplikasi untuk tujuan pelaporan

Lihat >> Pengendali >> Model >> Basis Data (Data + BL)

Jadi perubahan BL untuk ' aplikasi tugas ' akan menyebabkan perubahan dalam ' pelaporan ' BL juga. Itu masalah Anda yang sebenarnya, kan? Yah tidak apa-apa untuk melakukan perubahan dua kali, rasa sakit yang harus Anda ambil pula. Alasannya adalah kedua BL dipisahkan oleh kekhawatiran masing-masing. Satu untuk mengambil data dan satu untuk mengumpulkan data. Juga, BL asli Anda dan agregasi BL akan ditulis dalam berbagai teknologi atau bahasa ( C # / java dan SQL proc ). Tidak ada jalan keluar untuk itu.

Mari kita ambil contoh lain yang tidak terkait dengan pelaporan khusus. Misalkan suatu perusahaan XXX melacak email dari semua pengguna untuk interpretasi dan menjual info itu kepada perusahaan pemasaran. Sekarang akan memiliki satu BL untuk interpretasi dan satu BL untuk mengumpulkan data untuk perusahaan pemasaran. Kekhawatiran berbeda untuk kedua BL. Besok jika BL mereka berubah sehingga surat-surat yang datang dari Kuba harus diabaikan, maka logika bisnis akan diubah di kedua sisi.

theinsaneone
sumber
3

Pelaporan adalah konteks terbatas, atau subdomain, untuk berbicara secara longgar. Ini memecahkan kebutuhan bisnis untuk mengumpulkan / mengumpulkan data dan memprosesnya untuk mendapatkan intelijen bisnis.

Bagaimana Anda menerapkan subdomain ini mungkin akan menjadi keseimbangan antara (sebagian) cara arsitektur yang benar Anda bisa melakukan ini, dan apa infrastruktur Anda akan memungkinkan. Saya suka memulai dari sisi yang pertama, dan bergerak ke arah yang terakhir hanya seperlunya.

Anda mungkin dapat membaginya menjadi dua masalah utama yang sedang Anda pecahkan:

  1. Menggabungkan, atau menyimpan data. Ini harus memproses beberapa sumber data, dan menggabungkan informasi sedemikian rupa sehingga disimpan di sumber data lain.

  2. Meminta sumber data teragregasi untuk memberikan intelijen bisnis.

Tak satu pun dari masalah itu merujuk pada database atau mesin penyimpanan tertentu. Lapisan domain Anda seharusnya hanya berurusan dengan antarmuka, diimplementasikan di lapisan infrastruktur Anda oleh berbagai adapter penyimpanan.

Anda mungkin memiliki berbagai pekerja atau beberapa pekerjaan yang dijadwalkan, yang dibagi menjadi beberapa bagian yang bergerak:

  • Sesuatu untuk ditanyakan
  • Sesuatu untuk dikumpulkan
  • Sesuatu untuk disimpan

Semoga Anda bisa melihat beberapa CQRS bersinar di sana.

Di sisi pelaporan, seharusnya hanya perlu melakukan kueri, tetapi tidak pernah secara langsung ke dalam basis data. Pergi melalui antarmuka Anda dan melalui lapisan domain Anda di sini. Ini bukan domain masalah yang sama dengan tugas utama Anda, tetapi masih harus ada logika di sini yang ingin Anda patuhi.

Segera setelah Anda terjun langsung ke basis data, Anda lebih bergantung padanya, dan pada akhirnya dapat mengganggu kebutuhan data aplikasi asli Anda.

Juga, setidaknya bagi saya, saya pasti lebih suka menulis tes dan mengembangkan kode daripada pertanyaan atau prosedur tersimpan. Saya juga suka tidak mengunci diri ke alat khusus sampai benar-benar diperlukan.

Adrian Schneider
sumber
2

Biasanya memisahkan data operasional / transaksional dari pelaporan. Yang terakhir mungkin memiliki persyaratan untuk menyimpan data untuk alasan hukum (mis. Tujuh tahun data keuangan untuk audit keuangan), dan Anda tidak menginginkan semua itu di penyimpanan data transaksional Anda.

Jadi, Anda akan mempartisi data transaksional Anda berdasarkan ukuran waktu (mingguan, bulanan, triwulanan, tahunan) dan memindahkan partisi lama ke dalam penyimpanan data pelaporan / riwayat Anda melalui ETL. Ini mungkin atau mungkin bukan gudang data dengan skema dan dimensi bintang. Anda akan menggunakan alat pelaporan pergudangan data untuk melakukan permintaan ad hoc dan roll up dan pekerjaan batch untuk menghasilkan laporan berkala.

Saya tidak akan merekomendasikan melaporkan terhadap penyimpanan data transaksional Anda.

Jika Anda lebih suka menekan, berikut ini lebih banyak pemikiran:

  1. "Terbaik" adalah subyektif dan apa yang berhasil.
  2. Saya akan membeli produk pelaporan daripada menulis sendiri.
  3. Jika Anda menggunakan basis data relasional, maka SQL adalah satu-satunya permainan di kota.
  4. Prosedur tersimpan tergantung pada apakah Anda memiliki keterampilan untuk menulisnya.

Perangkat lunak manajemen proyek yang Anda gunakan di rumah? Saya akan membeli sebelum membangun. Sesuatu seperti Rally dan Microsoft Project.

Duffymo
sumber
Terima kasih @duffymo. Data ini tidak hanya disimpan karena alasan hukum. Berton-ton data yang digunakan dan dilaporkan secara teratur. Perusahaan hidup dan mati oleh laporan dan dasbor. Bagaimanapun, ini adalah perangkat lunak manajemen proyek. Apa cara terbaik untuk memasok data dan dasbor ini dengan data? Mengagregasi dan menariknya dengan SQL? Tidak masalah jika logika bisnis ada di Prosedur Store untuk ini? Semua pertanyaan saya masih belum terjawab!
richard
Anda memiliki jawaban - data warehouse. Kedengarannya bukan itu yang ingin kau dengar. Lihat di atas untuk pengeditan.
duffymo
Jadi tidak apa-apa jika logika bisnis yang ada di domain diduplikasi di dts dan data warehouse? Juga, lalu mengeluarkan data itu, apakah saya menggunakan model domain apa pun? Atau cukup tarik data dengan prosedur tersimpan dan tampilkan dalam tampilan? Untuk mengatasi poin Anda di atas: Saya tidak dapat membeli produk pelaporan ... alasan saya menulis ini adalah perusahaan memiliki kebutuhan spesifik yang tidak dipenuhi oleh produk pelaporan. Saya menggunakan database relasional dan memiliki keterampilan SQL yang sangat baik. Tapi saya tidak ingin default ke apa yang saya kuasai, saya ingin melakukan apa yang desainnya bagus.
richard
Re: beli sebelum Anda membangun - Anda tidak dapat memaksa perusahaan untuk membentuk bisnis mereka ke perangkat lunak ketika mereka ingin perangkat lunak dibangun agar sesuai dengan bisnis mereka. Rally dan Proyek MS tidak sesuai dengan kebutuhan manajemen proyek semua orang. Sama sekali.
richard
Tidak bisa memaksa, tentu saja. Tetapi setiap bisnis harus memutuskan apa yang menjadi kepentingan mereka. Jika Anda tidak berkecimpung dalam bisnis penjualan perangkat lunak manajemen proyek, Anda berkepentingan untuk menilai apakah lebih baik membelinya. Sama seperti perangkat lunak akuntansi. Siapa yang waras mereka akan menulis buku besar dari awal?
duffymo
2

Pertama beberapa terminologi, apa yang Anda sebut sisi tugas dikenal sebagai Transaksional dan sisi Pelaporan adalah Analytics.

Anda telah menyebutkan CQRS yang merupakan pendekatan hebat tetapi ada sedikit aplikasi praktis dari pendekatan tersebut.

Apa yang telah sangat diuji adalah melengkapi pemrosesan Transaksional Anda dengan mesin pemrosesan Analitik. Ini kadang-kadang disebut sebagai Data Warehousing atau Data Cubes. Gotcha terbesar berkaitan dengan analytics adalah bahwa mencoba menjalankan query terhadap data transaksional Anda secara real-time paling tidak efisien karena sangat mungkin hanya mengoptimalkan database untuk membaca atau menulis. Untuk transaksi, Anda ingin kecepatan tulis yang tinggi untuk menghindari keterlambatan dalam memproses / melakukan sesuatu. Untuk pelaporan, Anda ingin kecepatan baca tinggi sehingga keputusan dapat dibuat.

Bagaimana cara menjelaskan masalah ini? Pendekatan paling sederhana untuk dipahami adalah menggunakan skema rata untuk pelaporan Anda dan ETL (ekstrak transform load) untuk mengirim ulang data dari skema transaksional yang dinormalisasi ke skema analitis denormalized. ETL dijalankan melalui agen secara teratur dan memuat tabel analitik sehingga siap untuk dibaca cepat dari mesin pelaporan Anda.

Buku bagus untuk mengetahui kecepatan pergudangan data adalah Data Warehouse Toolkit oleh Ralph Kimball. Untuk pendekatan lebih dekat. Unduh uji coba SQL Server dan ambil toolkit Gudang Data Microsoft yang mengambil pembahasan umum buku pertama tetapi menunjukkan bagaimana menerapkan konsep menggunakan SQL Server.

Ada beberapa buku yang ditautkan dari halaman-halaman yang membahas lebih detail tentang ETL, Desain Skema Bintang, BI, Dasbor, dan topik lainnya untuk membantu Anda mengikuti.

Cara tercepat untuk pergi dari tempat Anda berada ke tempat yang Anda inginkan, adalah dengan menyewa Ahli BI dan membayangi dia saat dia mengimplementasikan apa yang Anda butuhkan.

Michael Brown
sumber
Hai Mike. Saya sangat akrab dengan penyimpanan data dan BI, telah melakukannya selama 15 tahun. Pertanyaan saya berkaitan dengan bagaimana menangani hal ini dalam konteks desain berbasis domain. Apakah rumah dataware ok? Atau apakah mereka pemalsuan lapisan bisnis domain Anda? Jika jawabannya adalah membangun gudang data dan menarik data dari sana, ada banyak literatur dan saran untuk itu. Tetapi kemudian Anda menduplikasi logika bisnis di luar domain Anda. Apakah itu oke? Itu pertanyaan saya.
richard
Seperti saya sebutkan alamat CQRS yang perlu dengan memisahkan repositori menjadi sisi Command (transactional) dan Query (reporting). Tetapi bahkan tanpa perangkap CQRS lainnya, data warehouse dan etl adalah klien dari domain Anda tetapi mereka tidak memodifikasinya. Jadi BL masih terkandung dalam domain.
Michael Brown
1
Mereka tidak memodifikasi domain ... jadi semua proses ETL dan transformasi data untuk membuat data untuk data warehouse harus melalui domain Anda? Kalau tidak, BL Anda digandakan dalam semua logika proses ETL Anda.
richard
1
Ya saya akan mengatakan bahwa ETL secara IDEAL harus menggunakan domain secara langsung. Itu akan memungkinkan Anda untuk menghindari alat rapuh yang harus ditulis ulang dengan setiap perubahan internal ke database.
Michael Brown
2

Mengambil sejumlah besar informasi melalui jaringan area luas, termasuk Internet, bermasalah karena masalah yang timbul dari latensi respons, kurangnya akses memori langsung ke sumber daya penyajian data, dan toleransi kesalahan.

Pertanyaan ini menjelaskan pola desain untuk menyelesaikan masalah penanganan hasil dari kueri yang mengembalikan sejumlah besar data. Biasanya pertanyaan ini akan dibuat oleh proses klien di jaringan area luas (atau Internet), dengan satu atau lebih tingkat menengah, ke basis data relasional yang berada di server jauh.

Solusi ini melibatkan penerapan kombinasi strategi pengambilan data, termasuk penggunaan iterator untuk melintasi set data dan memberikan tingkat abstraksi yang tepat kepada klien, buffer ganda subset data, pengambilan data multi-threaded, pengambilan data multi-threaded, dan slicing query.

MyXEDNotes
sumber
Tidak yakin bagaimana ini terkait dengan pertanyaan saya atau bagaimana memperoleh 3 suara dengan sangat cepat. Juga maksud Anda memasukkan tautan di sini?
richard
2
Sepertinya hadiahnya diberikan secara otomatis untuk jawaban ini. Jawaban ini sepertinya omong kosong bagi saya dan saya TIDAK akan memberikan hadiah ini.
richard
2

Bagaimana dengan sisi pelaporan? Apakah gudang data dapat diterima, atau apakah desainnya buruk karena menggabungkan logika bisnis dalam database dan data itu sendiri?

Saya tidak berpikir Anda berbicara tentang logika bisnis, ini lebih merupakan logika pelaporan. Apa yang dilakukan pengguna dengan informasi di layar ini, apakah itu hanya untuk pembaruan status? Model domain Anda digunakan untuk memodelkan operasi transaksional, pelaporan adalah masalah yang berbeda. Menarik data dari SQL Server atau memasukkannya ke dalam data warehouse baik untuk melaporkan skenario.

Model domain Anda harus memberlakukan invarian domain Anda seperti anggota proyek tidak dapat memesan ke proyek yang sama secara bersamaan, atau hanya dapat memesan x jumlah jam seminggu. Atau Anda tidak dapat memesan untuk proyek ini karena sudah selesai dll. Keadaan model domain Anda (data) dapat disalin untuk pelaporan secara terpisah.

Untuk meningkatkan kinerja kueri, Anda dapat menggunakan tampilan terwujud. Ketika suatu operasi dilakukan terhadap model Anda (mis. Buku 4 jam dari waktu orang ini untuk memproyeksikan x) dan berhasil, ia dapat melempar suatu peristiwa yang kemudian dapat Anda simpan dalam database pelaporan dan membuat perhitungan yang diperlukan untuk laporan Anda. Maka akan sangat cepat untuk menanyakannya.

Pisahkan konteks transaksi dan pelaporan Anda, sebuah basis data relasional dibuat untuk melaporkan model domain yang tidak.

SUNTING

Posting blog yang bermanfaat tentang subjek http://se-thinking.blogspot.se/2012/08/how-to-handle-reporting-with-domain.html

Scott Millett
sumber
2

Sudah 4 tahun kemudian dan saya baru saja menemukan pertanyaan ini lagi, dan saya punya apa, bagi saya, jawabannya.

Bergantung pada aplikasi Anda dan kebutuhan spesifiknya, basis data domain / transaksi dan pelaporan Anda dapat berupa "sistem" atau "mesin" yang terpisah, atau dapat dilayani oleh satu sistem. Namun, mereka harus terpisah secara logis - yang berarti mereka menggunakan cara berbeda untuk mengambil dan menyediakan data ke UI.

Saya lebih suka mereka terpisah secara fisik (selain terpisah secara logis), tetapi banyak kali Anda memulainya bersama-sama (secara fisik) dan kemudian, saat aplikasi matang, Anda memisahkannya.

Either way, sekali lagi, mereka harus berbeda secara logis. Tidak masalah menggandakan logika bisnis dalam sistem pelaporan. Yang penting adalah bahwa sistem pelaporan mendapatkan jawaban yang sama dengan sistem domain - tetapi kemungkinan itu akan sampai di sana melalui cara yang berbeda. Misalnya, sistem domain Anda akan memiliki banyak aturan bisnis yang sangat ketat diimplementasikan dalam kode prosedural (kemungkinan). Sistem pelaporan dapat mengimplementasikan aturan-aturan yang sama ketika membaca data tetapi akan melakukannya melalui kode berbasis SET (mis. SQL).

Inilah evolusi arsitektur aplikasi Anda yang terlihat realistis saat berevolusi:

Level 1 - Domain terpisah dan sistem pelaporan, tetapi masih dalam basis kode dan database yang sama

Level 1 - Domain terpisah dan sistem pelaporan, tetapi masih dalam basis kode yang sama

Level 2 - Domain yang dipisahkan secara logis dan sistem pelaporan, tetapi pisahkan basis data sekarang, dengan sinkronisasi.

Level 2 - Domain yang dipisahkan secara logis dan sistem pelaporan, tetapi pisahkan basis data sekarang

Level 3 - Domain dan sistem pelaporan yang dipisahkan secara Fisik dan Fisik, dan pisahkan basis data dengan sinkronisasi.

Level 3 - Domain dan sistem pelaporan yang dipisahkan secara Fisik dan Fisik, dan pisahkan basis data dengan sinkronisasi.

Gagasan utamanya adalah bahwa pelaporan dan domain memiliki kebutuhan yang sangat berbeda. Profil data yang berbeda (membaca vs menulis dan memperbarui frekuensi), persyaratan kinerja yang berbeda, dll. Jadi mereka perlu diimplementasikan secara berbeda, dan itu memerlukan beberapa duplikasi logika bisnis.

Terserah bisnis Anda untuk menemukan cara untuk menjaga agar logika bisnis dari domain dan sistem pelaporan tetap mutakhir.

richard
sumber
1

diperlukan laporan / dashboard untuk menunjukkan daftar proyek aktif

Keadaan setiap proyek harus disimpan sebagai informasi statis, per-perhitungan, dan diformat dengan baik dalam database dan setiap simulasi harus ditangani pada klien sebagai WebApp.

tanggal habis anggaran pada laju pembakaran saat ini

jenis proyeksi ini tidak boleh dijalankan atas permintaan. Mengelola informasi ini berdasarkan permintaan, seperti melakukan perhitungan pada sumber daya, tingkat, tugas, tonggak, dll, akan menghasilkan penggunaan yang luas dari lapisan perhitungan tanpa menggunakan kembali hasil ini untuk panggilan selanjutnya.

Membayangkan lingkungan terdistribusi ( cloud pribadi atau publik ), Anda akan mendapatkan biaya yang sangat besar di lapisan komputasi, rendahnya penggunaan basis data, dan total kekurangan cache.

Haruskah ini dijalankan melalui domain terlebih dahulu? Bagaimana dengan kinerja?

Desain perangkat lunak Anda harus mencakup kemampuan untuk melakukan normalisasi perhitungan yang diperlukan untuk mendapatkan hasil yang diperlukan selama "input data", bukan saat membaca. Pendekatan ini sangat mengurangi penggunaan sumber daya komputasi, dan di atas semua itu menciptakan tabel yang dapat dianggap sebagai "hanya baca" oleh pelanggan. Ini adalah langkah pertama untuk membuat mekanisme caching yang solid dan sederhana.

Jadi cari dulu, sebelum menyelesaikan arsitektur perangkat lunak, bisa jadi Distributed Cache System .

(permintaan: agregasi)! = 1: 1

Karena itu pertimbangan saya (untuk contoh pertama dan kedua), cobalah untuk memahami kapan waktu yang tepat untuk menormalkan data, memiliki sebagai tujuan untuk mengurangi agregasi per permintaan klien. Yang tidak bisa 1: 1 (permintaan: agregasi) jika satu tujuan memperoleh sistem yang berkelanjutan.

Bagikan perhitungan pada klien

Pertanyaan lain, sebelum menyelesaikan desain perangkat lunak, bisa jadi, berapa normalisasi, kita ingin mendelegasikan browser klien?

Itu bernama MV *, memang benar bahwa itu modis hari ini, di samping ini, salah satu tujuannya adalah untuk membuat WebApp (aplikasi halaman tunggal), yang dapat dianggap sebagai hadirnya banyak aplikasi yang kompleks (dan untungnya untuk tagihan yang kami membayar ke penyedia cloud, ini dieksekusi di klien).

Oleh karena itu kesimpulan saya adalah:

  1. Memahami berapa banyak operasi yang benar-benar diperlukan untuk melaksanakan penyajian data;

  2. Menganalisis berapa banyak dari ini dapat dilakukan di latar belakang (dan kemudian didistribusikan melalui sistem cache, setelah normalisasi mereka);

  3. Memahami berapa banyak operasi yang dapat dieksekusi di klien, mendapatkan konfigurasi proyek, menjalankannya pada Views di WebApp dan dengan demikian mengurangi perhitungan yang dilakukan di back-end;

marcocs
sumber
Hai Marcocs, terima kasih atas jawaban Anda. Dua masalah yang saya lihat dengan melakukan pra-agregasi di sisi klien adalah 1. Anda memiliki BANYAK tindakan yang dapat menghasilkan prapenghitungan dan 2. Mungkin BANYAK prapenghitungan diperlukan. Menyatukan keduanya dan Anda mendapatkan penggunaan sumber daya yang sangat berat. Misalnya ... anggaran harus dihitung ulang ketika A. setiap tarif tagihan pada perubahan anggaran (ini dapat dipicu oleh beberapa hal ... tindakan pengguna, atau rollover terjadwal ke nilai baru misalnya tarif berubah pada awal tahun fiskal baru), atau B. Komposisi anggaran ...
richard
... perubahan misalnya jam ditambahkan atau dikurangi. Dll. Daftar berlanjut. Sejauh # 2 agregasi diperlukan ... besok pelanggan perlu melihat agregasi berdasarkan wilayah, kemudian mereka ingin melihat berdasarkan karyawan, atau berdasarkan kota, atau industri, atau atribut gila lainnya pada proyek atau entitas terkait. Apakah Anda akan melakukan agregat semua ini? Jika demikian, sekarang Anda membuat mesin OLAP ... Juga, apakah agregasi ini termasuk disimpan dalam Objek proyek di domain? Saat Anda menyajikan data, kapan Anda akan menggunakan nilai yang dihitung vs nilai yang dihitung sebelumnya. Dll. Apakah Anda membuat karya ini di aplikasi dunia nyata?
richard
Saya tertarik dengan pendekatan ini, tetapi itu menghadirkan banyak masalah di pikiran saya.
richard
Saya memiliki sistem distribusi pendapatan yang sedang berjalan & berjalan, masalah saya adalah menunjukkan status penghasilan saat ini, berdasarkan data yang dihasilkan oleh sub-jaringan agen (termasuk penarikan, deposito, jackpot, ..). Sub-jaringan, mereka menggunakan saldo mereka terus-menerus, ini meningkatkan / menurunkan laba dari ayah jaringan. Distribusi pendapatan dilakukan secara berkala setiap hari Senin, masalahnya adalah untuk menunjukkan secara real time evolusi keuntungan, dan memperbarui virtual anggaran semua jaringan.
marcocs
Untuk menghindari agregasi di seluruh jaringan, dan mendistribusikan semua nilai secara real time setiap kali permintaan dibuat, proses penempatan sementara dilakukan secara terus menerus untuk menormalkan pendapatan jaringan. Setiap kali Anda membuat permintaan, nilai yang dihitung dijumlahkan dengan menggabungkan nilai-nilai yang tidak termasuk dalam penyebaran sementara (saya hanya bekerja dengan item-pembaruan terakhir). Tabel transaksi (yang jelas adalah salah satu yang menderita beban dalam aplikasi ini), ditangani dengan partisi tabel .
marcocs
1

Gunakan cache untuk kueri, gunakan domain untuk caching.

Ada fitur yang disebut "pengguna teratas" di stackoverflow. Anda dapat menemukan baris di buttom halaman pengguna teratas, mengatakan "Hanya pertanyaan dan jawaban non-komunitas wiki yang termasuk dalam total ini ( diperbarui setiap hari )". Ini menunjukkan data di-cache.

Tapi kenapa?

Untuk masalah kinerja mungkin. Mungkin mereka memiliki keprihatinan yang sama dengan kebocoran domain logika ("Hanya pertanyaan dan jawaban non-komunitas-wiki yang dimasukkan dalam total ini" dalam kasus ini).

Bagaimana?

Saya tidak benar-benar tahu bagaimana mereka melakukan ini, jadi ini hanya dugaan :)

Pertama, kita perlu menemukan target pertanyaan / jawaban. Tugas penjadwalan dapat bekerja, cukup ambil semua target potensial.

Kedua, mari kita lihat hanya satu pertanyaan / jawaban. Apakah ini bukan komunitas-wiki? Apakah dalam 30 hari? Cukup mudah untuk menjawab dengan model domain. Hitung suara dan cache jika puas.

Sekarang kita memiliki cache, mereka adalah output dari turunan domain. Permintaannya cepat dan mudah karena hanya ada kriteria sederhana untuk diterapkan.

Bagaimana jika hasilnya harus lebih "real time"?

Acara dapat membantu. Alih-alih memicu caching dengan tugas penjadwalan, kami dapat membagi proses menjadi banyak sub-proses. Misalnya, ketika seseorang memberikan suara pada jawaban hippoom, kami menerbitkan acara yang memicu pembaruan cache pengguna teratas hippoom. Dalam hal ini, kita mungkin sering melihat tugas kecil cepat.

Apakah CQRS perlu?

Baik dengan pendekatan tugas penjadwalan maupun dengan pendekatan peristiwa. Tetapi cqrs memang memiliki keunggulan. Cache biasanya sangat berorientasi pada tampilan, jika beberapa item tidak diperlukan pada awalnya, kami mungkin tidak menghitung dan menyimpannya sama sekali. CQRS dengan sumber acara membantu mengkonsep ulang cache untuk data historis dengan memutar ulang acara.

Beberapa pertanyaan terkait:
1. https://stackoverflow.com/questions/21152958/how-to-handle-summary-report-in-cqrs 2. https://stackoverflow.com/questions/19414951/how-to-use -kaya-domain-dengan-operasi-besar-besaran / 19416703 # 19416703

Semoga bermanfaat :)

Yugang Zhou
sumber
0

Penafian:
Saya cukup berpengalaman dalam aplikasi dengan model domain.
Saya memahami semua konsep, dan saya sudah lama berpikir tentang bagaimana menerapkan konsep-konsep ini ke aplikasi yang saya kerjakan (yang kaya domain, tapi kurang OO, model domain aktual, dll . ) .
Pertanyaan ini adalah salah satu masalah utama yang saya hadapi juga. Saya punya ide bagaimana menyelesaikan ini, tetapi seperti yang saya katakan ... itu hanya ide yang saya buat.
Saya belum mengimplementasikannya dalam proyek yang sebenarnya, tetapi saya tidak melihat alasan mengapa itu tidak berhasil.


Sekarang saya sudah menjelaskannya, inilah yang saya buat - saya akan menggunakan contoh pertama Anda (metrik proyek) untuk menjelaskan:

Ketika seseorang mengedit proyek, Anda memuat dan menyimpannya melalui model domain Anda.
Pada saat ini, Anda memiliki semua informasi yang dimuat untuk menghitung semua metrik Anda (total anggaran, upaya hingga saat ini, dll.) Untuk proyek ini.

Anda dapat menghitung ini dalam model domain, dan menyimpannya ke database dengan sisa model domain.
Jadi Projectkelas dalam model domain Anda akan memiliki beberapa properti seperti TotalBudget, EffortToDatedll., Dan juga akan ada kolom dengan nama-nama dalam tabel database di mana model domain Anda disimpan (dalam tabel yang sama, atau dalam tabel yang terpisah ... tidak itu penting) .

Tentu saja, Anda perlu melakukan satu kali lari untuk menghitung nilai untuk semua proyek yang ada saat Anda mulai dengan ini. Tetapi setelah itu, data diperbarui secara otomatis dengan nilai yang dihitung saat ini setiap kali proyek diedit melalui model domain.

Jadi, setiap kali Anda memerlukan laporan apa pun, semua data yang diperlukan sudah ada (pra-dihitung) dan Anda bisa melakukan sesuatu seperti ini:

select ProjectName, TotalBudget, EffortToDate from Projects where TotalBudget > X

Tidak masalah apakah Anda mendapatkan data secara langsung dari tabel tempat model domain disimpan, atau jika Anda entah bagaimana mengekstrak data ke database kedua, ke gudang data atau apa pun:

  1. Jika toko pelaporan Anda berbeda dari penyimpanan data Anda yang sebenarnya, Anda bisa menyalin data dari "tabel model domain"
  2. Jika Anda secara langsung menanyakan penyimpanan data aktual Anda, data sudah ada di sana dan Anda tidak perlu menghitung apa pun

Dalam kedua kasus tersebut, logika bisnis untuk penghitungan berada tepat di satu tempat: model domain.
Anda tidak memerlukannya di tempat lain, jadi Anda tidak perlu menduplikasinya.

Christian Specht
sumber
Hai Christian, saya senang melihat saya bukan satu-satunya yang berjuang dengan ini. Terima kasih atas jawaban anda. Lihat komentar saya di jawaban Marcocs untuk masalah yang saya lihat dengan pendekatan ini. Setiap ide untuk berurusan dengan itu akan sangat dihargai!
richard