यह उद्धरण XML को सामान्य रूप से भंडारण प्रारूप के रूप में उपयोग करने के बारे में नहीं है (जिसके लिए यह ठीक है, आवश्यकताओं के आधार पर), लेकिन डेटाबेस- टाइप स्टोरेज के लिए।
जब लोग डेटाबेस के बारे में बात करते हैं, तो उनका मतलब आमतौर पर स्टोरेज सिस्टम होता है जो भारी मात्रा में डेटा स्टोर करता है, अक्सर गीगाबाइट या टेराबाइट रेंज में। एक डेटाबेस संभावित रूप से स्टोर करने वाले सर्वर पर उपलब्ध रैम की मात्रा से बहुत बड़ा होता है। चूंकि किसी को कभी भी एक डेटाबेस में सभी डेटा की आवश्यकता नहीं होती है, इसलिए डेटाबेस को अपने डेटा के चयनात्मक सबसेट के तेजी से पुनर्प्राप्ति के लिए अनुकूलित किया जाना चाहिए: यह वह है जो SELECT
कथन के लिए है, और रिलेशनल डेटाबेस और साथ ही NoSQL समाधान तेजी से के लिए अपने आंतरिक भंडारण प्रारूप का अनुकूलन करते हैं। इस तरह के सबसेट की पुनर्प्राप्ति।
हालाँकि, XML वास्तव में इन आवश्यकताओं के अनुरूप नहीं है। इसकी नेस्टेड टैग संरचना के कारण, यह निर्धारित करना असंभव है कि फ़ाइल में एक निश्चित मान कहाँ संग्रहीत किया जाता है (एक बाइट के रूप में एक फ़ाइल में ऑफसेट) पूरे दस्तावेज़ के पेड़ पर चलने के बिना, कम से कम मैच तक। एक संबंधपरक डेटाबेस में अनुक्रमित होते हैं, और एक सूचकांक में एक मूल्य को देखते हुए, यहां तक कि एक आदिम द्विआधारी-खोज कार्यान्वयन के साथ, एक ओ (लॉग एन) लुकअप है, और फिर वास्तविक मूल्यों तक पहुंचना फ़ाइल-तलाश के अलावा कुछ नहीं है (जैसे fseek(data_file_handle, row_index * row_size)
), जो ओ (1) है। XML फ़ाइल में, आपके दस्तावेज़ पर SAX पार्सर को चलाने का सबसे प्रभावी तरीका है, अपने वास्तविक डेटा पर पहुंचने से पहले एक बहुत कुछ पढ़ना और ढूंढना; जब तक आप अनुक्रमित का उपयोग नहीं करते हैं, तब तक आप इसे ओ (एन) से बेहतर कर सकते हैं, लेकिन फिर, आपको हर प्रविष्टि के लिए पूरे सूचकांक का पुनर्निर्माण करना होगा (नीचे देखें)।
सम्मिलित करना और भी बुरा है। संबंधपरक डेटाबेस पंक्ति क्रम की गारंटी नहीं देते हैं, जिसका अर्थ है कि वे बस नई पंक्तियों को जोड़ सकते हैं, या 'हटाए गए' के रूप में चिह्नित किसी भी पंक्तियों को अधिलेखित कर सकते हैं। यह बहुत तेज़ है: DB बस के आसपास रहने योग्य स्थानों का एक पूल रख सकता है; पूल से एक प्रविष्टि प्राप्त करना O (1) है जब तक कि पूल खाली न हो; सबसे खराब स्थिति, पूल खाली है और एक नया पेज बनाना है, लेकिन यह भी O (1) है। इसके विपरीत, एक्सएमएल-आधारित डेटाबेस को कमरे बनाने के लिए सम्मिलन बिंदु के बाद सब कुछ स्थानांतरित करना होगा; यह O (n) है। जब इंडेक्स खेल में आते हैं, तो चीजें और भी दिलचस्प हो जाती हैं: विशिष्ट रिलेशनल-डेटाबेस इंडेक्स को अपेक्षाकृत कम जटिलता के साथ अपडेट किया जा सकता है, ओ कह सकते हैं (लॉग एन); लेकिन अगर आप अपनी XML फ़ाइलों को अनुक्रमित करना चाहते हैं, तो हर प्रविष्टि दस्तावेज़ में हर मूल्य के ऑन-डिस्क स्थान को संभावित रूप से बदल देती है, इसलिए आपको यह करना होगापूरे सूचकांक का पुनर्निर्माण करें । यह अपडेट के लिए भी जाता है, क्योंकि किसी तत्व की टेक्स्ट सामग्री को अपडेट करना, कहना, इसका आकार बदल सकता है, जिसका अर्थ है कि लगातार XML को शिफ्ट करना है। यदि आप एक गैर-अनुक्रमित कॉलम को अपडेट करते हैं, तो एक रिलेशनल डेटाबेस को इंडेक्स को स्पर्श नहीं करना पड़ता है; एक XML डेटाबेस को अद्यतन किए गए XML नोड के आकार को बदलने वाले प्रत्येक अद्यतन के लिए पूरे सूचकांक का पुनर्निर्माण करना होगा।
वे सबसे महत्वपूर्ण डाउनसाइड हैं, लेकिन और भी हैं। XML बहुत वर्बोज़ है, जो सर्वर-से-सर्वर संचार के लिए अच्छा है, क्योंकि यह सुरक्षा जोड़ता है (प्राप्त करने वाला सर्वर XML पर सभी प्रकार की अखंडता जांच कर सकता है, और यदि स्थानांतरण में कुछ भी गलत हुआ है, तो दस्तावेज़ को सत्यापित करने की संभावना नहीं है )। बड़े पैमाने पर भंडारण के लिए, हालांकि, यह हत्या है: एक्सएमएल डेटा के लिए 100% या अधिक ओवरहेड होना असामान्य नहीं है (यह SOAP संदेशों जैसी चीजों के लिए 1000% रेंज में ओवरहेड अनुपात को देखने के लिए असामान्य नहीं है), जबकि विशिष्ट रिले डीबी भंडारण योजनाओं में केवल तालिका मेटाडेटा के लिए एक निरंतर ओवरहेड है, और प्रति पंक्ति एक छोटा सा; रिलेशनल डेटाबेस में अधिकांश ओवरहेड निश्चित कॉलम चौड़ाई से आता है। यदि आपके पास डेटा का टेराबाइट है, तो कई कारणों से 500% ओवरहेड बस अस्वीकार्य है।