बेतहाशा अलग-अलग कुंजी के साथ कुंजी-मूल्य जोड़े के कुशल भंडारण सेट


9

मुझे एक एप्लिकेशन विरासत में मिला है जो एक साइट के साथ कई अलग-अलग प्रकार की गतिविधियों को जोड़ता है। लगभग 100 अलग-अलग गतिविधि प्रकार हैं, और प्रत्येक में 3-10 क्षेत्रों का अलग-अलग सेट है। हालाँकि, सभी गतिविधियों में कम से कम एक दिनांक फ़ील्ड होती है (किसी भी तिथि, प्रारंभ तिथि, अंतिम तिथि, निर्धारित तिथि आदि), और एक जिम्मेदार व्यक्ति फ़ील्ड का संयोजन हो सकता है। अन्य सभी क्षेत्र व्यापक रूप से भिन्न होते हैं और प्रारंभ दिनांक फ़ील्ड को "प्रारंभ दिनांक" नहीं कहा जाएगा।

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

यहां छवि विवरण दर्ज करें

प्रत्येक गतिविधि में कई गतिविधि क्षेत्र होते हैं; प्रत्येक साइट में एक से अधिक गतिविधियाँ होती हैं, और SiteActivityData तालिका प्रत्येक SiteActivity के लिए KVPs संग्रहीत करती है।

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

  • अखंडता खराब है; SiteActivityData में एक फ़ील्ड डालना संभव है जो गतिविधि प्रकार से संबंधित नहीं है, और DataValue एक varchar फ़ील्ड है, इसलिए संख्याओं और तिथियों को लगातार डालना आवश्यक है।
  • इस डेटा की रिपोर्टिंग और तदर्थ क्वेरी मुश्किल, त्रुटि प्रवण और धीमी है। उदाहरण के लिए, किसी निश्चित प्रकार की सभी गतिविधियों की एक सूची प्राप्त करना जिसमें एक निर्दिष्ट सीमा के भीतर समाप्ति तिथि होती है, उन्हें तिथि तक पिवोट्स और कास्टिंग वर्चर्स की आवश्यकता होती है। रिपोर्ट के लेखक इस स्कीमा से घृणा करते हैं, और मैं उन्हें दोष नहीं देता।

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

यहां छवि विवरण दर्ज करें

गतिविधि तालिका में गतिविधि गतिविधि तालिका की आवश्यकता को समाप्त करते हुए प्रत्येक गतिविधि के लिए XSD होगा। SiteActivity में मुख्य-मूल्य XML होगा, ताकि साइट के लिए प्रत्येक गतिविधि अब एक पंक्ति में हो।

एक गतिविधि कुछ इस तरह दिखती है (लेकिन मैंने इसे पूरी तरह से समाप्त नहीं किया है):

<SomeActivityType>
  <SomeDateField type="StartDate">2000-01-01</SomeDateField>
  <AnotherDateField type="EndDate">2011-01-01</AnotherDateField>
  <EmployeeId type="ResponsiblePerson">1234</EmployeeId>
  <SomeTextField>blah blah</SomeTextField>
  ...

लाभ:

  • एक्सएसडी एक्सएमएल को मान्य करेगा, डेटाबेस स्तर पर एक संख्या क्षेत्र में एक स्ट्रिंग डालने जैसी त्रुटियों को पकड़ना, ऐसा कुछ जो पुराने स्कीमा के साथ असंभव था जो कि सब कुछ वर्चर में संग्रहीत करता है।
  • KVP का रिकॉर्ड जो वेब प्रपत्रों को बनाने के लिए उपयोग किया जाता है, आसानी से उपयोग करके पुन: पेश किया जा सकता है select ... from ActivityXML.nodes('/SomeActivityType/*') as T(r)
  • XML का एक xpath उपकुंजी एक परिणाम सेट का उत्पादन करने के लिए इस्तेमाल किया जा सकता है जिसमें प्रारंभ तिथि, समाप्ति तिथि आदि के लिए एक धुरी का उपयोग किए बिना कॉलम हैं, कुछ इस तरह select ActivityXML.value('.[@type=StartDate]', 'datetime') as StartDate, ActivityXML.value('.[@type=EndDate]', 'datetime') as EndDate from SiteActivity where...

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

