डोमेन-समृद्ध एप्लिकेशन में रिपोर्टिंग और डैशबोर्ड के लिए डेटा की पुनर्प्राप्ति के लिए सर्वोत्तम अभ्यास या डिज़ाइन पैटर्न


44

सबसे पहले, मैं यह कहना चाहता हूं कि यह एक उपेक्षित प्रश्न / क्षेत्र है, इसलिए यदि इस प्रश्न में सुधार की आवश्यकता है, तो मुझे यह एक महान प्रश्न बनाने में मदद करें जो दूसरों को लाभ पहुंचा सके! मैं उन लोगों से सलाह और मदद की तलाश कर रहा हूं जिन्होंने इस समस्या को हल करने वाले समाधानों को लागू किया है, न कि केवल विचारों को आजमाने के लिए।

मेरे अनुभव में, एक एप्लिकेशन के दो पक्ष हैं - "कार्य" पक्ष, जो काफी हद तक डोमेन संचालित है और वह है जहां उपयोगकर्ता डोमेन मॉडल (एप्लिकेशन के "इंजन") और रिपोर्टिंग पक्ष, जहां उपयोगकर्ता हैं के साथ बड़े पैमाने पर बातचीत करते हैं कार्य पक्ष पर क्या होता है इसके आधार पर डेटा प्राप्त करें।

कार्य की ओर, यह स्पष्ट है कि एक समृद्ध डोमेन मॉडल के साथ एक आवेदन डोमेन मॉडल में व्यावसायिक तर्क होना चाहिए और डेटाबेस का उपयोग ज्यादातर दृढ़ता के लिए किया जाना चाहिए। चिंताओं का पृथक्करण, प्रत्येक पुस्तक इसके बारे में लिखी गई है, हम जानते हैं कि क्या करना है, भयानक।

रिपोर्टिंग पक्ष का क्या? क्या डेटा वेयरहाउस स्वीकार्य हैं, या क्या वे खराब डिज़ाइन हैं क्योंकि वे डेटाबेस और बहुत ही डेटा में व्यावसायिक तर्क को शामिल करते हैं? डेटाबेस से डेटा को डेटा वेयरहाउस डेटा में एकत्रित करने के लिए, आपने डेटा के लिए व्यावसायिक तर्क और नियम लागू किए होंगे, और यह तर्क और नियम आपके डोमेन मॉडल से नहीं आए थे, यह आपके डेटा एकत्रीकरण प्रक्रियाओं से आया था। क्या वह गलत है?

मैं बड़े वित्तीय और परियोजना प्रबंधन अनुप्रयोगों पर काम करता हूं जहां व्यापार तर्क व्यापक है। इस डेटा पर रिपोर्टिंग करते समय, रिपोर्ट / डैशबोर्ड के लिए आवश्यक जानकारी खींचने के लिए मेरे पास अक्सर बहुत सारे एकत्रीकरण होंगे और एकत्रीकरण में बहुत सारे व्यावसायिक तर्क होते हैं। प्रदर्शन के लिए, मैं इसे उच्च एकत्रित तालिकाओं और संग्रहीत प्रक्रियाओं के साथ कर रहा हूं।

उदाहरण के रूप में, मान लीजिए कि एक रिपोर्ट / डैशबोर्ड को सक्रिय परियोजनाओं (10,000 परियोजनाओं की कल्पना) की एक सूची दिखाने के लिए आवश्यक है। प्रत्येक परियोजना को इसके साथ दिखाए गए मैट्रिक्स के एक सेट की आवश्यकता होगी, उदाहरण के लिए:

  1. कुल बजट
  2. तिथि करने का प्रयास
  3. जलने की दर
  4. वर्तमान जल दर पर बजट थकावट की तारीख
  5. आदि।

इनमें से प्रत्येक में बहुत सारे व्यावसायिक तर्क शामिल हैं। और मैं सिर्फ संख्या या कुछ सरल तर्क को गुणा करने की बात नहीं कर रहा हूं। मैं बजट प्राप्त करने के बारे में बात कर रहा हूं, आपको 500 अलग-अलग दरों के साथ एक दर पत्रक लागू करना होगा, प्रत्येक कर्मचारी के समय के लिए (कुछ परियोजनाओं पर, दूसरे का गुणक है), खर्चों और किसी भी उपयुक्त मार्कअप को लागू करना होगा, आदि। तर्क व्यापक है। क्लाइंट के लिए उचित समय में इस डेटा को प्राप्त करने के लिए बहुत सारे एकत्रीकरण और क्वेरी ट्यूनिंग हुई।

क्या इसे पहले डोमेन के माध्यम से चलाया जाना चाहिए? प्रदर्शन के बारे में क्या? यहां तक ​​कि सीधे एसक्यूएल प्रश्नों के साथ, मैं क्लाइंट को समय की उचित मात्रा में प्रदर्शित करने के लिए मुश्किल से इस डेटा को तेजी से प्राप्त कर रहा हूं। अगर मैं इन सभी डोमेन ऑब्जेक्ट्स को पुन: प्राप्त कर रहा हूं, और एप्लिकेशन लेयर में उनके डेटा को मिक्स एंड मैच कर रहा हूं या एग्रीगेट कर रहा हूं, या एप्लिकेशन में डेटा एग्रीगेट करने की कोशिश कर रहा हूं, तो मैं इस डेटा को तेजी से प्राप्त करने की कोशिश नहीं कर सकता।

इन मामलों में ऐसा लगता है कि SQL डेटा क्रंच करने में अच्छा है, और इसका उपयोग क्यों नहीं किया जाता है? लेकिन फिर आपके पास अपने डोमेन मॉडल के बाहर व्यावसायिक तर्क हैं। व्यावसायिक तर्क में कोई परिवर्तन आपके डोमेन मॉडल और आपकी रिपोर्टिंग एकत्रीकरण योजनाओं में बदलना होगा।

मैं वास्तव में इस बात के लिए नुकसान में हूं कि डोमेन संचालित डिजाइन और अच्छी प्रथाओं के संबंध में किसी भी एप्लिकेशन के रिपोर्टिंग / डैशबोर्ड भाग को कैसे डिज़ाइन किया जाए।

मैंने MVC टैग जोड़ा क्योंकि MVC डिज़ाइन फ़्लेवर डु पत्रिका है और मैं इसे अपने वर्तमान डिज़ाइन में उपयोग कर रहा हूं, लेकिन यह पता नहीं लगा सकता कि रिपोर्टिंग डेटा इस प्रकार के एप्लिकेशन में कैसे फिट बैठता है।

मैं इस क्षेत्र में किसी भी मदद की तलाश कर रहा हूं - किताबें, डिजाइन पैटर्न, मुख्य शब्द Google, लेख, कुछ भी। मुझे इस विषय पर कोई जानकारी नहीं मिल रही है।

संपादित करें और अन्य उदाहरण

एक और आदर्श उदाहरण मैं आज भर में चला। ग्राहक ग्राहक बिक्री टीम के लिए एक रिपोर्ट चाहता है। वे चाहते हैं कि एक साधारण मीट्रिक जैसा लगता है:

