PostgreSQL द्वारा शुरू की गई JSONB की व्याख्या


346

PostgreSQL ने अभी JSONB की शुरुआत की है और यह पहले से ही हैकर न्यूज़ पर ट्रेंड कर रहा है । यह बहुत अच्छा होगा अगर कोई यह समझा सके कि यह पोस्टस्टोर में पहले से मौजूद Hstore और JSON से अलग कैसे है। इसके फायदे और सीमाएं क्या हैं और किसी को इसका उपयोग कब करना चाहिए?


4
PGCon2014 से: youtube.com/…
msanford

5
@CraigRinger यूआरएल पर्याप्त सटीक नहीं है, अब, 1 साल बाद यह JSONB से संबंधित सामग्री के लिए पर्याप्त रूप से इंगित नहीं करता है।
बर्कस

2
@berkus मुझे लगा कि मैं विशिष्ट पद से जुड़ा हूं। कितनी निराशा होती है।
क्रेग रिंगर

1
यह विशिष्ट वीडियो को इंगित करता है।
टैलोनक्स

जवाबों:


458

सबसे पहले, hstoreएक कंट्राब मॉड्यूल है, जो केवल आपको कुंजी => मूल्य युग्मों को संग्रहीत करने की अनुमति देता है, जहां कुंजी और मान केवल texts हो सकते हैं (हालांकि मान sql NULLs भी हो सकते हैं)।

दोनों jsonऔर jsonbआपको एक वैध JSON मान (इसकी युक्ति में परिभाषित ) संग्रहीत करने की अनुमति देता है ।

F.ex. इन मान्य JSON अभ्यावेदन हैं: null, true, [1,false,"string",{"foo":"bar"}], {"foo":"bar","baz":[null]}- hstoreबस थोड़ी सबसेट क्या JSON करने में सक्षम है की तुलना में (लेकिन आप केवल इस उपसमूह, यह ठीक की जरूरत है)।

केवल के बीच का अंतर jsonऔर jsonbउनके भंडारण है:

  • json अपने सादे पाठ प्रारूप में संग्रहीत है, जबकि
  • jsonb कुछ बाइनरी प्रतिनिधित्व में संग्रहीत किया जाता है

इसके 3 प्रमुख परिणाम हैं:

  • jsonbआमतौर पर स्टोर करने के लिए अधिक डिस्क स्थान लेता है json(कभी-कभी नहीं)
  • jsonb की तुलना में इसके इनपुट प्रतिनिधित्व से निर्माण करने में अधिक समय लगता है json
  • jsonऑपरेशनों में काफी अधिक समय लगता है jsonb(और jsonटाइपिंग में हर बार जब आप कुछ ऑपरेशन करते हैं, तो हर बार किए जाने की आवश्यकता होती है )

जब आप jsonbएक स्थिर रिलीज के साथ उपलब्ध होंगे, तो दो प्रमुख उपयोग के मामले होंगे, जब आप आसानी से उनके बीच चयन कर सकते हैं:

  1. यदि आप अपने आवेदन में केवल JSON प्रतिनिधित्व के साथ काम करते हैं, तो PostgreSQL का उपयोग केवल इस प्रतिनिधित्व को संग्रहीत और पुनर्प्राप्त करने के लिए किया जाता है, आपको इसका उपयोग करना चाहिए json
  2. यदि आप PostgreSQL में JSON मान पर बहुत अधिक संचालन करते हैं, या कुछ JSON फ़ील्ड पर अनुक्रमण का उपयोग करते हैं, तो आपको उपयोग करना चाहिए jsonb

1
नमस्ते, चूंकि इसका द्विआधारी प्रतिनिधित्व है, इसलिए jsonbयह समर्थन क्यों नहीं करता है? UPDATE test SET data->'a' = 123 WHERE id = 1;सेCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
कोकिज़ू

1
कोकिज़ु, यह 9.5 में संभव है। wiki.postgresql.org/wiki/…
चेलोवेकॉट

1
बस जोड़ने के लिए, आपके द्वारा उपयोग jsonकिए jsonbजा सकने वाले कारणों में से एक यह है कि यदि विरासत कारणों से आपके कोड का उपभोग jsonकरने वाला jsonक्षेत्र के आदेश पर निर्भर है और उन्हें फिर से चालू नहीं किया जा सकता है।
djdrzzy

4
के रूप में, विरासत के कारणों के लिए: JSON में, कोई शब्दार्थिक अंतर नहीं है, अगर किसी ऑब्जेक्ट (तालिका, मानचित्र, हैश, जो इसे होस्ट भाषा में कॉल करता है) की-वैल्यू जोड़े अलग-अलग क्रम में हैं। यदि आप उस पर भरोसा करते हैं, तो आप वास्तव में JSON से अलग कुछ का उपयोग कर रहे हैं। - के लिए textबनामjson : उत्तरार्द्ध, JSON मान्यता के साथ आता है तो अमान्य JSON पर, यह केवल डालने पर विफल हो जाएगा, हर बार के बजाय अपने आवेदन इसे पढ़ता है (क्योंकि यह गलत प्रतिनिधित्व हो जाता है)। इसके अलावा, आप सुरक्षित रूप से बाद को jsonbडेटाबेस में डाल सकते हैं ।
pozs

