क्या विभिन्न तालिकाओं से डेटा को एक में एकत्रित करना खराब अभ्यास है?


12

पृष्ठभूमि

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

समस्या

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

मेरा "समाधान"

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

तालिका पतली और लंबी होगी, केवल आवश्यक डेटा संग्रहीत करते हुए, कुछ इस तरह से:

CREATE TABLE dbo.HCM_Event_Log (
    id INT IDENTITY,
    type_id INT NULL,
    orig_id VARCHAR(36) NULL,
    patient_id UNIQUEIDENTIFIER NOT NULL,
    visit_id UNIQUEIDENTIFIER NULL,
    lookup_id VARCHAR(50) NULL,
    status VARCHAR(15) NULL,
    ordered_datetime DATETIME NULL,
    completed_datetime DATETIME NULL,
    CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id)
)

तब मैं type_id और आइटम समूह जैसी चीज़ों के लिए विभिन्न संबंधपरक तालिकाएँ रखूँगा।

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

मेरा प्रश्न

एक बुरा या एक अच्छा विचार है? मुझे एहसास है कि हर स्थिति SQL सर्वर (2008 r2 मानक संस्करण BTW), और "कभी-कभी" नियम में भिन्न होती है, लेकिन मैं वास्तव में सामान्य सलाह की तलाश में हूं।

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


1
क्या आप नियोजित आउटेज को लागू कर सकते हैं? यदि उन अद्यतनों में से एक भी ट्रिगर को मिटा नहीं सकता है और आप अपने एग्रीगेट्स को संभवतः खराब डेटा के लिए अपडेट नहीं करेंगे।
एरिक

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

1
क्या आपने कुछ अनुक्रमित विचार बनाने पर ध्यान दिया है? ये आपके कोड और वेंडर के बीच एक तार्किक परत डालते हैं, इसलिए यदि विक्रेता नीचे की चीज़ों को बदलता है तो आप केवल दृश्य को अपडेट कर सकते हैं। इसके अलावा, अनुक्रमित विचार आपके लिए पूर्व निर्धारित होंगे और अच्छा पठन प्रदर्शन प्रदान करेंगे। ऐसा करने में एक बड़ा विचार यह है कि यह विक्रेता के डेटाबेस तालिकाओं के लेखन कार्यों पर कितना भार डालता है। हालाँकि, यह संभवतया ट्रिगर्स का उपयोग करने की तुलना में समाधान को बनाए रखने के लिए एक क्लीनर और आसान होगा,
मीका निकेल

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

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

जवाबों:


8

अगर मैं तुम्हें सही ढंग से समझा,

  • आपके पास एक बड़ी तृतीय-पक्ष प्रणाली है,
  • आपका इस पर अधिक नियंत्रण नहीं है,
  • आप इस तृतीय-पक्ष डेटाबेस से सीधे डेटा पढ़ने वाली जटिल रिपोर्ट बनाते हैं,
  • आपके प्रश्न तृतीय-पक्ष डेटाबेस की आंतरिक संरचना पर निर्भर करते हैं।

मैं इसे इस तरह से लिखूंगा:

  • अपना अलग डेटाबेस सेट करें, जिस पर मेरा पूरा नियंत्रण है।
  • तृतीय-पक्ष डेटाबेस से प्रासंगिक तालिकाओं और स्तंभों से डेटा पढ़ने और मेरा में सम्मिलित / अपडेट करने के लिए एक सिंक प्रक्रिया सेट करें।
  • मेरे डेटाबेस की स्थिर संरचना के आधार पर मेरी जटिल रिपोर्ट विकसित करें।

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

सिंक प्रक्रिया प्रभावी रूप से रूपांतरण प्रक्रिया है - आप तीसरे पक्ष के डेटाबेस से डेटा को उस संरचना में परिवर्तित करते हैं जिसकी आपको आवश्यकता है। इस रूपांतरण प्रक्रिया का एक हिस्सा सामान्यीकरण की समस्याओं को ठीक कर सकता है जो मूल तृतीय-पक्ष डेटाबेस में हो सकती हैं। सिस्टम के केवल इस हिस्से को तीसरे पक्ष के सिस्टम की आंतरिक संरचना को जानना और निर्भर करना है। आपकी मुख्य रिपोर्ट और मुख्य प्रश्न केवल आपके डेटाबेस पर निर्भर करेंगे।