प्रत्येक विक्रय व्यक्ति के लिए, आज तक की उनकी वार्षिक बिक्री क्या है?

लेकिन यह जटिल है। प्रत्येक बिक्री व्यक्ति ने कई बिक्री अवसरों में भाग लिया। कुछ वे जीते, कुछ उन्होंने नहीं जीते। प्रत्येक बिक्री अवसर में, कई बिक्री वाले लोग होते हैं जिन्हें प्रत्येक को उनकी भूमिका और भागीदारी के अनुसार बिक्री के लिए क्रेडिट का प्रतिशत आवंटित किया जाता है। तो अब इसके लिए डोमेन के माध्यम से जाने की कल्पना करें ... ऑब्जेक्ट रिहाइड्रेशन की मात्रा आपको प्रत्येक बिक्री व्यक्ति के लिए डेटाबेस से इस डेटा को खींचने के लिए करना होगा:

सभी प्राप्त करें SalesPeople->
प्रत्येक के लिए अपना SalesOpportunities->
प्राप्त करें प्रत्येक के लिए अपनी बिक्री का प्रतिशत प्राप्त करें और अपनी बिक्री राशि की गणना करें और
फिर अपनी सभी SalesOpportunityबिक्री राशि जोड़ें ।

और वह एक मीट्रिक है। या आप एक SQL क्वेरी लिख सकते हैं जो इसे जल्दी और कुशलता से कर सकती है और इसे तेज करने के लिए ट्यून करती है।

EDIT 2 - CQRS पैटर्न

मैंने CQRS पैटर्न के बारे में पढ़ा है और, जबकि पेचीदा, यहां तक ​​कि मार्टिन फाउलर का कहना है कि यह परीक्षण नहीं किया गया है। तो यह समस्या अतीत में हल कैसे हुई। इसका किसी न किसी बिंदु पर सभी को सामना करना पड़ा होगा। सफलता के ट्रैक रिकॉर्ड के साथ एक स्थापित या अच्छा पहनावा क्या है?

संपादन 3 - रिपोर्टिंग सिस्टम / उपकरण

इस संदर्भ में एक और बात पर विचार करना उपकरण है। रिपोर्टिंग सेवा / क्रिस्टल रिपोर्ट, विश्लेषण सेवाएँ और कॉग्नोसेंटी, आदि सभी SQL / डेटाबेस से डेटा की उम्मीद करते हैं। मुझे संदेह है कि आपका डेटा आपके व्यवसाय के माध्यम से बाद में इनके लिए आएगा। और फिर भी वे और उनके जैसे अन्य लोग बहुत बड़ी प्रणालियों में रिपोर्टिंग का एक महत्वपूर्ण हिस्सा हैं। इन आंकड़ों के लिए डेटा को कैसे ठीक से संभाला जाता है जहां इन प्रणालियों के डेटा स्रोत में व्यावसायिक तर्क भी है और संभवत: स्वयं रिपोर्ट में भी?


2
कृपया क्रॉस-पोस्ट न करें। प्रोग्रामर देखें
।stackexchange.com

3
सॉरी का मतलब यह नहीं था। मॉड ने मुझे यहां रेपोस्ट करने के लिए कहा, लेकिन तब जाहिरा तौर पर एक ही सवाल को स्थानांतरित करने में सक्षम था इसलिए मुझे दो मिले। उसके लिए माफ़ करना।
ऋचाद

मैं उलझन में हूं। क्या किसी ने ऐसा नहीं किया है? कोई भी इस मुद्दे का सामना नहीं करता है?
ऋचाद

क्या आपकी 'चिंताओं का पृथक्करण' कार्य / रिपोर्ट पक्षों के लिए थोड़ा सैद्धांतिक नहीं है? आप कह सकते हैं कि रिपोर्टिंग पक्ष के व्यावसायिक नियम भी हैं, इसलिए आप पूरी श्रृंखला में व्यावसायिक तर्क रखने से बच नहीं सकते। आप जो भी बीआई उपकरण का उपयोग करते हैं, आपको इनपुट कार्यों से लेकर रिपोर्टिंग चरण तक (कुल वस्तुओं को परिभाषित करना और इसी तरह) सभी तरह के मध्यवर्ती परिणाम बनाने होंगे। फिर यह सवाल उबल जाता है कि कहां क्या कमी है। हो सकता है कि आप किसी पायरियम (टॉप कट ऑफ के साथ) या फ़नल रूपक के साथ समस्या का सामना कर सकते हैं।
Jan Doggen

@JanDoggen यह बिल्कुल मेरी बात है। बीआई उपकरण में बीएल तर्क होगा। अब मैं बीएल की नकल कर रहा हूं जो मेरे सॉफ्टवेयर उत्पाद के समृद्ध डोमेन में है। क्या वह ठीक है?
रिचार्ड

जवाबों:


16

यह एक बहुत ही शानदार जवाब है, लेकिन मामले के दिल के लिए सही हो रहा है:

DDD के संदर्भ में शायद एक बंधे हुए संदर्भ के रूप में रिपोर्टिंग करने के बारे में सोचते हैं ?, इसलिए "THE" डोमेन मॉडल के संदर्भ में सोचने के बजाय, आपको यह सोचने के लिए तैयार होना चाहिए कि एक से अधिक मॉडल होना ठीक है। तो हाँ यह ठीक है अगर रिपोर्टिंग डोमेन में व्यावसायिक तर्क की रिपोर्टिंग है, जैसे कि लेन-देन डोमेन के लिए ठीक है, तो उसमें लेन-देन व्यवसाय तर्क है।

प्रश्न के अनुसार, SQL स्टोरेज प्रक्रियाओं बनाम डोमेन मॉडल को एप्लिकेशन कोड में कहें, ट्रांसेक्शनल सिस्टम के लिए रिपोर्टिंग सिस्टम के लिए समान पेशेवरों और विपक्ष लागू होते हैं।

चूँकि मैंने देखा कि आपने प्रश्न में एक जोड़ा, मैंने प्रश्न को फिर से पढ़ा और देखा कि आप इस पर विशिष्ट संसाधन के लिए पूछ रहे हैं, तो मैंने सोचा कि मैं सुझाव देने के साथ शुरू करूँगा कि आप इस मामले पर अन्य स्टैक ओवरफ्लो प्रश्नों को देखें, और मुझे यह एक मिला https://stackoverflow.com/questions/11554231/how-does-domain-driven-design-handle-reporting

उस एक के सामान्य सार का उपयोग CQRS को आपके सिस्टम के लिए एक पैटर्न के रूप में करना है, जो DDD के अनुरूप है, और क्वेरी साइड जिम्मेदारियों को रिपोर्टिंग करने के तरीके के रूप में निर्भर करता है, लेकिन मुझे यकीन नहीं है कि इसमें एक उपयोगी उत्तर है आपका मुकदमा।

मुझे यह http://www.martinfowler.com/bliki/ReportingDatabase.html भी मिला , जिसे मैंने यहां से जोड़ा: http://groups.yahoo.com/neo/groups/domaindrivendesign/conversations/topics/2261

