टाइम्स: SQL या NoSQL?


33

मैं SQL और NoSQL (या उनके पारंपरिक अंतर) के बीच सामान्य अंतर के बारे में परवाह नहीं करता।

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

मुझे कम्युनिटी इनपुट में दिलचस्पी है: आप SQL डेटाबेस में डेटा को कैसे स्टोर करेंगे? NoSQL पर SQL का उपयोग करने के लिए क्या योग्यताएं हैं, विशेष रूप से समय श्रृंखला के लिए? क्या मैं इसे SQL में संग्रहीत करने पर विचार कर रहा हूँ?

हमारे डेटा सेट में लाखों समय की श्रृंखला होती है, जिनमें से लगभग 10% में प्रत्येक के लाखों रिकॉर्ड होते हैं। समय श्रृंखला का आयोजन पदानुक्रम से किया जाता है: / बाजार / उपकरण / मूल्य / आवृत्ति, जहां:

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

डेटा को SQL db में कैसे संग्रहीत किया जाएगा? एक बड़ी तालिका (शायद किसी चीज से विभाजित), एक तालिका प्रति बाजार या उपकरण, एक तालिका प्रति समय श्रृंखला।

पहले ही, आपका बहुत धन्यवाद।


1
क्या हर समय श्रृंखला में एक ही मेटाडेटा (यानी कॉलम) होते हैं?
जैक डगलस

1
डेटा वेयरहाउस की तरह लगता है ... एसओ पर देखें: stackoverflow.com/q/2684462/27535
gbn

@ जैक-डगलस: क्या आप एक कॉलम-ओरिएंटेड डेटा स्टोर का सुझाव देने के लिए कह रहे हैं?
निकोलस

3
@ निकोलस मेरी उम्मीद नहीं है कि एक पारंपरिक एसक्यूएल आरडीबीएमएस आपके डेटा के लिए अच्छी तरह से अनुकूल होगा क्योंकि ए) क्वेरी करना आसान होगा, बी) वॉल्यूम अव्यवहारिक रूप से बड़े (पंक्तियों के अरबों?) ग) ध्वनि विभाजन को स्वाभाविक नहीं लगता है? / या मानक OLAP सुविधाएँ। मैं मेटाडेटा के बारे में पूछ रहा था कि आपको कितने तालिकाओं की आवश्यकता है। यदि हर बार श्रृंखला में अद्वितीय मेटाडेटा है, तो आपको लाखों तालिकाओं की आवश्यकता होती है, जो नियमित RDBMS पर एक अच्छे विचार की तरह ध्वनि नहीं करता है, लेकिन मुझे नहीं लगता कि आपको इसकी आवश्यकता है, क्या आप?
जैक डगलस

2
@ निकोलस आपने SQL सर्वर के लिए नए Hadoop कनेक्टर में देखा है । सतह पर, आपका परिदृश्य फिट दिखता है।
मार्क स्टोरी-स्मिथ

जवाबों:


26

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

अगर मुझे उस डेटा को संग्रहीत करने के लिए एक डेटाबेस स्थापित करने के लिए कहा गया था, तो मैं निम्नलिखित कार्य करूंगा:

प्रस्तावित स्कीमा

(1) कोर डेटा को कई (1000) व्यक्तिगत तालिकाओं में रखा गया है, जिनमें से प्रत्येक में दो कॉलम हैं:

  1. समय: या तो SQL DATETIME डेटा प्रकार या कुछ युग से एक संख्यात्मक प्रकार (यह प्राथमिक कुंजी है)
  2. मूल्य: आपके डेटा के लिए उपयुक्त टाइप किया गया। मैं एकल परिशुद्धता फ्लोट के लिए डिफ़ॉल्ट होगा, हालांकि वित्तीय लेनदेन के लिए एक निश्चित-बिंदु डेटा प्रकार अधिक उपयुक्त हो सकता है। यह शायद अनइंडेक्सिड है।

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

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

(2) मेटा डेटा को अलग-अलग तालिकाओं में संग्रहीत किया जाता है, जैसा कि आवेदन द्वारा आवश्यक है :

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

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

