स्टार स्कीमा डेटा वेयरहाउस में गतिशील क्षेत्रों के लिए ईएवी के लिए वैकल्पिक


13

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

जैसे http://example.com/?action=test&foo=abc&bar=def...

मुझे सभी field => valueमैपिंग को संग्रहीत करने की आवश्यकता है , अर्थात (action => test), (foo => abc), (bar => def), और चूंकि क्षेत्र ऐसा गतिशील है, जिसका एकमात्र समाधान मैंने पाया है कि एंटिटी-एट्रिब्यूट-वैल्यू का उपयोग करना है, हालांकि, लोग कहते हैं कि यह एक बहुत खराब डिज़ाइन है।

तो, ऊपर मेरे उपयोग के मामले पर विचार करें, EAV के लिए एक उपयुक्त विकल्प क्या होगा?

KAV का उपयोग करके मेरा वर्तमान स्कीमा

  1. तालिका requests
    (id, timestamp, uri)
    उदाहरण के लिए(1, 149382220, '/')

  2. तालिका params
    (request_id, key, value)
    उदाहरण के लिए(1, 'action', 'test'), (1, 'foo', 'abc'), (1, 'bar', 'def')

कोई सुझाव?

अपडेट: हम गोदाम को AWS RedShift पर चलाते हैं


2
क्या आप एक देव डेटाबेस पर सुझाव दे रहे हैं की कोशिश कर के साथ गलत है? इसके अलावा, आप SQL सर्वर के बारे में बात कर रहे हैं? एसक्यूएल टैग सुंदर व्यापक है।
मैक्स वर्नोन

अपडेट किया गया मेरा सवाल
हावर्ड

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

1
आप RDBMS क्या उपयोग कर रहे हैं? SQLपर्याप्त विशिष्ट नहीं है। आपसे दो बार पूछा गया है। मैं तीसरा हूं।
इरविन ब्रान्डेसटेटर

2
चूंकि RedShift PostgreSQL पर आधारित है, मैं hstoreया jsonडेटाटाइप्स (या jsonbअगर / जब वे "उन्नयन" 9.4 पर) का उपयोग करने की कोशिश करेंगे ।
कॉलिन टी हार्ट

जवाबों:


11

मैं तीन समाधानों के बारे में सोच सकता हूं - ईएवी, एक्सएमएल और स्पार्स कॉलम। उत्तरार्द्ध विक्रेता-विशिष्ट है और आपके लिए उपयोगी नहीं हो सकता है।

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

ईएवी विचार

ईएवी / केवीएस, जैसा कि आपने ऊपर वर्णित किया है, सबसे सीधा कार्यान्वयन होने की संभावना है।

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

आप अपने ईएवी स्टोर का समर्थन भौतिक विचारों (कई विक्रेताओं का समर्थन करते हैं) के साथ उन कुंजियों या मूल्यों के लिए अनुक्रमण या इंडेक्स स्कैन की लागत को कम करने में सक्षम हो सकते हैं जिनके बारे में आप परवाह करते हैं।

एक्सएमएल

अधिकांश एंटरप्राइज़ डेटाबेस सिस्टम सत्यापन, अनुक्रमण और परिष्कृत क्वेरी सहित बहुत परिपक्व XML हैंडलिंग प्रदान करते हैं।

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

क्या यह कुशल है यह आपके RDBMS विक्रेता और आपके कार्यान्वयन पर बहुत कुछ निर्भर करेगा।

सबसे बड़ा नकारात्मक पक्ष यह है कि यह संभवतः डेटा के प्रबंधन का एकमात्र तरीका है जो मूल अनुरोध के स्ट्रिंग हेरफेर से अधिक जटिल है!

विरल कॉलम / पारंपरिक टेबल

यह संभव है कि आप अपने डेटा को पारंपरिक टेबल संरचना में लोड कर सकते हैं, जिसमें एक कुंजी प्रति कॉलम है।

SQL सर्वर का विरल कॉलम सुविधा ईएवी स्टोर का एक बढ़िया विकल्प है। स्पार्स कॉलम के साथ एक तालिका सामान्य तालिका के समान ही व्यवहार करती है, सिवाय इसके कि इसमें 30,000 तक कॉलम हो सकते हैं, और विरल स्तंभों में NULL मान तालिका में स्थान का उपभोग नहीं करते हैं।

फ़िल्टर किए गए अनुक्रमित (एक अन्य SQL सर्वर विशिष्ट सुविधा) के साथ उनका संयोजन ईएवी स्टोर के लिए एक अत्यंत कुशल विकल्प प्रदान कर सकता है यदि आप अक्सर विशिष्ट कॉलम और / या मूल्यों के एक जोड़े के लिए क्वेरी कर रहे हैं।

अन्य विक्रेताओं के साथ एक पारंपरिक तालिका का उपयोग करना व्यवहार्य हो सकता है - आईबीएम प्रति तालिका 700 से अधिक स्तंभों का समर्थन करता है और 1000 के बारे में ओरेकल, और अनुगामी नलियों के संपीड़न या ओरेकल के उपचार जैसी सुविधाओं का मतलब हो सकता है कि आप अपने एपीआई डेटा को काफी कुशलता से संग्रहीत कर सकते हैं।

इस दृष्टिकोण का स्पष्ट नकारात्मक पहलू यह है कि जैसे ही आपने अपने एपीआई में नई कुंजी जोड़ी, आपको अपने स्कीमा को तदनुसार समायोजित करना होगा।


2
PostgreSQL में मैं एक्सएमएल लेकिन या तो सिफारिश नहीं होगा hstoreया json। आने वाले 9.4 में jsonbमेरी सिफारिश होगी।
कॉलिन टी हार्ट

मैं वास्तव में पेशेवरों के विपक्ष और प्रत्येक के स्पष्टीकरण के साथ इस जवाब को पसंद करता हूं। बहुत जानकारीपूर्ण - मैं निश्चित रूप से विरल कॉलम जानकारी की सराहना करता हूं। मैं विरल स्तंभ दृष्टिकोण का उपयोग करके ईएवी का एक उदाहरण चाहूंगा।
StixO

9

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

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

उदाहरण के लिए, अंत में मेरे पास रेफरल डेटा के लिए एक टेबल था, एक टारगेट रिक्वेस्ट डेटा के लिए, और एक यूजर-रिलेटेड आइटम्स के लिए, जैसे कि सर्च की गई क्वेरी।

मैंने एक ही तालिका में पूरे क्वेरी स्ट्रिंग को एक बूँद के रूप में संग्रहीत करने की क्षमता पाई, जबकि भविष्य में उस बूँद को अलग करने की क्षमता प्रदान करते हुए, मेरी ज़रूरतों को बहुत अच्छी तरह से पूरा किया।


1
प्रश्न और उत्तर दोनों में इस शब्द BLOBका उपयोग किया जाता है जिसका अर्थ है बाइनरी लॉन्ग ओबजेक्ट। मैं PostgreSQL में CLOB(कैरेक्टर लॉन्ग ओबजेक्ट) या कुछ और का उपयोग करना पसंद करूंगा text, क्योंकि हम चरित्र के बारे में बात कर रहे हैं न कि बाइनरी डेटा।
कॉलिन 'टी हार्ट हार्ट

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