PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL 10 में ICU समर्थन के साथ अधिक मजबूत संयोजन

इस लेख में, मैं पोस्टग्रेएसक्यूएल में आईसीयू समर्थन पेश करना चाहता हूं, जिस पर मैंने पोस्टग्रेएसक्यूएल संस्करण 10 के लिए काम किया है, जो इस साल के अंत में प्रदर्शित होगा।

क्रमबद्ध करना

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

छँटाई के दो महत्वपूर्ण पहलू हैं। एक छँटाई एल्गोरिथ्म है। यह कंप्यूटर विज्ञान में एक मानक विषय है, और विभिन्न सॉर्टिंग एल्गोरिदम और विधियों को परिष्कृत करने के लिए वर्षों से PostgreSQL में बहुत काम किया गया है, लेकिन यह वह नहीं है जिसके बारे में मैं लिखूंगा। दूसरा यह तय कर रहा है कि चीजें किस क्रम में होनी चाहिए, जिसे हम संयोजन कहते हैं। कई मामलों में, वह विकल्प स्पष्ट है। 1 2 से पहले आता है। FALSE TRUE से पहले आता है ... ठीक है, किसी ने मनमाने ढंग से फैसला किया है। ए आमतौर पर बी से पहले आता है। लेकिन जब प्राकृतिक भाषा के पाठ की बात आती है, तो चीजें दिलचस्प हो जाती हैं। टेक्स्ट को ऑर्डर करने के कई अलग-अलग तरीके हैं, और टेक्स्ट स्ट्रिंग्स को समेटने के वास्तविक तरीके स्पष्ट होने की तुलना में अधिक जटिल हैं। अलग-अलग भाषाएं अलग-अलग सॉर्ट ऑर्डर पसंद करती हैं, लेकिन एक भाषा के भीतर भी, विभिन्न अनुप्रयोगों के लिए भिन्नताएं हो सकती हैं। और इसके बारे में चिंता करने के लिए विवरण हैं, जैसे कि व्हाइटस्पेस, विराम चिह्न, केस अंतर, विशेषक चिह्न आदि के बारे में क्या करना है। इसके बारे में अधिक जानकारी के लिए यूनिकोड कोलेशन एल्गोरिथम देखें।

आईसीयू सुविधा के प्रतिबद्ध होने से पहले, यह सभी कार्यक्षमता जो ऑपरेटिंग सिस्टम में सी लाइब्रेरी द्वारा सुविधा प्रदान करती है। PostgreSQL मूल रूप से स्ट्रिंग्स को strcmp() . में पास करता है , strcoll() , और पसंद और परिणाम के साथ काम करता है। विभिन्न ऑपरेटिंग सिस्टमों में सी पुस्तकालय कार्यक्षमता और गुणवत्ता के विभिन्न स्तरों के लिए ऊपर वर्णित विभिन्न संयोजन रूपों और बारीकियों को लागू करते हैं, इसलिए PostgreSQL वह कर सकता है जो आपका ऑपरेटिंग सिस्टम कर सकता है।

संयोजन बदलना

समस्याएँ तब शुरू होती हैं जब ऑपरेटिंग सिस्टम को कभी भी अपने द्वारा प्रदान किए गए संयोजन को बदलने की आवश्यकता होती है। वे ऐसा क्यों करना चाहेंगे? यह हो सकता है कि पिछला मिलान गलत था और उसे ठीक किया जाना था। हो सकता है कि किसी भाषा के लिए एक नया मानक प्रकाशित किया गया हो और उसके लिए संयोजन को अद्यतन किया जाना है। हो सकता है कि प्रदर्शन कारणों से या अतिरिक्त कार्यक्षमता को लागू करने के लिए आवश्यक होने के कारण संयोजन और स्ट्रिंग डेटा का आंतरिक प्रतिनिधित्व बदल दिया गया हो। कई कार्यक्रमों के लिए, यह कोई समस्या नहीं है। यदि आप बिल्कुल भी अंतर देखते हैं, तो आपको बस थोड़ा अलग ऑर्डर किया गया आउटपुट दिखाई दे सकता है। हालाँकि, एक डेटाबेस सिस्टम के लिए, यह एक बड़ी समस्या है। जैसा कि ऊपर वर्णित है, PostgreSQL सॉर्ट किए गए डेटा को इंडेक्स और अन्य स्थानों में संग्रहीत करता है और सही होने के लिए सॉर्ट ऑर्डर पर निर्भर करता है। यदि सॉर्ट क्रम सही नहीं है, तो हो सकता है कि किसी अनुक्रमणिका लुकअप को वह डेटा न मिले जो वास्तव में वहां है। या किसी अनुक्रमणिका को लिखने से भिन्न स्थान पर लिखा जाएगा। या डेटा गलत विभाजन से लिखा या पढ़ा जाता है। यह गलत तरीके से डुप्लिकेट डेटा या डेटा हानि की उपस्थिति का कारण बन सकता है क्योंकि डेटा वह नहीं है जहां इसकी तलाश की जाती है। दूसरे शब्दों में, यह डेटा भ्रष्टाचार और (स्पष्ट) डेटा हानि का कारण बन सकता है।

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