यहाँ इस मामले पर ACM का एक दिलचस्प लेख है: http://dl.acm.org/citation.cfm?id=2064685 लेकिन यह एक paywall के पीछे है इसलिए मैं वास्तव में इसे नहीं पढ़ सकता (ACM सदस्य नहीं :()।

इसी तरह के सवाल पर यहां भी इसका जवाब है: https://stackoverflow.com/questions/3380431/cqrs-ddd-synching-reporting-database

और यह एक: http://snape.me/2013/05/03/applying-domain-driven-design-to-data-warehouses/

उम्मीद है की यह मदद करेगा!


हाय @RibaldEddie। उत्तर के लिए धन्यवाद। मुझे ग्लिब नहीं लगता। तो आप कह रहे हैं कि स्टोर की गई प्रक्रियाओं को डोमेन बाउंडेड संदर्भ के लिए डोमेन लेयर मान लेना ठीक है?
ऋचाद

यदि आपके पास आपकी स्थिति में ऐसा करने का अच्छा कारण है तो यह ठीक है। व्यक्तिगत रूप से मुझे यकीन नहीं है कि मैं किसी भी मामले में एसपी का उपयोग करूंगा, शायद कुछ डेटा सत्यापन के अलावा या साफ-सफाई के लिए, अन्यथा मैं हर मामले में इससे दूर रहना चाहूंगा।
रिबॉल्डएड्डी

4

आपके प्रश्न से मेरी समझ यह है: दैनिक कार्य के लिए आवेदन है

देखें >> नियंत्रक >> मॉडल (BL) >> डेटाबेस (डेटा)

रिपोर्टिंग उद्देश्य के लिए आवेदन

देखें >> नियंत्रक >> मॉडल >> डेटाबेस (डेटा + बीएल)

