मुझे एक एप्लिकेशन विरासत में मिला है जो एक साइट के साथ कई अलग-अलग प्रकार की गतिविधियों को जोड़ता है। लगभग 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 सर्वर इसे दिनांक मान के रूप में अनुक्रमित करने वाला है? मुझे चिंता है कि अगर मैं तारीख से क्वेरी करता हूं, तो तारीख के तार को डेट वैल्यू में डालना होगा और इंडेक्स का उपयोग करने के किसी भी अवसर को उड़ाने की आवश्यकता होगी।