फिर एप्लिकेशन लेयर में मैं मेटाडेटा तालिकाओं को यह निर्धारित करने के लिए क्वेरी करूँगा कि मेरा डेटा कहाँ स्थित था, और फिर अपने डेटा को प्राप्त करने के लिए बड़े डेटा तालिकाओं पर अपेक्षाकृत सरल प्रश्न करें।

लाभ:

  • मेरा (अपेक्षाकृत सीमित) अनुभव यह है कि डेटाबेस आमतौर पर बड़ी संख्या में बड़ी तालिकाओं की तुलना में बड़ी संख्या में छोटे तालिकाओं को आसानी से संभाल सकते हैं। यह दृष्टिकोण आसान रखरखाव (जैसे पुराने डेटा को शुद्ध करना, एक भ्रष्ट तालिका का पुनर्निर्माण, बैकअप से पुन: लोड करना, एक नई इकाई जोड़ना) सक्षम करता है। यह पूरी तरह से विभिन्न प्रकार के डेटा को डिकॉउंट करता है, यदि (उदाहरण के लिए) आपके पास विभिन्न दरों पर डेटा है, या विभिन्न डेटा प्रकारों की आवश्यकता है।

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

नुकसान:

  • आपके डिस्क स्थान का लगभग आधा भाग स्टैम्पिंग के समय के लिए समर्पित है, जब टेबल के कॉलम में बिल्कुल स्पष्ट रूप से 100 या 1000 के तालिकाओं का एक ही डेटा होगा। (वास्तव में यह एक आवश्यकता है अगर आप आसान टेबल जॉइन करना चाहते हैं)।

  • तालिका नामों को संग्रहीत करने और गतिशील लुकअप करने के लिए बहुत अधिक एप्लिकेशन जटिलता और स्ट्रिंग संचालन की आवश्यकता होती है, जो मुझे क्रैंग बनाता है। लेकिन यह अभी भी विकल्प (नीचे चर्चा की गई) से बेहतर लगता है।

बातें:

  • अपने समय क्षेत्र में गोलाई से सावधान रहें। आप अपने मूल्यों को जोड़कर (यदि उपयुक्त हो) सक्षम करने के लिए पर्याप्त चाहते हैं, लेकिन सटीक रूप से पर्याप्त होना चाहिए।

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

बदलाव:

कुछ भिन्नताएँ जिन पर मैंने विचार किया है वे हैं:

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

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

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

इस प्रारूप पर अतिरिक्त चर्चा के लिए, MySQL में बहुत अधिक कॉलम देखें:

पूरी तरह से सामान्यीकृत तालिका: कई 2-स्तंभ तालिकाओं का उपयोग करने के बजाय, आप एक, तीन-स्तंभ तालिका का उपयोग कर सकते हैं, जहां कॉलम समय, डेटा और मान हैं। अब आपके मेटाडेटा तालिकाओं को केवल टैब मान या स्तंभ नाम के बजाय आईडी मान देखने की आवश्यकता है, जो एप्लिकेशन परत के बजाय SQL प्रश्नों में अधिक तर्क को धक्का देने में सक्षम बनाता है।

लगभग 2/3 संग्रहण अब सामान्यीकृत कॉलम के साथ खपत किया जाता है, इसलिए यह बहुत सारे डिस्क स्थान का उपयोग करेगा।

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

हालाँकि, इन विविधताओं पर विचार करने के बाद भी, मेरे अगले विकास के लिए मेरी योजना बहुत सी तालिकाओं, दो-स्तंभों की है। कि, या विधि जल्द ही किसी से भी समझदार द्वारा पोस्ट किया जाना चाहिए :)।


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

जबकि डीबीए सलाहकार एक बीफ़ SQL सर्वर इंस्टॉलेशन को लक्षित करने पर काम करते हैं, मैं बिगडाटा सेटअप के साथ परीक्षण के साथ आगे बढ़ूंगा।
निकोलस

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

1

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


2
आप मानगो में टाइम सीरीज़ को कैसे स्टोर करेंगे? प्रत्येक दस्तावेज़ एक समय सेरी है? या एक विशिष्ट टाइमस्टैम्प का मूल्य?
रॉकसाइंस

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