C
मिलान सही विकल्प है।
लोकेल के बिना सब कुछ थोड़ा तेज है। और चूँकि कोई भी टकराव वैसे भी सही नहीं है, डेटाबेस को बिना टकराव के बनाएँ , जिसका अर्थ है C
।
कई ऑपरेशन के लिए एक कॉलेशन प्रदान करना एक दर्द हो सकता है। हालांकि डिफ़ॉल्ट टकराव और एक तदर्थ टकराव के बीच गति में ध्यान देने योग्य अंतर नहीं होना चाहिए। आखिरकार यह केवल बिना डेटा के है, और छंटनी के समय टकराव के नियम लागू होते हैं।
ध्यान रखें कि Postgres अंतर्निहित OS द्वारा प्रदान की गई लोकेल सेटिंग्स पर बनाता है, इसलिए आपको उपयोग किए जाने वाले प्रत्येक लोकेल के लिए उत्पन्न होने वाले स्थानों की आवश्यकता होती है। इतने पर संबंधित जवाब में अधिक यहाँ और यहाँ ।
हालांकि, जैसा कि @Craig पहले से ही उल्लेख किया गया है , सूचकांक इस परिदृश्य में अड़चन हैं। सूचकांक के टकराव को कई मामलों में लागू ऑपरेटर के टकराव से मेल खाना पड़ता है जिसमें चरित्र डेटा शामिल होता है।
आप COLLATE
अनुक्रमित में विनिर्देशक का उपयोग मिलान अनुक्रमणिका बनाने के लिए कर सकते हैं । यदि आप एक ही तालिका में डेटा मिला रहे हैं, तो आंशिक अनुक्रमणिका सही विकल्प हो सकती है।
उदाहरण के लिए, अंतर्राष्ट्रीय तार वाली एक तालिका:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
और आप ज्यादातर एक समय में एक भाषा में रुचि रखते हैं:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
फिर आंशिक सूचकांक बनाएं जैसे:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
आपकी ज़रूरत की प्रत्येक भाषा के लिए एक
वास्तव में, विरासत इस तरह से एक मेज के लिए एक बेहतर दृष्टिकोण हो सकता है। तब आपके पास प्रत्येक विरासत वाली मेज पर एक सादा सूचकांक हो सकता है जिसमें केवल एक ही स्थान के लिए तार होते हैं। आपको निश्चित रूप से विरासत में मिली तालिकाओं के लिए विशेष नियमों के साथ सहज होने की आवश्यकता है।