तो, मुख्य बिंदु है - अपने सिस्टम के उस हिस्से को अलग करना और सीमित करना जो तृतीय-पक्ष प्रणाली के आंतरिक पर निर्भर करता है।

अपडेट करें

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

आप पहले से ही मूल तालिका में परिवर्तनों को कैप्चर करने के लिए ट्रिगर लिखना चाहते हैं और इन परिवर्तनों को एक सामान्य तालिका में लिख सकते हैं। इसलिए, अपने इच्छित परिवर्तनों को कैप्चर करें, लेकिन उन्हें सामान्य रूप से सामान्यीकृत तालिकाओं पर लिखें, एक भी नहीं।

तो, यह चरम मामला है - आपके आंतरिक डेटा संरचना में तृतीय-पक्ष डेटा संरचना का रूपांतरण ट्रिगर में किया जाता है जो INSERT/UPDATE/DELETEतृतीय-पक्ष तालिकाओं पर आग लगाता है। यह मुश्किल हो सकता है। ट्रिगर्स का कोड दोनों प्रणालियों की आंतरिक संरचना पर निर्भर करेगा। यदि रूपांतरण गैर-तुच्छ है, तो यह INSERT/UPDATE/DELETEउनकी विफलता के मूल में देरी कर सकता है । यदि आपके ट्रिगर में बग है तो यह मूल लेनदेन को उनकी विफलता के बिंदु तक प्रभावित कर सकता है। यदि तृतीय-पक्ष प्रणाली में परिवर्तन होता है, तो यह आपके ट्रिगर को तोड़ सकता है, जिससे तृतीय-पक्ष प्रणाली का लेनदेन विफल हो जाएगा।

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

दूसरी नज़र में यह प्रश्न में आपके मूल सुझाव जैसा लगता है। लेकिन, अंतर यह है: कैप्चर-सभी टेबल डेटा को केवल अस्थायी रूप से पकड़ते हैं; डेटा की मात्रा छोटी है - बस जो बदल गया है; यह एक एकल तालिका होने की जरूरत नहीं है; अंततः डेटा को ठीक से सामान्यीकृत स्थायी तालिकाओं में संग्रहीत किया जाएगा, जिस पर आपका पूर्ण नियंत्रण है, जो तृतीय-पक्ष प्रणाली से स्वतंत्र है और जिसे आप अपने प्रश्नों के लिए ट्यून कर सकते हैं।


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

यह ट्रिगर या सीडीसी हो, एकमात्र तरीका जिसे आप वास्तव में वास्तविक समय के करीब पाएंगे वह स्ट्रीमिंग या कतारबद्ध है। कतार आधारित विलंबता और लागत प्रभावशीलता के लिए एक अच्छा समझौता है। आपका समय तेजी से कतार को संसाधित करने के तरीकों पर खर्च किया जाएगा। काम के अधिकांश को आवेदन से अतुल्यकालिक छोड़कर, और उपयोगकर्ता लेनदेन पर कम भार डाल रहा है। अतीत में मैंने एक सेवा के साथ ऑलस्क्रिप्ट्स सनराइज ईएमआर के खिलाफ यह बहुत काम किया है जो कुछ समानांतर फ़ॉरचैट सी # कॉल के साथ कतार को संसाधित करता है। गोदाम में संसाधित और उपलब्ध होने वाले नए डेटा के लिए विशिष्ट विलंबता उप 30 सेकंड थी
ब्रैड डी

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

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

3

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

जैसा कि दूसरों ने उल्लेख किया है, ट्रिगर्स का उपयोग न करें, बैचों में सिंक करें।

बहुत सारे जॉइन के बारे में चिंता न करें, जब डेटा को सामान्य किया जाता है और ठीक से अनुक्रमित किया जाता है, तो इससे कोई महत्वपूर्ण लागत या प्रबंधन बोझ नहीं जुड़ता है।

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


3