2
JSONB ( pgeoghegan.blogspot.com/2014/03/what-i-think-of-jsonb.html ) के लिए कार्यान्वयन विवरणों को समझाने के लिए यह एक बेहतरीन पोस्ट है
manugupt1

132

पीयूष:

संक्षिप्त उत्तर है:

  • यदि आप अंदर JSON हेरफेर कर रहे हैं PostgreSQL के , जैसे कि छंटाई, टुकड़ा करना, splicing, आदि, तो आपको गति कारणों के लिए JSONB का उपयोग करना चाहिए।
  • यदि आपको JSON पर मनमानी कुंजी खोजों के लिए अनुक्रमित लुकअप की आवश्यकता है, तो आपको JSONB का उपयोग करना चाहिए।
  • यदि आप उपरोक्त दोनों में से कुछ भी नहीं कर रहे हैं, तो आपको संभवतः JSON का उपयोग करना चाहिए।
  • यदि आपको कुंजी क्रम, व्हॉट्सएप और डुप्लिकेट कुंजियों को संरक्षित करने की आवश्यकता है, तो आपको JSON का उपयोग करना चाहिए।

लंबे समय तक उत्तर के लिए, आपको 9.4 रिलीज के करीब पूर्ण "हॉव्टो" राइटअप करने के लिए इंतजार करना होगा।


74

Json और jsonb के बीच अंतर की एक सरल व्याख्या ( मूल छवि PostgresProfessional द्वारा ):

SELECT '{"c":0,   "a":2,"a":1}'::json, '{"c":0,   "a":2,"a":1}'::jsonb;

          json          |        jsonb 
------------------------+--------------------- 
 {"c":0,   "a":2,"a":1} | {"a": 1, "c": 0} 
(1 row)
  • json: पाठ भंडारण «जैसा है»
  • jsonb: कोई व्हाट्सएप नहीं
  • jsonb: कोई डुप्लिकेट कुंजी नहीं, अंतिम कुंजी जीत
  • jsonb: चाबियाँ सॉर्ट की जाती हैं

Jsonb डेवलपर्स द्वारा भाषण वीडियो और स्लाइड शो प्रस्तुति में अधिक । इसके अलावा उन्होंने JsQuery पेश किया , pg.extension शक्तिशाली jsonb क्वेरी भाषा प्रदान करता है


1
धन्यवाद, मैंने इसे पाठ में बदल दिया है
चेलोकेकॉट

56
  • hstore "वाइड कॉलम" संग्रहण प्रकार से अधिक है, यह कुंजी-मूल्य वाले जोड़े का एक सपाट (गैर-नेस्टेड) ​​शब्दकोश है, हमेशा एक यथोचित कुशल बाइनरी प्रारूप (एक हैश तालिका, इसलिए नाम) में संग्रहीत किया जाता है।
  • jsonJSON दस्तावेज़ों को पाठ के रूप में संग्रहीत करता है, जब दस्तावेज़ संग्रहीत किए जाते हैं, तो सत्यापन करना और ज़रूरत पड़ने पर आउटपुट पर उन्हें पार्स करना (अर्थात व्यक्तिगत फ़ील्ड एक्सेस करना); यह पूरे JSON कल्पना का समर्थन करना चाहिए। चूंकि संपूर्ण JSON टेक्स्ट संग्रहीत है, इसलिए इसका स्वरूपण संरक्षित है।
  • jsonbप्रदर्शन कारणों के लिए शॉर्टकट लेता है: JSON डेटा इनपुट पर पार्स किया जाता है और द्विआधारी प्रारूप में संग्रहीत किया जाता है, शब्दकोशों में कुंजी क्रम बनाए नहीं रखा जाता है, और न ही डुप्लिकेट कुंजी। JSONB फ़ील्ड में अलग-अलग तत्वों तक पहुँच तेज़ है क्योंकि इसमें JSON टेक्स्ट को हर समय पार्स करने की आवश्यकता नहीं है। आउटपुट पर, JSON डेटा का पुनर्निर्माण किया जाता है और प्रारंभिक स्वरूपण खो जाता है।

IMO, उपलब्ध होने के बाद उपयोग करने का कोई महत्वपूर्ण कारण नहींjsonb है, यदि आप मशीन-पठनीय डेटा के साथ काम कर रहे हैं।


24

JSONB JSON का "बेहतर" संस्करण है।