इसलिए ' टास्क एप्लीकेशन ' के लिए बीएल में बदलाव से ' रिपोर्टिंग ' बीएल में भी बदलाव आएगा । क्या आपकी वास्तविक समस्या सही है? वैसे दो बार परिवर्तन करने के लिए ठीक है, उस दर्द को आपको वैसे भी लेना है। कारण यह है कि दोनों बीएल अपने संबंधित चिंताओं से अलग हो गए हैं। एक डेटा लाने के लिए है और एक एग्रेगेटिंग डेटा के लिए है। साथ ही, आपके मूल बीएल और एग्रेग्रेगेटिंग बीएल को विभिन्न प्रौद्योगिकी या भाषा ( C # / java और SQL proc ) में लिखा जाएगा । इससे कोई बचने वाला नहीं है।

विशेष रूप से रिपोर्टिंग से संबंधित नहीं एक और उदाहरण दें। मान लीजिए कि एक कंपनी XXX सभी उपयोगकर्ताओं की व्याख्या के लिए मेल ट्रैक करती है और मार्केटिंग कंपनियों को वह जानकारी बेचती है। अब इसमें व्याख्या के लिए एक बीएल और विपणन कंपनियों के लिए एग्रेगेटिंग डेटा के लिए एक बीएल होगा। दोनों बीएल के लिए चिंताएं अलग हैं। कल अगर उनके बीएल में बदलाव होता है तो क्यूबा से आने वाले मेलों को नजरअंदाज किया जाना चाहिए, फिर दोनों पक्षों में व्यावसायिक तर्क को बदल दिया जाएगा।


3

शिथिल बोलने के लिए रिपोर्टिंग एक बद्ध संदर्भ, या एक उपडोमेन है। यह डेटा एकत्र करने / एकत्र करने और व्यावसायिक बुद्धि हासिल करने के लिए इसे संसाधित करने की व्यावसायिक आवश्यकता को हल करता है।

आप इस उपडोमेन को कैसे लागू करते हैं, यह संभवत: (सबसे) वास्तुशिल्प रूप से सही तरीका है जो आप ऐसा कर सकते हैं, और आपके बुनियादी ढांचे की अनुमति देगा। मुझे पूर्व की तरफ से शुरुआत करना पसंद है, और बाद में केवल आवश्यक रूप से आगे बढ़ना है।

आप शायद इसे दो प्राथमिक समस्याओं में विभाजित कर सकते हैं जिन्हें आप हल कर रहे हैं:

  1. एकत्रीकरण, या डेटा भंडारण। यह कुछ डेटा स्रोत को संसाधित करना चाहिए, और जानकारी को इस तरह से संयोजित करना चाहिए कि वह किसी अन्य डेटा स्रोत में संग्रहीत हो।

  2. व्यवसायिक बुद्धिमत्ता प्रदान करने के लिए एकत्रित डेटा स्रोत को छोड़ना।

उन समस्याओं में से कोई भी किसी विशिष्ट डेटाबेस या भंडारण इंजन को संदर्भित नहीं करता है। आपका डोमेन लेयर सिर्फ इंटरफेसेस के साथ काम करना चाहिए, विभिन्न इंफ्रास्ट्रक्चर एडेप्टर द्वारा आपके इंफ्रास्ट्रक्चर लेयर में लागू किया जाना चाहिए।

आपके पास विभिन्न श्रमिक या कुछ अनुसूचित नौकरी चल सकती है, जो कुछ चलती भागों में विभाजित है:

  • क्वेरी करने के लिए कुछ
  • कुल मिलाकर कुछ
  • स्टोर करने के लिए कुछ

उम्मीद है कि आप वहां से कुछ CQRS चमक देख सकते हैं।

रिपोर्टिंग पक्ष पर, इसे केवल क्वेरी करने की आवश्यकता है, लेकिन सीधे डेटाबेस में नहीं। यहां अपने इंटरफेस और अपने डोमेन लेयर के माध्यम से जाएं। यह आपके प्राथमिक कार्यों के समान समस्या डोमेन नहीं है, लेकिन फिर भी कुछ तर्क होने चाहिए, जिनका आप पालन करना चाहते हैं।

जैसे ही आप सीधे डेटाबेस में गोता लगाते हैं, आप इस पर अधिक निर्भर करते हैं, और यह अंततः आपके मूल एप्लिकेशन की डेटा आवश्यकताओं के साथ हस्तक्षेप कर सकता है।

इसके अलावा, कम से कम मेरे लिए, मैं निश्चित रूप से परीक्षण लिखना और प्रश्नों या संग्रहीत प्रक्रियाओं के बजाय कोड में विकसित करना पसंद करता हूं। मुझे यह भी पसंद है कि मैं ख़ुद को विशिष्ट साधनों में बंद न करूं जब तक कि बिल्कुल आवश्यक न हो।


3

व्यापक क्षेत्र नेटवर्क पर बड़ी मात्रा में जानकारी प्राप्त करना, इंटरनेट सहित, प्रतिक्रिया की विलंबता से उत्पन्न होने वाले मुद्दों के कारण समस्याग्रस्त है, डेटा की सेवा करने के लिए प्रत्यक्ष मेमोरी का अभाव, और गलती सहिष्णुता।

यह प्रश्न बड़ी मात्रा में डेटा लौटाने वाले प्रश्नों से परिणामों को सुलझाने के लिए एक डिज़ाइन पैटर्न का वर्णन करता है। आमतौर पर ये प्रश्न एक विस्तृत क्षेत्र नेटवर्क (या इंटरनेट) पर क्लाइंट प्रक्रिया द्वारा एक दूरस्थ सर्वर पर रहने वाले एक रिलेशनल डेटाबेस के लिए एक या एक से अधिक मध्य-स्तरों के साथ किए जाएंगे।

समाधान में डेटा पुनर्प्राप्ति रणनीतियों का एक संयोजन लागू करना शामिल है, जिसमें डेटा सेटों का पता लगाने के लिए पुनरावृत्तियों का उपयोग और क्लाइंट को एक उपयुक्त स्तर प्रदान करना, डेटा सबसेट का डबल-बफरिंग, बहु-थ्रेडेड डेटा पुनर्प्राप्ति और क्वेरी स्लाइसिंग शामिल है।


यह सुनिश्चित नहीं है कि यह मेरे प्रश्न से कैसे संबंधित है या इसे 3 वोट कैसे मिले। क्या आपके पास यहां एक लिंक शामिल करने का मतलब है?
रिचार्ड

2
ऐसा लगता है कि इस जवाब के लिए इनाम को स्वत: सम्मानित किया गया था। यह उत्तर मुझे अस्पष्ट लगता है और मैं इस इनाम से सम्मानित नहीं होता।
रिचार्ड

2

यह रिपोर्टिंग से अलग परिचालन / लेनदेन डेटा स्टोर के लिए विशिष्ट है। बाद वाले को कानूनी कारणों के लिए डेटा रखने की आवश्यकता हो सकती है (जैसे वित्तीय ऑडिटिंग के लिए वित्तीय डेटा के सात साल), और आप अपने लेनदेन डेटा में वह सब नहीं चाहते हैं।

इसलिए आप कुछ समय के उपाय (साप्ताहिक, मासिक, त्रैमासिक, वार्षिक) द्वारा अपने लेन-देन के डेटा को विभाजित करेंगे और पुराने रिपोर्टिंग को ईटीएल के माध्यम से अपने रिपोर्टिंग / इतिहास डेटा स्टोर में स्थानांतरित करेंगे। यह स्टार स्कीमा और आयामों के साथ डेटा वेयरहाउस हो सकता है या नहीं भी हो सकता है। आप आवधिक रिपोर्ट उत्पन्न करने के लिए तदर्थ क्वेरी और रोल अप और बैच जॉब करने के लिए डेटा वेयरहाउसिंग रिपोर्टिंग टूल का उपयोग करेंगे।

मैं आपके लेनदेन डेटा स्टोर के खिलाफ रिपोर्ट करने की अनुशंसा नहीं करूंगा।

यदि आप प्रेस करना पसंद करते हैं, तो यहां अधिक विचार हैं:

  1. "सर्वश्रेष्ठ" व्यक्तिपरक है और क्या काम करता है।
  2. मैं खुद उन्हें लिखने के बजाय एक रिपोर्टिंग उत्पाद खरीदता हूँ।
  3. यदि आप एक रिलेशनल डेटाबेस का उपयोग कर रहे हैं, तो SQL शहर में एकमात्र गेम है।
  4. संग्रहीत प्रक्रियाएं इस बात पर निर्भर करती हैं कि आपके पास उन्हें लिखने का कौशल है या नहीं।

प्रोजेक्ट प्रबंधन सॉफ्टवेयर जो आप घर में उपयोग करते हैं? मैं बनाने से पहले खरीदूँगा। रैली और माइक्रोसॉफ्ट प्रोजेक्ट जैसा कुछ।


धन्यवाद @duffymo यह डेटा केवल कानूनी कारणों से संग्रहीत नहीं है। यह टन और टन डेटा है जो नियमित रूप से उपयोग और रिपोर्ट किया जाता है। कंपनी रिपोर्ट और डैशबोर्ड से जीवित और मर जाती है। यह सब के बाद परियोजना प्रबंधन सॉफ्टवेयर है। डेटा के साथ इन रिपोर्ट और डैशबोर्ड को आपूर्ति करने का सबसे अच्छा तरीका क्या है? एकत्रीकरण और इसे SQL के साथ बाहर खींच रहा है? व्यवसाय तर्क के लिए इसके लिए स्टोर प्रक्रिया में होना ठीक है? मेरे सभी प्रश्न अभी भी अनुत्तरित हैं!
रिचार्ड

आपके पास एक उत्तर है - डेटा वेयरहाउस। जैसा आप सुनना चाहते थे वैसा नहीं है। संपादन के लिए ऊपर देखें।
duffymo

तो फिर यह व्यावसायिक तर्क के लिए ठीक है कि डोमेन में डेटा और डेटा वेयरहाउस में डुप्लिकेट किया जा सकता है? इसके अलावा, फिर उस डेटा को खींचकर, क्या मैं किसी भी तरह के डोमेन मॉडल का उपयोग करता हूं? या बस संग्रहीत प्रक्रियाओं और दृश्य में प्रदर्शन के साथ डेटा बाहर खींचो? ऊपर दिए गए आपके बिंदुओं को संबोधित करने के लिए: मैं एक रिपोर्टिंग उत्पाद नहीं खरीद सकता ... इसका कारण यह है कि कंपनी लिख रही है कि किसी भी रिपोर्टिंग उत्पाद द्वारा विशिष्ट आवश्यकताओं को पूरा नहीं किया गया है। मैं एक संबंधपरक डेटाबेस का उपयोग कर रहा हूं और इसमें बहुत अच्छे एसक्यूएल कौशल हैं। लेकिन मैं उस चीज को डिफॉल्ट नहीं करना चाहता जो मैं अच्छा हूं, मैं वह करना चाहता हूं जो अच्छा डिजाइन है।
रिचार्ड

पुन: निर्माण से पहले खरीदें - आप किसी कंपनी को अपने व्यवसाय को सॉफ्टवेयर में ढालने के लिए मजबूर नहीं कर सकते हैं जब वे चाहते हैं कि सॉफ्टवेयर उनके व्यवसाय में फिट हो। रैली और एमएस परियोजना हर किसी के परियोजना प्रबंधन की आवश्यकताओं के अनुरूप नहीं है। बिल्कुल भी।
रिचर्ड

मजबूर नहीं कर सकते, बिल्कुल। लेकिन हर व्यवसाय यह तय करता है कि उनके स्वार्थ में क्या है। यदि आप परियोजना प्रबंधन सॉफ्टवेयर बेचने के व्यवसाय में नहीं हैं, तो यह आकलन करना आपके हित में है कि क्या इसे खरीदना बेहतर है। जैसे अकाउंटिंग सॉफ्टवेयर। उनके दाहिने दिमाग में कौन खरोंच से एक सामान्य खाता बही लिखेगा?
duffymo

2

पहले कुछ शब्दावली, जिसे आप कार्य पक्ष कहते हैं, जिसे लेन-देन के रूप में जाना जाता है और रिपोर्टिंग पक्ष Analytics है।

आपने पहले ही CQRS का उल्लेख किया है जो कि एक महान दृष्टिकोण है लेकिन दृष्टिकोण का बहुत कम प्रलेखित व्यावहारिक अनुप्रयोग है।

जिस चीज़ का बहुत अधिक परीक्षण किया गया है, वह एक विश्लेषणात्मक प्रसंस्करण इंजन के साथ आपकी ट्रांसेक्शनल प्रोसेसिंग को पूरक कर रही है। इसे कभी-कभी डेटा वेयरहाउसिंग या डेटा क्यूब्स के रूप में जाना जाता है। एनालिटिक्स के संबंध में सबसे बड़ा आधार यह है कि वास्तविक समय में अपने लेन-देन के आंकड़ों के खिलाफ प्रश्नों को चलाने का प्रयास करना अक्षम्य है, क्योंकि पढ़ने या लिखने के लिए डेटाबेस का अनुकूलन करना वास्तव में केवल संभव है। लेन-देन के लिए, आप प्रसंस्करण / कार्य करने में देरी से बचने के लिए उच्च लेखन गति चाहते हैं। रिपोर्टिंग के लिए, आप उच्च रीड गति चाहते हैं ताकि निर्णय लिया जा सके।

इन मुद्दों का हिसाब कैसे दें? समझने के लिए सबसे सरल दृष्टिकोण आपकी रिपोर्टिंग और ईटीएल (एक्सट्रैक्ट ट्रांसफॉर्म लोड) के लिए एक चपटा स्कीमा का उपयोग कर रहा है जो सामान्यीकृत ट्रांजेक्शनल स्कीमा से सामान्यीकृत विश्लेषणात्मक स्कीमा से शटल डेटा के लिए है। ETL एक एजेंट के माध्यम से नियमित रूप से चलाया जाता है और एनालिटिक्स टेबल को प्री लोड करता है ताकि यह आपके रिपोर्टिंग इंजन से त्वरित पढ़ने के लिए तैयार हो।

डेटा वेयरहाउसिंग की गति बढ़ाने के लिए एक महान पुस्तक राल्फ किमबॉल द्वारा डेटा वेयरहाउस टूलकिट है। दृष्टिकोण पर अधिक हाथों के लिए। SQL सर्वर का परीक्षण डाउनलोड करें और Microsoft डेटा वेयरहाउस टूलकिट चुनें, जो पहली पुस्तक की सामान्य चर्चा करता है, लेकिन दिखाता है कि SQL सर्वर का उपयोग करके अवधारणाओं को कैसे लागू किया जाए।

उन पृष्ठों से कई लिंक की गई पुस्तकें हैं जो ईटीएल, स्टार स्कीमा डिज़ाइन, बीआई, डैशबोर्ड और अन्य विषयों के बारे में अधिक जानकारी में जाती हैं जो आपको साथ जाने में मदद करती हैं।

जिस स्थान पर आप होना चाहते हैं, वहां से प्राप्त करने का सबसे तेज़ तरीका है, एक बीआई एक्सपर्ट को नियुक्त करना और उसे छाया देना, जबकि वह आपकी ज़रूरतों को पूरा करता है।


हाय माइक। मैं datawarehousing और BI से बहुत परिचित हूं, 15 साल से कर रहा हूं। मेरा प्रश्न यह बताता है कि डोमेन संचालित डिज़ाइन संदर्भ में इसे कैसे संभालना है। क्या डेटवेयर गोदाम ठीक हैं? या वे आपके डोमेन व्यवसाय परत की मिलावट हैं? यदि उत्तर एक डेटा वेयरहाउस का निर्माण करता है और डेटा को वहां से खींचता है, तो उसके लिए बहुत सारा साहित्य और सलाह है। लेकिन फिर आप अपने डोमेन के बाहर व्यावसायिक तर्क की नकल कर रहे हैं। क्या वह ठीक है? यह मेरा सवाल है।
रिछार्ड २

जैसे मैंने CQRS पतों का उल्लेख किया है, जिन्हें रिपॉजिटरी को एक कमांड (ट्रांसेक्शनल) और क्वेरी (रिपोर्टिंग) की ओर से अलग करने की आवश्यकता है। लेकिन CQRS के अन्य ट्रैपिंग के बिना भी, डेटा वेयरहाउस और etl आपके डोमेन के ग्राहक हैं, लेकिन वे इसे संशोधित नहीं करते हैं। तो बीएल अभी भी डोमेन के भीतर निहित है।
माइकल ब्राउन

1
वे डोमेन को संशोधित नहीं करते हैं ... तो डेटा गोदाम के लिए डेटा बनाने के लिए सभी ईटीएल प्रक्रियाओं और डेटा परिवर्तनों को आपके डोमेन से गुजरना पड़ता है? अन्यथा आपके बीटी को आपके ईटीएल प्रक्रियाओं के सभी तर्क में दोहराया गया है।
रिछार्ड

1
हां मैं यह कहूंगा कि एक ईटीएल को सीधे डोमेन का उपयोग करना चाहिए। यह आपको भंगुर उपकरणों से बचने की अनुमति देगा, जिन्हें डेटाबेस में हर आंतरिक परिवर्तन के साथ फिर से लिखना होगा।
माइकल ब्राउन

2

रिपोर्टिंग पक्ष का क्या? क्या डेटा वेयरहाउस स्वीकार्य हैं, या क्या वे खराब डिज़ाइन हैं क्योंकि वे डेटाबेस और बहुत ही डेटा में व्यावसायिक तर्क को शामिल करते हैं?

मुझे नहीं लगता कि आप व्यावसायिक तर्क के बारे में बात कर रहे हैं, यह अधिक रिपोर्टिंग तर्क है। उपयोगकर्ता इस स्क्रीन की जानकारी के साथ क्या करते हैं, क्या यह केवल स्टेटस अपडेट के लिए है? आपके डोमेन मॉडल का उपयोग लेन-देन के संचालन के लिए किया जाता है, रिपोर्टिंग एक अलग चिंता का विषय है। SQL सर्वर से डेटा खींचना या इसे डेटा वेयरहाउस में डालना परिदृश्यों की रिपोर्टिंग के लिए ठीक है।

आपके डोमेन मॉडल को आपके डोमेन के अपरिवर्तनों को लागू करना चाहिए जैसे कि एक परियोजना सदस्य एक ही समय में एक ही परियोजना को बुक नहीं कर सकता है, या केवल सप्ताह में x संख्या में घंटे बुक कर सकता है। या आप इस प्रोजेक्ट को बुक नहीं कर सकते हैं क्योंकि यह पूर्ण है आदि आदि आपके डोमेन मॉडल की स्थिति (डेटा) को अलग से रिपोर्ट करने के लिए कॉपी किया जा सकता है।

क्वेरी प्रदर्शन को बेहतर बनाने के लिए आप एक भौतिक दृश्य का उपयोग कर सकते हैं। जब आपके मॉडल के खिलाफ कोई ऑपरेशन किया जाता है (जैसे कि बुक करने के लिए इस व्यक्ति का 4 घंटे का समय बुक करें) और यह सफल है कि यह एक ऐसी घटना को फेंक सकता है जिसे आप रिपोर्टिंग डेटाबेस में संग्रहीत कर सकते हैं और अपनी रिपोर्ट के लिए आवश्यक गणना कर सकते हैं। फिर उस पर क्वेरी करना बहुत तेज़ होगा।

अपने लेनदेन और रिपोर्टिंग संदर्भों को अलग रखें, एक डोमेन मॉडल की रिपोर्टिंग के लिए एक संबंधपरक डेटाबेस नहीं बनाया गया था।

संपादित करें

इस विषय पर उपयोगी ब्लॉग पोस्ट http://se-thinking.blogspot.se/2012/08/how-to-handle-reporting-with-domain.html


2

यह 4 साल बाद है और मुझे यह प्रश्न फिर से मिला, और मेरे पास क्या है, इसका जवाब है।

आपके आवेदन के आधार पर और यह विशिष्ट आवश्यकताओं, आपके डोमेन / लेनदेन डेटाबेस और आपकी रिपोर्टिंग को अलग-अलग "सिस्टम" या "इंजन" हो सकता है, या उन्हें एक सिस्टम द्वारा सेवित किया जा सकता है। हालांकि, उन्हें तार्किक रूप से अलग होना चाहिए - जिसका अर्थ है कि वे यूआई को डेटा प्राप्त करने और प्रदान करने के विभिन्न साधनों का उपयोग करते हैं।

मैं उन्हें शारीरिक रूप से अलग होना पसंद करता हूं (तार्किक रूप से अलग होने के अलावा), लेकिन बहुत बार आप उन्हें एक साथ (शारीरिक रूप से) शुरू करते हैं और फिर, आवेदन के परिपक्व होने के बाद, आप उन्हें अलग कर देते हैं।

किसी भी तरह से, फिर से, उन्हें तार्किक रूप से अलग होना चाहिए। रिपोर्टिंग सिस्टम में व्यावसायिक तर्क की नकल करना ठीक है। महत्वपूर्ण बात यह है कि रिपोर्टिंग सिस्टम को डोमेन सिस्टम के समान उत्तर मिलता है - लेकिन संभावना है कि यह अलग-अलग माध्यमों से वहां पहुंच जाएगा। उदाहरण के लिए, आपके डोमेन सिस्टम में प्रक्रियात्मक कोड (संभावना) में कार्यान्वित बहुत सख्त व्यावसायिक नियमों का एक टन होगा। रिपोर्टिंग सिस्टम उन्हीं नियमों को लागू कर सकता है जब वह डेटा पढ़ता है, लेकिन SET आधारित कोड (जैसे SQL) के माध्यम से ऐसा करेगा।

यहाँ आपके अनुप्रयोग की वास्तुकला का एक विकास वास्तविक रूप से ऐसा लग सकता है जैसे यह विकसित होता है:

स्तर 1 - तार्किक रूप से अलग डोमेन और रिपोर्टिंग सिस्टम, लेकिन अभी भी एक ही कोडबेस और डेटाबेस में

स्तर 1 - तार्किक रूप से अलग डोमेन और रिपोर्टिंग सिस्टम, लेकिन अभी भी एक ही कोडबेस में

स्तर 2 - तार्किक रूप से अलग डोमेन और रिपोर्टिंग सिस्टम, लेकिन अब अलग डेटाबेस, सिंकिंग के साथ।

स्तर 2 - तार्किक रूप से अलग डोमेन और रिपोर्टिंग सिस्टम, लेकिन अब अलग डेटाबेस

स्तर 3 - तार्किक और शारीरिक रूप से अलग डोमेन और रिपोर्टिंग सिस्टम और सिंकिंग के साथ अलग डेटाबेस।

स्तर 3 - तार्किक और शारीरिक रूप से अलग डोमेन और रिपोर्टिंग सिस्टम और सिंकिंग के साथ अलग डेटाबेस।

मुख्य विचार यह है कि रिपोर्टिंग और डोमेन की मौलिक रूप से अलग-अलग ज़रूरतें हैं। अलग-अलग डेटा प्रोफाइल (रीड्स बनाम राइट्स और अपडेट्स फ्रिक्वेंसी), अलग-अलग परफॉर्मेंस रिक्वायरमेंट्स आदि पढ़ते हैं, इसलिए उन्हें अलग तरह से लागू करने की जरूरत होती है और इसके लिए बिजनेस लॉजिक के कुछ दोहराव की जरूरत होती है।

यह आपके व्यवसाय पर निर्भर है कि डोमेन और रिपोर्टिंग सिस्टम के व्यापारिक तर्क को एक दूसरे के साथ अद्यतित रखने का तरीका तैयार करें।


1

रिपोर्ट / डैशबोर्ड को सक्रिय परियोजनाओं की सूची दिखाने के लिए आवश्यक है

प्रत्येक प्रोजेक्ट की स्थिति को डेटाबेस में स्थिर, प्रति-परिकलित और अच्छी तरह से स्वरूपित जानकारी के रूप में संग्रहीत किया जाना चाहिए और किसी भी सिमुलेशन को क्लाइंट पर WebApp के रूप में संभाला जाना चाहिए।

वर्तमान जल दर पर बजट थकावट की तारीख

मांग पर इस प्रकार का प्रक्षेपण नहीं होना चाहिए। अनुरोध पर इस जानकारी को प्रबंधित करना , जैसे संसाधनों, दर, कार्यों, मील के पत्थर, आदि पर गणना करना, भविष्य की कॉल के लिए इन परिणामों के फिर से उपयोग किए बिना गणना परत का व्यापक उपयोग करेगा।

एक वितरित वातावरण ( निजी या सार्वजनिक क्लाउड ) की कल्पना करते हुए , आपको गणना की परत में भारी लागत, डेटाबेस का कम उपयोग और कैश की कुल कमी मिलेगी।

क्या इसे पहले डोमेन के माध्यम से चलाया जाना चाहिए? प्रदर्शन के बारे में क्या?

आपके सॉफ़्टवेयर के डिज़ाइन में "डेटा इनपुट" के दौरान आवश्यक परिणाम प्राप्त करने के लिए आवश्यक गणनाओं का सामान्यीकरण करने की क्षमता शामिल होनी चाहिए, पढ़ने के दौरान नहीं। यह दृष्टिकोण कंप्यूटिंग संसाधनों के उपयोग को बहुत कम कर देता है, और सबसे ऊपर टेबल बनाता है जिसे ग्राहक द्वारा "केवल पढ़ने" के रूप में माना जा सकता है। कैशिंग तंत्र को ठोस और सरल बनाने के लिए यह पहला कदम है।

तो पहले एक खोज, सॉफ्टवेयर वास्तुकला को पूरा करने से पहले, यह वितरित कैश सिस्टम हो सकता है ।

(अनुरोध: एकत्रीकरण)! = 1: 1

मेरा विचार इसलिए (पहले और दूसरे उदाहरण दोनों के लिए) है, यह समझने की कोशिश करें कि डेटा को सामान्य करने के लिए कब उचित है, प्रति ग्राहक अनुरोधों के एकत्रीकरण को कम करने के उद्देश्य के रूप में। जो कि 1: 1 नहीं हो सकता है (अनुरोध: एकत्रीकरण) यदि एक लक्ष्य एक स्थायी प्रणाली प्राप्त करता है।

क्लाइंट पर गणना वितरित करें

एक और सवाल, सॉफ्टवेयर के डिजाइन को खत्म करने से पहले, यह हो सकता है कि कितना सामान्यीकरण है, हम क्लाइंट के ब्राउज़र को सौंपना चाहते हैं?

इसे एमवी * नाम दिया गया था , यह सच है कि यह आज फैशनेबल है, इसके अलावा, इसका एक उद्देश्य वेबएप (सिंगल पेज ऐप) बनाना है, जिसे कई जटिल अनुप्रयोगों के वर्तमान (और सौभाग्य से बिलों के लिए) माना जा सकता है हम क्लाउड प्रदाता को भुगतान करते हैं, ये क्लाइंट में निष्पादित होते हैं)।

