डेटा प्रकार uuid
है पूरी तरह से कार्य के लिए उपयुक्त है। यह केवल 16 बाइट्स पर कब्जा कर लेता है क्योंकि RAM में 37 बाइट्स का विरोध varchar
या text
प्रतिनिधित्व होता है। (या डिस्क पर 33 बाइट्स, लेकिन विषम संख्या को प्रभावी रूप से 40 बाइट्स बनाने के लिए कई मामलों में पैडिंग की आवश्यकता होगी ।) और इस uuid
प्रकार के कुछ और फायदे हैं।
उदाहरण:
SELECT md5('Store hash for long string, maybe for index?')::uuid AS md5_hash
विवरण और अधिक विवरण:
यदि आपको md5 के क्रिप्टोग्राफिक घटक की आवश्यकता नहीं है, तो आप अन्य (सस्ते) हैशिंग कार्यों पर विचार कर सकते हैं, लेकिन मैं आपके उपयोग के मामले में md5 के साथ जाऊंगा (ज्यादातर केवल पढ़ने के लिए)।
चेतावनी का एक शब्द : आपके मामले के लिए ( immutable once written
) एक कार्यात्मक रूप से निर्भर (छद्म प्राकृतिक) पीके ठीक है। लेकिन वही दर्द होगा जहां अपडेट text
संभव है। एक टाइपो को ठीक करने के बारे में सोचें: पीके और सभी निर्भरता सूचकांक, एफके कॉलम dozens of other tables
और अन्य संदर्भों में भी बदलना होगा। टेबल और इंडेक्स ब्लोट, लॉकिंग इश्यू, धीमे अपडेट, रेफरेंस खो ...
यदि text
सामान्य ऑपरेशन में बदल सकते हैं, तो एक सरोगेट पीके एक बेहतर विकल्प होगा। मेरा सुझाव है कि एक bigserial
कॉलम (रेंज -9223372036854775808 to +9223372036854775807
- वह नौ क्विंटल दो सौ तेईस क्वाड्रिलियन तीन सौ बहत्तर खरब छत्तीस बिलियन बिलियन ) के लिए अलग - अलग मान है billions of rows
। किसी भी मामले में एक अच्छा विचार हो सकता है : दर्जनों एफके कॉलम और इंडेक्स के लिए 16 बाइट्स के बजाय 8 !)। या बहुत बड़ी कार्डिनैलिटी या वितरित प्रणालियों के लिए एक यादृच्छिक यूयूआईडी । आप हमेशा मूल पाठ से मुख्य तालिका में पंक्तियों को खोजने के लिए md5 (as ) को अतिरिक्त रूप से संग्रहीत कर सकते हैं । सम्बंधित:uuid
अपनी क्वेरी के लिए :
@ डैनियल की टिप्पणी को संबोधित करने के लिए : यदि आप हाइफ़न के बिना एक प्रतिनिधित्व पसंद करते हैं, तो प्रदर्शन के लिए हाइफ़न निकालें:
SELECT replace('90b7525e-84f6-4850-c2ef-b407fae3f271', '-', '')
लेकिन मैं परेशान नहीं होता। डिफ़ॉल्ट प्रतिनिधित्व ठीक है। और समस्या वास्तव में यहाँ प्रतिनिधित्व नहीं है।
यदि अन्य पार्टियों में एक अलग दृष्टिकोण होना चाहिए और मिश्रण में हाइफ़न के बिना तार फेंकना चाहिए, तो यह कोई समस्या नहीं है। Postgres के लिए इनपुट के रूप में कई उचित पाठ अभ्यावेदन स्वीकार करता है uuid
। प्रलेखन :
PostgreSQL इनपुट के लिए निम्नलिखित वैकल्पिक रूपों को भी स्वीकार करता है: ऊपरी-केस अंकों का उपयोग, ब्रेसिज़ से घिरा मानक प्रारूप, कुछ या सभी हाइफ़न को छोड़ कर, चार अंकों के किसी भी समूह के बाद एक हाइफ़न जोड़ना। उदाहरण हैं:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
क्या अधिक है, md5()
फ़ंक्शन वापस आता है text
, आप इसका उपयोग decode()
करने के लिए bytea
और उस का डिफ़ॉल्ट प्रतिनिधित्व करने के लिए करेंगे :
SELECT decode(md5('Store hash for long string, maybe for index?'), 'hex')
\220\267R^\204\366HP\302\357\264\007\372\343\362q
आपको encode()
मूल पाठ प्रतिनिधित्व प्राप्त करने के लिए फिर से करना होगा :
SELECT encode(my_md5_as_bytea, 'hex');
इसे बंद करने के लिए, bytea
रैम में 20 बाइट्स (और डिस्क पर 17 बाइट्स, 24 पेडिंग के साथ ) के रूप में संग्रहीत मान आंतरिक varlena
ओवरहेड के कारण होता है, जो आकार और सरल अनुक्रमित के प्रदर्शन के लिए विशेष रूप से प्रतिकूल है।
सब कुछuuid
यहाँ के पक्ष में काम करता है।