JSONB इंडेक्सिंग बनाम hstore के साथ


28

मैं इस स्तर पर संभव के रूप में कुछ मान्यताओं (वेब ​​ऐप वास्तव में कैसे विकसित होता है) के साथ डेटाबेस डिजाइन पर निर्णय लेने की कोशिश कर रहा हूं।

पहले चरण के रूप में, यह समझते हुए कि JOINS महंगे हैं, मैं बड़ी संख्या में सामान्यीकृत छोटी तालिकाओं के विपरीत एक छोटी संख्या में अखंड तालिकाओं पर विचार कर रहा हूं। एक दूसरे बिंदु के रूप में, मैं hstore बनाम नियमित टेबल बनाम JSONB (GiST इंडेक्सिंग के साथ) का उपयोग करने के बीच उलझन में हूं।

AFAIK (कृपया सही करने के लिए स्वतंत्र महसूस करें):

  1. आमतौर पर, Postgres में, hstore को अन्य डेटा प्रकारों से बेहतर प्रदर्शन करने के लिए जाना जाता है। FOSDEM PGDAY की इस प्रस्तुति में कुछ दिलचस्प आँकड़े (स्लाइड के दूसरे भाग में) हैं। https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf

  2. Hstore के साथ एक लाभ तेजी से अनुक्रमण (GiN या GiST) है। हालांकि, JSONB के साथ, GiN और GiST इंडेक्सिंग को JSON डेटा पर भी लागू किया जा सकता है।

  3. 2nd Quadrant के एक पेशेवर का यह ब्लॉग कहता है, "इस बिंदु पर यह संभव है कि सभी नए अनुप्रयोगों में jsonb के साथ hstore के उपयोग की जगह" (अंत तक स्क्रॉल करें): http://blog.2ndquadrant.com/postgresql-ant-patterns-unn जरूरी -jsonhstore-डायनामिक-कॉलम /

इसलिए मैं निम्नलिखित पर निर्णय लेना चाहता हूं:

  1. डेटा के मुख्य (संरचित) भाग के लिए: क्या यह संबंधपरक तालिकाओं के एक जोड़े में जाना चाहिए (कई स्तंभों के साथ अपेक्षाकृत बड़ा), या यह hstore का उपयोग करके कई महत्वपूर्ण-मूल्य वाले स्टोर होना चाहिए?
  2. तदर्थ (उपयोगकर्ता योगदान / असंरचित) डेटा के लिए, यह JSON या तदर्थ में तदर्थ प्रमुख मूल्य भंडार होना चाहिए (मुख्य संबंधपरक तालिकाओं में से एक में संग्रहीत कुंजी के साथ)?

7
जुड़ना महंगा नहीं है। यह तुमसे किसने कहा? जैसा कि मूल रूप से संबंधपरक डेटाबेस की पूरी अवधारणा जुड़ने (व्यावहारिक दृष्टिकोण से) के चारों ओर घूमती है, ये उत्पाद जुड़ने में बहुत अच्छे हैं। सोचने का सामान्य तरीका ठीक से सामान्यीकृत संरचनाओं के साथ शुरू हो रहा है और फैंसी डिनोमिनेशन और इसी तरह के सामान में जा रहा है जब प्रदर्शन को वास्तव में पढ़ने की आवश्यकता होती है। JSON(B)और hstore(और EAV) अज्ञात संरचना वाले डेटा के लिए अच्छे हैं।
dezso

6
@Yogesch के उन लिंक्स में कुछ दिलचस्प और बेतहाशा विरोधाभासी चीजें हैं :) एक नैतिक के रूप में, ऐसा लगता है कि MySQL जॉन्स में खराब है (और) है, और NoSQL लोग बिना किसी वास्तविक तथ्यात्मक आधार के इस धारणा का सामान्यीकरण करते हैं। दूसरी ओर, आरोन और मैक्स उस पी-शब्द के प्रति संवेदनशील हैं - इसके व्यापक उपयोग से पता चलता है कि गैर-देशी बोलने वाले (स्वयं शामिल) खुशी से गलत शब्द का उपयोग करते हैं।
dezso