अतिरिक्त प्रश्न: यदि मैं XSD का उपयोग करके किसी तिथि डेटा प्रकार के रूप में टैग को परिभाषित करता हूं xs:date, तो क्या SQL सर्वर इसे दिनांक मान के रूप में अनुक्रमित करने वाला है? मुझे चिंता है कि अगर मैं तारीख से क्वेरी करता हूं, तो तारीख के तार को डेट वैल्यू में डालना होगा और इंडेक्स का उपयोग करने के किसी भी अवसर को उड़ाने की आवश्यकता होगी।


रिपोर्ट के लिए डेटा कितना अद्यतित होना चाहिए? क्या रिपोर्ट में उत्पादन प्रभावित होगा?
जेम्स एंडरसन

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

खेतों में कितना ओवरलैप है? क्या दस क्षेत्र सभी 100 उपप्रकारों को कवर करते हैं, या क्या ~ 500 पूर्ण भिन्न क्षेत्र हैं?
जॉन ऑफ ऑल ट्रेड्स

72 क्षेत्र और 75 गतिविधि प्रकार हैं। 30 फ़ील्ड केवल एक गतिविधि द्वारा उपयोग किए जाते हैं, और बाकी का उपयोग 5-10 गतिविधियों द्वारा किया जाता है। वहाँ कुछ खेतों कि ~ 30 विभिन्न गतिविधियों द्वारा उपयोग किया जाता है। अधिकांश भाग के लिए, गतिविधियों में संपूर्ण समानता नहीं है।
पॉल एबॉट

जवाबों:


7

इसलिए मैं जो खोज रहा हूं वह बड़ी संख्या में गतिविधियों को संग्रहीत करने का एक तरीका है, जिसमें लगभग कोई भी क्षेत्र सामान्य रूप से नहीं है जो रिपोर्टिंग को आसान बनाता है।

पहले टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, इसलिए यहां हम जाते हैं!

यदि प्राथमिक उद्देश्य रिपोर्टिंग कर रहा है और आपके पास एक DW है (भले ही वह स्टार स्कीमा नहीं है) तो मैं इसे एक स्टार स्कीमा में लाने का प्रयास करूंगा। लाभ तेज, सरल प्रश्न हैं। नकारात्मक पक्ष ETL है, लेकिन आप पहले से ही डेटा को एक नए डिज़ाइन में स्थानांतरित करने पर विचार कर रहे हैं और XML स्कीपर समाधान (और SSIS आपके SQL सर्वर लाइसेंसिंग में शामिल है) की तुलना में बनाने और बनाए रखने के लिए स्टार स्कीमा के लिए ETL संभावित सरल है। साथ ही यह एक मान्यता प्राप्त रिपोर्टिंग / एनालिटिक्स डिजाइन की प्रक्रिया शुरू करता है।

तो कैसे करना है ... ऐसा लगता है कि आपके पास एक तथ्यहीन तथ्य के रूप में जाना जाता है । यह उन विशेषताओं का एक प्रतिच्छेदन है जो बिना किसी संबद्ध उपाय (जैसे बिक्री मूल्य) के साथ एक घटना को परिभाषित करता है। आपके पास कुछ या सभी गतिविधियों के लिए तारीखें उपलब्ध हैं? वास्तव में आपके पास वास्तव में एक गतिविधि, साइट और दिनांक (s) का एक चौराहा होना चाहिए।