आइए एक उदाहरण देखें:

SELECT '{"c":0,   "a":2,"a":1}'::json, '{"c":0,   "a":2,"a":1}'::jsonb;
          json          |        jsonb 
------------------------+--------------------- 
 {"c":0,   "a":2,"a":1} | {"a": 1, "c": 0} 
(1 row)
  1. JSON सफेद स्थान को संग्रहीत करता है, यही कारण है कि हम रिक्त स्थान देख सकते हैं जब कुंजी "a" संग्रहीत होती है, जबकि JSONB नहीं करता है।
  2. JSON कुंजी के सभी मूल्यों को संग्रहीत करता है। यही कारण है कि आप कुंजी "a" के विरुद्ध कई मान (2 और 1) देख सकते हैं, जबकि JSONB केवल अंतिम मान "स्टोर" करता है।
  3. JSON उस क्रम को बनाए रखता है जिसमें तत्व डाले जाते हैं, जबकि JSONB "क्रमबद्ध" क्रम बनाए रखता है।
  4. JSON में "रॉ डेटा" के विपरीत JSONB ऑब्जेक्ट को विघटित बाइनरी के रूप में संग्रहीत किया जाता है, जहां पुनर्प्राप्ति के दौरान डेटा की कोई पुनरावृत्ति की आवश्यकता नहीं होती है।
  5. JSONB इंडेक्सिंग का भी समर्थन करता है, जो एक महत्वपूर्ण लाभ हो सकता है।

सामान्य तौर पर, किसी को JSONB को प्राथमिकता देनी चाहिए, जब तक कि विशेष आवश्यकताएं न हों, जैसे कि वस्तु कुंजी के आदेश के बारे में विरासत धारणाएं।


13

मैं आज पगोपेन पर था कि बेंचमार्क मोंगोडब की तुलना में तेज़ हैं, मेरा मानना ​​है कि यह चयन के लिए लगभग 500% तेज था। बहुत ज्यादा सब कुछ कम से कम 200% से अधिक तेज था जब मोंगोडब के साथ विपरीत, एक अपवाद अभी एक अद्यतन है जो पूरी तरह से पूरे कॉलम को फिर से लिखना करने की आवश्यकता होती है कुछ मोंगोड बेहतर तरीके से संभालता है।

जिनसन पर जिन इंडेक्सिंग अद्भुत है।

इसके अलावा पोस्टग्रोन आंतरिक रूप से जोंसब के प्रकारों को बनाए रखेंगे और मूल रूप से इस तरह के संख्यात्मक, पाठ, बूलियन आदि के साथ मेल खाते हैं।

जॉन्सब का उपयोग करके जॉइन भी संभव होगा

संग्रहीत कार्यविधियों के लिए PLv8 जोड़ें और यह मूल रूप से नोड डेवलपर्स के लिए एक सपना सच होगा।

बाइनरी जोंसब के रूप में संग्रहीत होने के नाते, यह सभी व्हाट्सएप को भी छीन लेगा, गुणों के क्रम को बदल देगा और संपत्ति के अंतिम संकट का उपयोग करके डुप्लिकेट गुणों को हटा देगा।

इंडेक्स के अलावा जब एक jsonb कॉलम के विपरीत एक jsonb कॉलम पोस्टग्रेज के विपरीत क्वेरी करना वास्तव में टेक्स्ट को हर पंक्ति पर json में कनवर्ट करने के लिए कार्यक्षमता को चलाने के लिए नहीं है, जो संभवतः अकेले समय की एक बड़ी राशि को बचाएगा।


8

बीच के अंतर jsonऔर jsonbडेटाटिप्स के बारे में , यह आधिकारिक स्पष्टीकरण का उल्लेख करने लायक है:

PostgreSQL JSON डेटा संग्रहीत करने के लिए दो प्रकार प्रदान करता है: jsonऔर jsonb। इन डेटा प्रकारों के लिए कुशल क्वेरी तंत्र को लागू करने के लिए, PostgreSQL भी धारा 8.14.6 में वर्णित jsonpath डेटा प्रकार प्रदान करता है

jsonऔर jsonbडेटा प्रकार इनपुट के रूप में मूल्यों के लगभग समान सेट स्वीकार करते हैं। प्रमुख व्यावहारिक अंतर दक्षता में से एक है। jsonडेटा प्रकार भंडार इनपुट पाठ, जो प्रसंस्करण कार्यों प्रत्येक निष्पादन पर Reparse चाहिए की एक सटीक प्रतिलिपि; हालांकि jsonbडेटा एक विघटित द्विआधारी प्रारूप में संग्रहीत होता है जो अतिरिक्त रूपांतरण ओवरहेड के कारण इनपुट के लिए थोड़ा धीमा बनाता है, लेकिन प्रक्रिया करने के लिए काफी तेज है, क्योंकि किसी भी रिपार्सिंग की आवश्यकता नहीं है।jsonbइंडेक्सिंग का भी समर्थन करता है, जो एक महत्वपूर्ण लाभ हो सकता है।