आईसीयू में प्रवेश करें

तो आईसीयू कहाँ आता है? आईसीयू, यूनिकोड के लिए अंतर्राष्ट्रीय घटक, एक पुस्तकालय है जो संयोजन सहित अंतर्राष्ट्रीयकरण और स्थानीयकरण सुविधाएं प्रदान करता है। तो उस संबंध में, यह मानक सी पुस्तकालय में सुविधाओं का उपयोग करने का एक विकल्प है। अच्छी बात यह है कि ICU स्पष्ट रूप से कोलाजंस की स्थिरता के बारे में कुछ गारंटी प्रदान करता है:

  • मामूली रिलीज अपडेट के हिस्से के रूप में एक मिलान असंगत तरीके से नहीं बदला जाएगा।
  • एक संयोजन का एक संस्करण होता है, जिसका निरीक्षण किया जा सकता है, और जब एक मिलान असंगत तरीके से बदलता है, तो संस्करण बदल जाता है।

PostgreSQL के उपयोगकर्ताओं के लिए, व्यवहार में इसका अर्थ होगा:

  • नियमित ऑपरेटिंग सिस्टम पैकेज अपडेट सॉर्ट किए गए डेटा की वैधता में हस्तक्षेप नहीं करेगा। चूंकि एक postgres बाइनरी libicu . के एक विशेष प्रमुख संस्करण से जुड़ा हुआ है , नियमित ऑपरेटिंग सिस्टम पैकेज अपग्रेड postgres . के साथ समाप्त नहीं होगा libicu . के नए प्रमुख संस्करण से लिंक किया जा रहा है , जब तक a) आप PostgreSQL पैकेज को अपडेट नहीं करते हैं, या b) PostgreSQL पैकेज अभी भी पहले की तरह ICU के उसी प्रमुख संस्करण से जुड़े हुए हैं। इसे ठीक से बनाए रखने के लिए पैकेजर्स को सावधान रहने की आवश्यकता होगी, लेकिन व्यवहार में यह बहुत समस्याग्रस्त नहीं होना चाहिए।
  • जब प्रमुख पैकेज और ऑपरेटिंग सिस्टम अपग्रेड एक संयोजन के संस्करण को बदलते हैं, तो हमारे पास इसका पता लगाने और उपयोगकर्ता को चेतावनी देने का एक तरीका है। अभी हम केवल चेतावनी देते हैं और चीजों को ठीक करने के लिए कुछ दिशानिर्देश और उपकरण प्रदान करते हैं, लेकिन भविष्य में हम इसे और परिष्कृत और स्वचालित कर सकते हैं।

(पैकेजर्स के लिए इसे और अधिक स्पष्ट करने के लिए:अपने ऑपरेटिंग सिस्टम की एक स्थिर शाखा में, आपको प्रमुख ICU संस्करण को नहीं बदलना चाहिए, जो किसी दिए गए PostgreSQL पैकेज सेट से जुड़ा हुआ है।)

ICU का उपयोग करना

इसका उपयोग करने में सक्षम होने के लिए, PostgreSQL को ICU समर्थन के साथ स्पष्ट रूप से निर्मित करने की आवश्यकता है। स्रोत से निर्माण करते समय, ./configure --with-icu . का उपयोग करें अन्य वांछित विकल्पों के साथ। हम उम्मीद करते हैं कि अधिकांश प्रमुख बाइनरी पैकेज डिफ़ॉल्ट रूप से भी इसे पेश करेंगे। जब यह किया जाता है, तो आईसीयू-आधारित कॉलेशन को libc-आधारित कॉलेशन के साथ पेश किया जाता है जो पिछले रिलीज़ की पेशकश की गई थी। (इसलिए आईसीयू समर्थन के साथ निर्माण libc संयोजन समर्थन को नहीं हटाता है; दोनों एक साथ मौजूद हैं।) एक आईसीयू-आधारित संयोजन बनाम एक libc-आधारित एक का चयन करने के तरीके के विवरण के लिए दस्तावेज़ीकरण देखें। उदाहरण के लिए, यदि आपने पहले निर्दिष्ट किया था