मेरा निष्कर्ष इसीलिए है:

  1. डेटा की प्रस्तुति को पूरा करने के लिए वास्तव में कितने ऑपरेशन आवश्यक हैं यह समझना;

  2. विश्लेषण करें कि इनमें से कितने पृष्ठभूमि में हो सकते हैं (और फिर उनके सामान्य होने के बाद, कैश सिस्टम के माध्यम से वितरित किया जाता है);

  3. यह समझना कि क्लाइंट में कितने ऑपरेशन निष्पादित किए जा सकते हैं, परियोजनाओं का कॉन्फ़िगरेशन प्राप्त करना, इसे वेबएप पर व्यू पर चलाना और इस प्रकार बैक-एंड में की गई गणना को कम करना;


हाय मार्कोक्स, आपके उत्तर के लिए धन्यवाद। ग्राहक की ओर से पूर्व-एकत्रीकरण करने के साथ मुझे जो दो समस्याएं दिखती हैं, वह यह है कि 1. आपके पास बहुत सारे कार्य हैं जो एक परिणाम में हो सकते हैं और 2. एक बहुत कुछ हो सकते हैं जिनमें आवश्यक पूर्वाग्रह हों। दोनों को एक साथ रखें और आपको वास्तव में भारी संसाधन का उपयोग करना चाहिए। उदाहरण के लिए ... बजट को पुनर्गणित करना होगा जब ए। बजट में कोई भी बिल दर बदलता है (यह कई चीजों से शुरू हो सकता है ... एक उपयोगकर्ता कार्रवाई, या उदाहरण के लिए एक नई दर के लिए एक अनुसूचित रोलओवर। दरों में एक नए वित्तीय वर्ष की शुरुआत में बदलाव), या बी। बजट की संरचना ...
रिचड