क्योंकि jsonटाइप इनपुट पाठ की एक सटीक प्रतिलिपि संग्रहीत करता है, यह टोकन के बीच शब्दार्थ-निरर्थक सफेद स्थान, साथ ही साथ JSON ऑब्जेक्ट्स के भीतर कुंजियों के क्रम को संरक्षित करेगा। इसके अलावा, यदि मान के भीतर JSON ऑब्जेक्ट में एक से अधिक बार एक ही कुंजी होती है, तो सभी कुंजी / मान जोड़े रखे जाते हैं। (प्रोसेसिंग फ़ंक्शंस अंतिम मान को ऑपरेटिव के रूप में मानते हैं।) इसके विपरीत;jsonb सफेद स्थान को संरक्षित नहीं करता है, ऑब्जेक्ट कुंजियों के क्रम को संरक्षित नहीं करता है, और डुप्लिकेट ऑब्जेक्ट कुंजियों को नहीं रखता है। यदि डुप्लिकेट कुंजियों को इनपुट में निर्दिष्ट किया जाता है, तो केवल अंतिम मान रखा जाता है।

सामान्य तौर पर, अधिकांश अनुप्रयोगों को JSON डेटा को स्टोर करना पसंद करना चाहिए jsonb , जब तक कि कोई विशेष आवश्यकता न हो, जैसे कि ऑब्जेक्ट कुंजी के आदेश के बारे में विरासत की धारणाएं।

PostgreSQL प्रति डेटाबेस में केवल एक वर्ण सेट एन्कोडिंग की अनुमति देता है। इसलिए JSON प्रकारों के लिए JSON विनिर्देशन के अनुरूप होना संभव नहीं है, जब तक कि डेटाबेस एन्कोडिंग UTF8 न हो। डेटाबेस एन्कोडिंग में प्रतिनिधित्व नहीं किया जा सकता है कि पात्रों को सीधे शामिल करने का प्रयास विफल हो जाएगा; इसके विपरीत, ऐसे अक्षर जिन्हें डेटाबेस एन्कोडिंग में दर्शाया जा सकता है, लेकिन UTF8 में नहीं।

स्रोत: https://www.postgresql.org/docs/current/datatype-json.html


7

एक और महत्वपूर्ण अंतर, जिसका उल्लेख ऊपर किसी भी उत्तर में नहीं किया गया है, वह यह है कि jsonप्रकार के लिए कोई समानता ऑपरेटर नहीं है , लेकिन इसके लिए एक है jsonb

इसका मतलब यह है कि आप DISTINCTइस jsonतालिका से -type और / या अन्य फ़ील्ड्स का चयन करते समय कीवर्ड का उपयोग नहीं कर सकते हैं (आप DISTINCT ONइसके बजाय उपयोग कर सकते हैं , लेकिन इस तरह के मामलों के कारण यह हमेशा संभव नहीं है )।


6

जहाँ तक मैं बता सकता हूं,

  • hstore जैसा कि यह वर्तमान में मौजूद है (Postgresql 9.3 में) अन्य वस्तुओं और सरणियों के घोंसले के लिए इसकी कुंजी / मान जोड़े के मूल्यों के रूप में अनुमति नहीं देता है। हालांकि भविष्य में आने वाली पैच पैच घोंसले के शिकार के लिए अनुमति देगा। यह पैच 9.4 रिलीज़ में नहीं होगा और जल्द ही इसमें शामिल नहीं किया जा सकता है।

  • json के रूप में यह वर्तमान में मौजूद है नेस्टिंग के लिए अनुमति देता है, लेकिन पाठ-आधारित है, और अनुक्रमण के लिए अनुमति नहीं देता है, इस प्रकार यह "आप" है

  • jsonb जिसे 9.4 के साथ जारी किया जाएगा, इसमें json की वर्तमान नेस्टिंग क्षमताएँ होंगी, साथ ही hstore का GIN / GIST अनुक्रमण होगा, इसलिए यह तेज़ होगा

Postgresql 9.4 पर काम करने वाले लोग यह कहते हुए प्रतीत होते हैं कि नया, तेज़ jsonb प्रकार उन लोगों से अपील करेगा, जिन्होंने MongoDB जैसे noSQL डेटा स्टोर का उपयोग करने के लिए चुना होगा, लेकिन अब एक छत के नीचे क्वेरी-सक्षम अवरोधक डेटा के साथ एक संबंधपरक डेटाबेस को जोड़ सकते हैं।

http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html

MonggrDB की तुलना में तेजी से या कुछ मामलों में बराबर के साथ postgresql 9.4 jsonb के बेंचमार्क लगते हैं

http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.