DimActivity- मैं अनुमान लगा रहा हूं कि एक पैटर्न है, कुछ ऐसा जो आपको कम से कम अपेक्षाकृत साझा किए गए कॉलम में इन को तोड़ने की अनुमति दे सकता है। यदि हां, तो आपके पास तीन हो सकते हैं? पांच? गतिविधियों की कक्षाओं के लिए आयाम। कम से कम आपके पास एक जोड़े के अनुरूप कॉलम हैं, जैसे कि गतिविधि का नाम, आप पर फ़िल्टर कर सकते हैं, और आप शेष यादृच्छिक विवरणों के लिए सामान्य शीर्षक जैसे "एट्रीब्यूट 1" आदि छोड़ सकते हैं।

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

DimSite- सीधे आगे लगता है, इसलिए हम यहां सरोगेट कुंजी का वर्णन करेंगे। अनिवार्य रूप से यह सिर्फ एक वृद्धि, अद्वितीय आईडी है। पूर्णांक पहचान कॉलम आम है। यह DW और स्रोत प्रणालियों को अलग करने की अनुमति देता है और डेटा वेयरहाउस में इष्टतम जुड़ाव सुनिश्चित करता है। आपकी प्राकृतिक कुंजी या व्यावसायिक कुंजी आमतौर पर रखी जाती है, लेकिन रखरखाव / डिज़ाइन के लिए विश्लेषण और जुड़ाव नहीं। उदाहरण स्कीमा:

CREATE TABLE [DIM].[Site]
(
 SiteSK INT NOT NULL IDENTITY PRIMARY KEY
,SiteNK INT NOT NULL --source system key
,SiteName VARCHAR(500) NOT NULL
)

DimDate- दिनांक विशेषताएँ। पहचान के बजाय "स्मार्ट कुंजी" बनाएं। इसका मतलब है कि आप एक सार्थक पूर्णांक टाइप कर सकते हैं जो प्रश्नों के लिए एक तारीख से संबंधित है जैसे कि WHERE DateSK = 20150708। DimDate को लोड करने के लिए बहुत सारी मुफ्त स्क्रिप्ट हैं और अधिकांश में यह स्मार्ट कुंजी शामिल है। ( एक विकल्प )

DimEmployee - आपके XML में यह शामिल है, अगर यह डिंपर्सन के लिए अधिक सामान्य परिवर्तन है, और प्रासंगिक व्यक्ति विशेषताओं के साथ भरें क्योंकि वे उपलब्ध हैं और रिपोर्टिंग के लिए प्रासंगिक हैं।

और आपका तथ्य यह है:

FactActivitySite
DimSiteSK - FK to DimSite
DimActivitySK - FK to DimActivity
DimEmployee - FK to DimEmployee
DimDateSK - FK to DimDate

आप तथ्य में इनका नाम बदल सकते हैं, और आपके पास प्रति घटना की कई तारीखें हो सकती हैं। तथ्य आमतौर पर बहुत बड़े होते हैं इसलिए अपडेट से बचना आम तौर पर अच्छा होता है ... यदि आपके पास किसी एकल ईवेंट के लिए कई दिनांक अपडेट हैं, तो आप इस तथ्य में SK जोड़कर एक डिलीट / इंसर्ट डिज़ाइन को आज़माना चाह सकते हैं जो "अपडेट" पंक्तियों के चयन की अनुमति देता है हटा दिया जाएगा फिर नवीनतम डेटा सम्मिलित करना।

अपनी फैक्ट तिथियों का विस्तार करें जो आपको चाहिए StartDateSK, EndDateSK, ScheduledStartDateSK:।

सभी आयामों में एक अज्ञात पंक्ति आमतौर पर हार्डकोड -1 SK के साथ होनी चाहिए। जब आप इस तथ्य को लोड करते हैं, और एक गतिविधि में शामिल तिथियों में से कोई भी नहीं होता है, तो इसे केवल एक लोड करना चाहिए।

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

यहां छवि विवरण दर्ज करें

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


(wesdev से सवाल): @ क्या ईआरडी टूल का इस्तेमाल किया?
ypercube y

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