... उदाहरण घंटों के लिए परिवर्तन जोड़ा या घटाया गया। आदि की सूची जारी होती है। जहां तक ​​# 2 एकत्रीकरण की आवश्यकता है ... कल ग्राहक को क्षेत्र द्वारा एकत्रीकरण देखने की जरूरत है, फिर वे कर्मचारी, या शहर, या उद्योग, या परियोजना या संबंधित इकाई पर किसी अन्य पागल विशेषता को देखना चाहते हैं। क्या आप इन सभी को प्री-एग्रीगेट करेंगे? यदि हां, तो अब आप एक OLAP इंजन बना रहे हैं ... इसके अलावा, क्या ये एकत्रीकरण प्रोजेक्ट ऑब्जेक्ट में डोमेन में संग्रहीत हैं? जब आप डेटा प्रस्तुत करते हैं, तो आप एक गणना मूल्य का उपयोग करेंगे या पहले से निर्धारित मूल्य बनाम। आदि। क्या आपने यह काम एक वास्तविक दुनिया ऐप में किया है?
रिचार्ड

मुझे इस दृष्टिकोण में दिलचस्पी है लेकिन यह मेरे दिमाग में बहुत सारी समस्याएं प्रस्तुत करता है।
रिचार्ड

मेरे पास एक आय वितरण प्रणाली है और चल रही है, मेरी समस्या कमाई की वर्तमान स्थिति को दिखाने के लिए थी, जो एजेंटों के उप-नेटवर्क (निकासी, जमा, जैकपॉट, ..) द्वारा उत्पन्न आंकड़ों के आधार पर थी। उप-नेटवर्क, वे अपने संतुलन का लगातार उपयोग करते हैं , इससे नेटवर्क पिता के मुनाफे में वृद्धि / कमी होती है। कमाई का वितरण हर सोमवार को समय-समय पर किया जाता है, समस्या वास्तविक समय में लाभ के विकास को दिखाने के लिए थी, और आभासी अद्यतन सभी नेटवर्क का बजट।
marcocs