4
@Yogesch वास्तविक रूप से मुझे यकीन है कि इंटरनेट पर कुछ भी साबित करने के लिए एक स्रोत है, जैसे किसी भी धार्मिक पाठ का उपयोग अत्याचारों को सही ठहराने के लिए किया जा सकता है (जैसा कि इतिहास में नाटकीय रूप से दिखाया गया है)। यह सच है कि आप जितना कम खर्च करते हैं, उतना कम काम होता है , लेकिन हमेशा कुछ व्यापार बंद रहता है
एरिक

4
@Yogesch: रीड-हेवी ऑपरेशंस के लिए जॉइन से बचना महत्वपूर्ण है, जहां आपको पहले से डेटा एक्सेस पैटर्न का पता होता है, और इसलिए आप सुरक्षित रूप से सभी डेटा को एक पंक्ति में रख सकते हैं। हालांकि, यह अन्य जॉइन को संभावित रूप से अधिक महंगा बनाता है । कौन कहता है कि आपको विभिन्न सवालों के जवाब देने के लिए कई अलग-अलग तरीकों से डेटा में शामिल होने की आवश्यकता नहीं होगी? अब हम केवल रिलेशनल डेटा मॉडलिंग के सिद्धांत में उतरने जा रहे हैं ...
क्रिस

5
@Yogesch मेरे व्यवहार में, डेटाबेस के साथ टोंटी शायद ही कभी रैम या सीपीयू है, लेकिन यह I / O है - इस तरह अनावश्यक डेटा संग्रहीत करने से बचना अभी भी एक महत्वपूर्ण बात है। जैसा कि क्रिस कहते हैं, यदि आप हमेशा अपने डेटा को केवल एक ही तरीके से देखते हैं, तो इसकी कीमत हो सकती है। यदि नहीं, तो आप एक भारी और डेटा के अत्यधिक अपरिहार्य चंक के साथ हैं।
dezso

जवाबों:


41

संबंधपरक डेटाबेस को जोड़ के आसपास डिज़ाइन किया गया है, और उन्हें अच्छी तरह से करने के लिए अनुकूलित किया गया है।

जब तक आपके पास सामान्यीकृत डिज़ाइन का उपयोग करने का एक अच्छा कारण है , सामान्यीकृत डिज़ाइन का उपयोग करें।

jsonbऔर hstoreजब आप एक सामान्यीकृत डेटा मॉडल का उपयोग नहीं कर सकते हैं जैसे चीजें अच्छी होती हैं , जैसे कि डेटा मॉडल तेजी से बदलता है और उपयोगकर्ता परिभाषित होता है।

यदि आप इसे मज़बूती से मॉडल कर सकते हैं, तो इसे मज़बूती से मॉडल करें। यदि आप json पर विचार नहीं कर सकते हैं, यदि आप json / jsonb / hstore के बीच चयन कर रहे हैं, तो सामान्यतया jsonb चुनें जब तक कि आपके पास कोई कारण न हो।

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

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

उपयोगकर्ता द्वारा योगदान किए जाने वाले डेटा के लिए जो फ्रीफ़ॉर्म और असंरचित है, jsonb का उपयोग करें। इसे हस्टोर के साथ-साथ प्रदर्शन करना चाहिए, लेकिन यह अधिक लचीला है और इसके साथ काम करना आसान है।

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


बहुत धन्यवाद क्रेग, अब मुझे बहुत बेहतर समझ है और पता है कि क्या करना है। एक अनुवर्ती प्रश्न: अगर मैं की तरह कुछ भंडारण कर रहा हूँ पसंद या अनुयायियों एक दो कॉलम प्रारूप में (post_id और user_id, के लिए पसंद ), यह दो कॉलम, या एक hstore साथ एक संबंधपरक तालिका का उपयोग करने के लिए बेहतर है? (मैं इसे एक नए प्रश्न में शामिल करने से बुरा नहीं
मानता

5
@Yogesch यह एक दलदल मानक मीटर की तरह लगता है: n एक सुसंगत और स्थिर प्रारूप के साथ तालिका में शामिल हों। सवाल हमेशा होना चाहिए "क्या एक अच्छा कारण है कि मुझे इस विशेष मामले के लिए सामान्य संबंधपरक तरीका नहीं करना चाहिए ?"।
क्रेग रिंगर

hstoreपदावनत किया गया है। का उपयोग करें jsonb
खतरे

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