CREATE TABLE ... (... x text COLLATE "en_US" ...)

अब आप कर सकते हैं

CREATE TABLE ... (... x text COLLATE "en-x-icu" ...)

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

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

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

संक्षिप्त कुंजियाँ

तो यह परिवर्तन डेटाबेस सिस्टम की दीर्घकालिक मजबूती के लिए कुछ बहुत ही महत्वपूर्ण सुधार प्रदान करेगा। लेकिन आईसीयू अन्य क्षेत्रों में सिस्टम सी लाइब्रेरी में भी सुधार है।

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

और कोलाज

मजबूती और प्रदर्शन के इन आंतरिक सुधारों के अलावा, कुछ नई उपयोगकर्ता-सामना करने वाली कार्यक्षमता भी है।

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

उदाहरण के लिए, जर्मन विकिपीडिया के उदाहरण को अब PostgreSQL के साथ पुन:प्रस्तुत किया जा सकता है:

CREATE TABLE names (name text);

INSERT INTO names
    VALUES ('Göbel'), ('Goethe'), ('Goldmann'), ('Göthe'), ('Götz');

=> SELECT name FROM names ORDER BY name COLLATE "de-u-co-standard-x-icu";
   name
----------
 Göbel
 Goethe
 Goldmann
 Göthe
 Götz

=> SELECT name FROM names ORDER BY name COLLATE "de-u-co-phonebk-x-icu";
   name
----------
 Göbel
 Goethe
 Göthe
 Götz
 Goldmann

=> SELECT name FROM names ORDER BY name COLLATE "de-AT-u-co-phonebk-x-icu";
   name
----------
 Goethe
 Goldmann
 Göbel
 Göthe
 Götz

(ग्लिबैक के साथ, COLLATE "de_DE" और COLLATE "de_AT" वास्तव में पहला ऑर्डर लौटाएं।)

कई सुविधाओं को संयोजित करने का एक दिलचस्प तरीका यह हो सकता है कि उत्पाद के नाम और ग्राहक के नामों के बीच उपर्युक्त अंतर को मॉडल करने के लिए डोमेन का उपयोग किया जाए:

CREATE DOMAIN product_name AS text COLLATE "de-u-co-standard-x-icu";
CREATE DOMAIN person_name AS text COLLATE "de-u-co-phonebk-x-icu";

(यह सिर्फ एक उदाहरण है। बेशक आप उन COLLATE . को भी संलग्न कर सकते हैं स्तंभ परिभाषाओं के खंड सीधे या प्रश्नों में उनका उपयोग करें।)

और भी कोलाज

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

=# SELECT chr(x) FROM generate_series(x'1F634'::int, x'1F644'::int) AS _(x)
       ORDER BY chr(x) COLLATE "und-x-icu";
 chr
-----
 😴
 😵
 😶
 😷
 😸
 😹
 😺
 😻
 😼
 😽
 😾
 😿
 🙀
 🙁
 🙂
 🙃
 🙄

के साथ

=# CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = 'und-u-co-emoji');
=# SELECT chr(x) FROM generate_series(x'1F634'::int, x'1F644'::int) AS _(x)
       ORDER BY chr(x) COLLATE "und-u-co-emoji-x-icu";
 chr
-----
 🙂
 🙃
 😶
 🙄
 😴
 😷
 😵
 🙁
 😺
 😸
 😹
 😻
 😼
 😽
 🙀
 😿
 😾

हां, इसके बारे में वास्तव में एक मानक है।

आने के लिए और अधिक

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज में सिंगल यूजर मोड में टेबल बनाना

  2. सबक्वेरी में दो कॉलम जहां क्लॉज

  3. यदि कोई पंक्ति मौजूद है तो वापसी आईडी, अन्यथा डालें

  4. आपके PostgreSQL परिनियोजन में देखने के लिए 7 चीजें

  5. PostgreSQL डेटाबेस कॉलम से गैर-संख्यात्मक मान लौटाएं