पूरे नेटवर्क में एकत्रीकरण से बचने के लिए, और जब भी कोई अनुरोध किया जाता है, तब वास्तविक समय में सभी मूल्यों को वितरित करें, नेटवर्क की कमाई को सामान्य करने के लिए एक अस्थायी परिनियोजन प्रक्रिया को लगातार निष्पादित किया जाता है। जब भी आप अनुरोध करते हैं, तो गणना किए गए मानों को एकत्रित करके अभिव्यक्त किया जाता है। वे मान जो अस्थायी परिनियोजन में शामिल नहीं हैं (मैं केवल अंतिम-अद्यतन-आइटम के साथ काम करता हूं)। लेन-देन की तालिका (जो स्पष्ट रूप से वह है जो इस आवेदन में भार ग्रस्त है), तालिका विभाजन के साथ संभाला गया था ।
marcocs

1

क्वेरी के लिए कैश का उपयोग करें, कैशिंग के लिए डोमेन का उपयोग करें।

स्टैकओवरफ़्लो पर "शीर्ष उपयोगकर्ता" नामक एक सुविधा है। आपको शीर्ष उपयोगकर्ताओं के पेज के बॉटम पर एक पंक्ति मिल सकती है, "केवल गैर-सामुदायिक विकि प्रश्न और उत्तर इन योगों ( दैनिक अद्यतन ) में शामिल हैं"। यह इंगित करता है कि डेटा कैश किया गया है।

पर क्यों?

प्रदर्शन के मुद्दे के लिए हो सकता है। हो सकता है कि उन्हें डोमेन लॉजिक ("केवल गैर-समुदाय-विकि प्रश्न और उत्तर इन योगों में शामिल हैं") के साथ समान चिंता है।

कैसे?

मैं वास्तव में नहीं जानता कि उन्होंने यह कैसे किया, इसलिए यहाँ सिर्फ एक अनुमान है :)