मैंने 24x7 निर्माण कंपनी में अतीत में इस तरह की समान स्थिति के साथ काम किया और अंत में लेनदेन प्रतिकृति का उपयोग करने का निर्णय लिया। डीडीएल को इस तरह से दोहराया जाना संभव है कि आप सब्सक्राइबर के लिए पैच को बदल सकें। जाहिर है कि सब कुछ के लिए पेशेवरों और विपक्ष हैं और आपको यह निर्धारित करने के लिए उन्हें तौलना होगा कि आप कंपनी के लिए सबसे अच्छा काम क्या करते हैं।

सकारात्मक पक्ष पर:

  1. "रीयल-टाइम" केवल नेटवर्क तक सीमित है और सब्सक्राइबर पर ट्रांजैक्शन कमिटमेंट परफॉर्म करता है। मध्यम रूप से उच्च टीपीएस प्रणाली के साथ मेरे अनुभव में, हमें "वास्तविक समय" डेटा के 10 सेकंड से कम के भीतर दोहराया गया था।
  2. कार्यभार का पृथक्करण। आप वर्तमान में एक सर्वर पर मिश्रित कार्यभार चला रहे हैं। यदि आप इन दो चिंताओं को अलग कर सकते हैं, तो आप समीकरण के एक वर्कलोड को निकालने की दोनों प्रणालियों पर प्रदर्शन लाभ प्राप्त करने में सक्षम हो सकते हैं।
  3. नियंत्रण। आप अपने रिपोर्टिंग कार्यभार के अनुरूप अनुक्रमण / आँकड़े / रखरखाव संशोधन कर सकेंगे।

हालांकि, विपक्ष हैं:

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

2

मेरी योजना इन सभी रिकॉर्डों को एक "कैच-ऑल" तालिका में लिखने की थी, और इस समग्र तालिका में रिकॉर्ड बनाए रखने के लिए मूल तालिकाओं पर ट्रिगर लिखें।

ट्रिगर में बहुत सारी समस्याएं हैं जिनसे आपको बचना चाहिए:

  • ट्रिगर में त्रुटि के कारण मूल लेनदेन निरस्त हो सकता है
  • बहु-पंक्ति संचालन को सही ढंग से संभालने वाले ट्रिगर को लिखना मुश्किल है
  • ट्रिगर किए गए पंक्तियों को संशोधित करके ग्राहक अनुप्रयोगों को भ्रमित कर सकते हैं (उदाहरण के लिए, एक ट्रिगर प्रभावित पंक्तियों की संख्या को ओवरराइड करता है)
  • जब एक ट्रिगर दूसरे को ट्रिगर करता है, तो परिणाम का अनुमान लगाना कठिन होता है

एक बेहतर विकल्प एक ऐसा काम है जो समय-समय पर डेटा को एक नई तालिका में कॉपी करता है। आपकी रिपोर्ट कॉपी चला सकती है। एक नौकरी जो पंक्तियों को कॉपी करती है उसे लिखना और बनाए रखना आसान होता है, और इसमें कोई जोखिम नहीं है कि यह तीसरे पक्ष के आवेदन के संचालन को प्रभावित करेगा।


1. ट्रिगर्स सरल होगा, इसलिए सभी में मौजूद होने पर फेंकी गई त्रुटियां न्यूनतम होंगी। 2. ट्रिगर खुद ही कई पंक्तियों को हैंडल नहीं कर रहा होगा (IE ट्रिगर के साथ तालिका में अपडेट की गई एक पंक्ति के कारण कई पंक्तियों को कहीं और अपडेट नहीं किया जाएगा), लेकिन स्रोत में एक बार में कई पंक्तियों को सम्मिलित / अद्यतन / हटाया जा सकता है टेबल - क्या आपका यही मतलब है? 3. इस के साथ संभाला नहीं जा सका NOCOUNT? 4. डेस्टिनेशन टेबल पर कोई ट्रिगर नहीं होगा, और मैं दूसरों के लिए भी यह सुनिश्चित कर सकता हूं।
jreed121

जैसा कि आप कहते हैं, ट्रिगर काम करना सैद्धांतिक रूप से संभव है। यह सिर्फ इतना है कि व्यवहार में वे कभी नहीं करते हैं।
एंडोमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.