सबसे पहले, हमें लक्ष्य प्रश्न / उत्तर खोजने की आवश्यकता है। एक शेड्यूलिंग कार्य काम कर सकता है, बस सभी संभावित लक्ष्य प्राप्त करें।

दूसरा, आइए केवल एक प्रश्न / उत्तर को देखें। क्या यह एक गैर-समुदाय-विकी है? क्या यह 30 दिनों के भीतर है? डोमेन मॉडल के साथ उत्तर देना काफी आसान है। मतों की गिनती करें और संतुष्ट होने पर उन्हें कैश करें।

अब हमारे पास कैश है, वे डोमेन व्युत्पन्न का उत्पादन कर रहे हैं। क्वेरी तेज़ और आसान है क्योंकि इसे लागू करने के लिए केवल सरल मानदंड हैं।

क्या होगा यदि परिणामों को अधिक "वास्तविक समय" होने की आवश्यकता है?

ईवेंट मदद कर सकते हैं। शेड्यूलिंग कार्य के साथ कैशिंग को ट्रिगर करने के बजाय, हम प्रक्रिया को कई उप-प्रक्रियाओं में विभाजित कर सकते हैं। उदाहरण के लिए, जब कोई हिप्पूम के उत्तर पर वोट देता है, तो हम हिप्पूम के शीर्ष उपयोगकर्ताओं के अपडेट को ट्रिगर करते हुए एक घटना प्रकाशित करते हैं। इस मामले में, हम अक्सर छोटे-छोटे त्वरित कार्य देख सकते हैं।

क्या CQRS नेक्सेसरी है?

न तो शेड्यूलिंग कार्य दृष्टिकोण के साथ और न ही घटनाओं के दृष्टिकोण के साथ। लेकिन cqrs का एक फायदा है। कैश आमतौर पर अत्यधिक प्रदर्शित उन्मुख होता है, अगर कुछ वस्तुओं की आवश्यकता पहले नहीं होती है, तो हम उनकी गणना नहीं कर सकते हैं और उन्हें बिल्कुल भी कैश नहीं कर सकते हैं। इवेंट सोर्सिंग के साथ CQRS घटनाओं को फिर से दोहराकर ऐतिहासिक डेटा के लिए पुनर्विचार कैश में मदद करता है।

कुछ संबंधित प्रश्न:
1. https://stackoverflow.com/questions/21152958/how-to-handle-summary-report-in-cqrs 2. https://stackoverflow.com/questions/19414951-how-to-use अमीर-डोमेन-साथ-भारी-संचालन / 19416703 # 19416703

आशा है ये मदद करेगा :)


0

अस्वीकरण:
मैं डोमेन मॉडल के साथ अनुप्रयोगों में काफी अनुभवहीन हूं।
मैं सभी अवधारणाओं को समझता हूं, और मैं पहले से ही लंबे समय से सोच रहा हूं कि इन अवधारणाओं को उन अनुप्रयोगों पर कैसे लागू किया जाए जो मैं काम कर रहा हूं (जो कि डोमेन-समृद्ध हैं, लेकिन ओओ, वास्तविक डोमेन मॉडल आदि की कमी है)
यह प्रश्न उन प्रमुख समस्याओं में से एक है जिसका मुझे सामना करना पड़ा। मेरे पास एक विचार है कि इसे कैसे हल किया जाए, लेकिन जैसा कि मैंने अभी कहा है ... यह सिर्फ एक विचार है जिसे मैं लेकर आया हूं।
मैंने इसे अभी तक एक वास्तविक परियोजना में लागू नहीं किया था, लेकिन मुझे एक कारण नहीं दिखता कि यह काम क्यों नहीं करना चाहिए।


अब जब मैंने यह स्पष्ट कर दिया है, कि मैं यहाँ आया हूँ - मैं समझाने के लिए आपके पहले उदाहरण (प्रोजेक्ट मैट्रिक्स) का उपयोग करूँगा :

जब कोई परियोजना संपादित करता है, तो आप इसे अपने डोमेन मॉडल के माध्यम से वैसे भी लोड और सहेज रहे हैं।
इस क्षण में, आपके पास इस परियोजना के लिए अपने सभी मैट्रिक्स (कुल बजट, तिथि आदि के लिए प्रयास आदि) की गणना करने के लिए भरी हुई जानकारी है ।

आप डोमेन मॉडल में इसकी गणना कर सकते हैं, और इसे बाकी डोमेन मॉडल के साथ डेटाबेस में सहेज सकते हैं।
तो Projectआपके डोमेन मॉडल के वर्ग में कुछ गुण होंगे जैसे TotalBudget, EffortToDateआदि, और डेटाबेस टेबल में उन नामों के साथ कॉलम भी होंगे जहाँ आपका डोमेन मॉडल संग्रहीत है (एक ही तालिका में, या एक अलग तालिका में ... doesn 'टी बात)

बेशक, आपको सभी मौजूदा परियोजनाओं के लिए मूल्य की गणना करने के लिए एक बार चलने की आवश्यकता है क्योंकि आप इसके साथ शुरू कर रहे हैं। लेकिन उसके बाद, डेटा स्वचालित रूप से वर्तमान परिकलित मूल्यों के साथ अद्यतन किया जाता है जब भी डोमेन मॉडल के माध्यम से किसी परियोजना को संपादित किया जाता है।

इसलिए जब भी आपको किसी भी प्रकार की रिपोर्ट की आवश्यकता होती है, सभी आवश्यक डेटा पहले से ही मौजूद हैं (पूर्व-गणना) और आप बस कुछ ऐसा कर सकते हैं:

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

इससे कोई फर्क नहीं पड़ता कि आप डेटा को उन टेबल से सीधे प्राप्त करते हैं जहाँ डोमेन मॉडल संग्रहीत है, या यदि आप किसी तरह डेटा को किसी दूसरे डेटाबेस में, किसी डेटा वेयरहाउस या जो भी करने के लिए निकालते हैं:

  1. यदि आपका रिपोर्टिंग स्टोर आपके वास्तविक डेटा स्टोर से अलग है, तो आप डेटा को "डोमेन मॉडल टेबल" से कॉपी कर सकते हैं
  2. यदि आप सीधे अपने वास्तविक डेटा स्टोर को क्वेरी करते हैं, तो डेटा पहले से ही है और आपको कुछ भी गणना करने की आवश्यकता नहीं है

या तो मामले में, गणना के लिए व्यावसायिक तर्क बिल्कुल एक स्थान पर है: डोमेन मॉडल।
आपको कहीं और इसकी आवश्यकता नहीं है, इसलिए इसे डुप्लिकेट करना आवश्यक नहीं है।


क्रिश्चियन, मुझे यह देखकर खुशी हुई कि मैं इससे जूझने वाला अकेला नहीं हूं। आपके उत्तर के लिए धन्यवाद। इस दृष्टिकोण के साथ मुझे जो समस्याएँ दिखती हैं, उनके लिए मार्कोस के उत्तर पर मेरी टिप्पणियाँ देखें। उन लोगों के साथ काम करने पर कोई विचार की सराहना की जाएगी!
रिचार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.