GUID / UUID डेटाबेस कुंजी के फायदे और नुकसान


222

मैंने अतीत में कई डेटाबेस सिस्टम पर काम किया है जहाँ डेटाबेस के बीच एंट्री ले जाना बहुत आसान हो जाता अगर सभी डेटाबेस कीज़ होतीं GUID / UUID मान होतीं । मैंने इस रास्ते को कुछ समय के लिए नीचे जाने पर विचार किया है, लेकिन हमेशा अनिश्चितता का एक सा है, विशेष रूप से प्रदर्शन और संयुक्त राष्ट्र के बाहर पढ़ने-से-फोन करने में सक्षम URL।

क्या किसी डेटाबेस में GUID के साथ बड़े पैमाने पर काम किया गया है? इस तरह से जाने से मुझे क्या फायदे होंगे, और संभावित नुकसान क्या हैं?


1
जेफ के पास इसके बारे में एक पोस्ट है " प्राथमिक कुंजी: आईडी बनाम GUIDs "।
jfs

1
दूरस्थ ग्राहकों के लिए भी Hi-Lo का उपयोग कर सकते हैं: stackoverflow.com/questions/282099/whats-the-hi-lo-algorithm
नील मैकग्यूगन


जेफ एटवुड के पोस्ट के बारे में अपडेट किया गया स्थान " प्राथमिक कुंजी: आईडी बनाम GUIDs ।" संदर्भ के लिए @jfs का धन्यवाद।
एडम काट्ज

@jfs लिंक करने के लिए बदल गया है blog.codinghorror.com/primary-keys-ids-versus-guids
cr0ss

जवाबों:


229

लाभ:

  • उन्हें ऑफ़लाइन उत्पन्न कर सकता है।
  • प्रतिकृति को तुच्छ बनाता है (इंट के विपरीत, जो इसे बहुत कठिन बनाता है)
  • ORM आमतौर पर उन्हें पसंद करता है
  • अनुप्रयोगों में अद्वितीय। तो हम अपने ऐप में पीके (सीएमएस (गाइड) से पीके का उपयोग कर सकते हैं (यह भी मार्गदर्शन) और हमें पता है कि हम एक संघर्ष प्राप्त करने जा रहे हैं)।

नुकसान:

  • बड़ा अंतरिक्ष उपयोग, लेकिन अंतरिक्ष सस्ता है (एर)
  • डालने का आदेश प्राप्त करने के लिए आईडी द्वारा आदेश नहीं दे सकते।
  • किसी URL में बदसूरत दिख सकते हैं, लेकिन वास्तव में, WTF क्या आप किसी URL में वास्तविक DB कुंजी डाल रहे हैं !? (यह टिप्पणी नीचे टिप्पणी में विवादित है)
  • हार्ड डिबगिंग करना कठिन है, लेकिन यह कठिन नहीं है।

व्यक्तिगत रूप से, मैं उन्हें सबसे अधिक पीके के लिए एक सभ्य आकार की किसी भी प्रणाली में उपयोग करता हूं, लेकिन मुझे एक ऐसी प्रणाली पर "प्रशिक्षित" मिला, जिसे सभी जगह दोहराया गया था, इसलिए हमने उन्हें पाने के लिए बहुत कुछ किया। YMMV।

मुझे लगता है कि डुप्लिकेट डेटा चीज़ बकवास है - आप डुप्लिकेट डेटा प्राप्त कर सकते हैं, हालांकि आप इसे करते हैं। सरोगेट कुंजी आमतौर पर जहां मैं काम कर रहा था पर डूब गए हैं। हम हालांकि वर्डप्रेस जैसी प्रणाली का उपयोग करते हैं:

  • पंक्ति के लिए यूनिक आईडी (GUID / जो भी हो)। उपयोगकर्ता को कभी नहीं दिखाई देता है।
  • सार्वजनिक आईडी कुछ क्षेत्र से ONCE उत्पन्न होती है (जैसे शीर्षक - इसे लेख का शीर्षक-ऑफ-द-आर्टिकल बनाएं)

अद्यतन: तो यह एक 1'ed बहुत मिलता है, और मुझे लगा कि मुझे GUID PK के एक बड़े नकारात्मक पहलू पर ध्यान देना चाहिए: क्लस्टर किए गए अनुक्रमित।

यदि आपके पास बहुत सारे रिकॉर्ड हैं, और एक GUID पर एक संकुल सूचकांक, तो आपका सम्मिलित प्रदर्शन SUCK होगा, क्योंकि आपको आइटम की सूची में यादृच्छिक स्थानों में आवेषण मिलते हैं (जो कि बिंदु है), अंत में नहीं (जो कि त्वरित है)

इसलिए यदि आपको सम्मिलित प्रदर्शन की आवश्यकता है, तो शायद एक ऑटो-इंक INT का उपयोग करें, और एक GUID उत्पन्न करें यदि आप इसे किसी और के साथ साझा करना चाहते हैं (यानी, URL में किसी उपयोगकर्ता को दिखाएं)


184
[डब्ल्यूटीएफ क्या आप एक यूआरएल में एक असली डीबी कुंजी डाल रहे हैं !?] यकीन नहीं होता कि क्यों आपको परेशान करता है। आप और क्या उपयोग करेंगे? स्टैक ओवरफ्लो को देखें ... यह सभी जगह URL में IDENTITY मान है, और यह ठीक काम करता है। URL में DB कुंजियों का उपयोग करना आपको सुरक्षा को लागू करने से नहीं रोकता है।
यूरो मिकेली

20
नहीं, यह नहीं है, लेकिन एसईओ जैसी चीजें आमतौर पर बेहतर होती हैं यदि इसमें कोई कुंजी नहीं है - खासकर जब तक कि एक GUID के रूप में कुछ। बेशक, यह आसानी से चारों ओर काम किया जा सकता है, इसलिए मैं निर्देशित करता हूं कि ओवर स्वीपिंग स्टेटमेंट का एक सा था
निक वाइज

7
अच्छा जवाब, यह अच्छा होगा यदि आप GUID का उपयोग करने के प्रदर्शन के नुकसान के बारे में जानकारी जोड़ते हैं; जैसे कि उनके द्वारा जुड़ना, छांटना और अनुक्रमण करना सभी पूर्णांक का उपयोग करने की तुलना में धीमा होगा। लोग शानदार हैं, लेकिन वे एक लागत पर आते हैं जो प्रदर्शन के महत्वपूर्ण होने पर दर्द हो सकता है।
डॉक्टर जोन्स

26
एक बात ध्यान में रखें, लोग अक्सर पृष्ठ, प्रश्न, फ़ोरम शीर्षक बदलते हैं। SEO के लिए URL में एक छोटी सी आईडी जैसा कुछ होना अच्छा है ताकि यदि शीर्षक बदल जाए तो भी आपको पता रहे कि OLD URL से आने वाले लोगों को कहां अग्रेषित करना है। example.com/35/old-and-bustedबस बन गया है example.com/35/new-hotnessऔर आप एप्लिकेशन सिर्फ शीर्षक की जाँच कर सकते हैं और एक 301 के साथ उपयोगकर्ता को अग्रेषित कर सकते हैं।
Xeoncross

9
एक GUID अनुक्रमणिका महंगी और धीमी है, जो उन्हें प्राथमिक कुंजी के लिए वास्तव में गरीब उम्मीदवार बनाती है।
मैथ्यू जेम्स डेविस

14

@ मैट शेपर्ड:

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

इसलिए आपके पास एक ग्राहक पहचानकर्ता है जो विशिष्ट रूप से ग्राहक की पहचान करता है और आप यह सुनिश्चित करते हैं कि पहचानकर्ता ग्राहक (इनवॉइस) द्वारा जाना जाता है, ताकि ग्राहक और ग्राहक सेवा के लोगों के पास एक सामान्य संदर्भ हो, जब उन्हें संवाद करने की आवश्यकता हो। कोई डुप्लिकेट किए गए ग्राहक रिकॉर्ड की गारंटी देने के लिए, आप ग्राहक पहचानकर्ता पर प्राथमिक कुंजी के माध्यम से या ग्राहक पहचानकर्ता कॉलम पर NOT NULL + UNIQUE बाधा के माध्यम से तालिका में एक विशिष्टता-बाधा जोड़ते हैं।

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

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

दूसरे शब्दों में: GUID कॉलमों को तालिकाओं में जोड़ने के अच्छे कारण हो सकते हैं, लेकिन कृपया वास्तविक (== गैर-GUID) जानकारी के भीतर स्थिरता के लिए अपनी महत्वाकांक्षाओं को कम करने के लिए प्रलोभन में न पड़ें।


1
सुनो सुनो! अपने SQL तुलना पृष्ठ btw से प्यार करें। अत्यंत उपयोगी। केवल एक चीज जो मुझे याद आती है वह है चैंज।
हेनरिक गुस्ताफसन

3
मुझे लगता है कि इस उत्तर को कुछ स्पष्टीकरण की आवश्यकता है: यह मानता है कि यूयूआईडी का उपयोग प्राथमिक कुंजी के रूप में कभी नहीं किया जाता है। मुझे नहीं पता कि यह धारणा कहां से आई है, लेकिन मुझे अभी तक एक ऐसी प्रणाली को देखना है जो आपको उन्हें इस तरह से उपयोग करने की अनुमति नहीं देता है। मुझे पता है कि यह एक पुराना उत्तर है, मुझे लगता है कि वितरित सिस्टम में यूयूआईडी का उपयोग करने के फायदे व्यापक रूप से वापस (फिर?) के रूप में नहीं समझे गए थे।
tne

12

कोई भी प्रदर्शन का उल्लेख क्यों नहीं करता है? जब आपके पास कई जॉइन होते हैं, तो सभी इन नॉटी GUID के आधार पर प्रदर्शन फर्श के माध्यम से जाएंगे, वहां किया गया है :(


1
क्या आप इस बारे में विस्तार से बता सकते हैं कि उस स्थिति में जहां मुझे UUID (या समान) लागू करने की आवश्यकता है, लेकिन प्राथमिक कुंजी के रूप में उनका उपयोग करने के बारे में चिंतित हूं।
जोटीडे

1
UUIDs पूर्णांक के आकार का केवल 4 गुना हैं ... (यदि आपके डेटाबेस में UUID प्रकार है)
जैसन

11

GUIDs आपको भविष्य में बहुत परेशानी का कारण बन सकते हैं यदि उन्हें "uniqifiers" के रूप में उपयोग किया जाता है, तो डुप्लिकेट किए गए डेटा को आपकी तालिकाओं में प्राप्त करने दें। यदि आप GUID का उपयोग करना चाहते हैं, तो कृपया अन्य स्तंभों पर अभी भी UNIQUE- बाधाओं को बनाए रखने पर विचार करें।


11
यह समस्या का दिल है: एक GUID का परिचय किसी भी पंक्ति को विशिष्ट बनाता है। लेकिन पंक्तियों के गैर-कृत्रिम भागों में अचानक डुप्लिकेट (सच्चाई के कई संस्करण) हो सकते हैं।
ट्रॉल्स अरविन

8
क्षतिपूर्ति करने के लिए +1। मैं देख रहा हूं कि आपका क्या मतलब है, लेकिन यह बुरी तरह व्यक्त है।
स्टेफानो बोरीनी

11

मुख्य लाभ यह है कि आप डेटाबेस से कनेक्ट किए बिना अद्वितीय आईडी बना सकते हैं। और आईडी विश्व स्तर पर अद्वितीय हैं ताकि आप आसानी से विभिन्न डेटाबेस से डेटा गठबंधन कर सकें। ये छोटे फायदों की तरह लगते हैं लेकिन पिछले दिनों में मैंने बहुत काम किया है।

मुख्य नुकसान थोड़ा अधिक भंडारण की आवश्यकता है (आधुनिक प्रणालियों पर समस्या नहीं) और आईडी वास्तव में मानव पठनीय नहीं हैं। डिबगिंग करते समय यह एक समस्या हो सकती है।

सूचकांक विखंडन जैसी कुछ प्रदर्शन समस्याएं हैं। लेकिन वे ईजीली सोल्वेबल हैं (जिमी निल्सन द्वारा कंघी करने वाले गाइड: http://www.informit.com/articles/article.aspx?p=25862 )

इस प्रश्न के लिए मेरे दो उत्तरों को संपादित करें

@ मैट शेपर्ड मुझे लगता है कि उसका मतलब है कि आप प्राथमिक कुंजी के रूप में विभिन्न GUID के साथ पंक्तियों की नकल कर सकते हैं। यह किसी भी प्रकार की सरोगेट कुंजी के साथ एक मुद्दा है, न कि केवल GUID। और जैसा उन्होंने कहा कि गैर-प्रमुख स्तंभों में अर्थपूर्ण अद्वितीय बाधाओं को जोड़कर इसे आसानी से हल किया गया है। विकल्प एक प्राकृतिक कुंजी का उपयोग करना है और उन लोगों को वास्तविक समस्याएं हैं ..


मैं कंघी गिड्स और उन लोगों के बारे में जानता हूं जो अनुक्रमण (INSERT प्रदर्शन) के मुद्दे को हल करने में मदद करते हैं। " मुख्य नुकसान थोड़ा अधिक भंडारण की आवश्यकता है " क्या यह बड़े डेटाबेस फ़ाइल आकार के कारण प्रदर्शन को प्रभावित करेगा?
अमित जोशी

8

एक अन्य छोटा सा मुद्दा है कि अगर आप उस कॉलम को क्लस्टर इंडेक्स (अपेक्षाकृत सामान्य अभ्यास) के रूप में उपयोग कर रहे हैं, तो GUIDS का उपयोग करने पर विचार करें। किसी भी दिशा में क्रमिक रूप से शुरू नहीं होने के कारण आप सम्मिलित होने पर एक हिट लेने जा रहे हैं, इस प्रकार जब आप सम्मिलित करते हैं तो पृष्ठ विभाजन आदि होंगे। बस कुछ विचार करने के लिए कि क्या सिस्टम में उच्च IO होने वाला है ...


6

प्राथमिक कुंजी-आईडी बनाम guids

प्राथमिक कुंजी (SQL सर्वर 2000) के रूप में GUID की लागत

मिथक, GUID बनाम ऑटोइन्क्रिमेंट (MySQL 5)

यह वास्तव में आप क्या चाहते हैं।

यूआईडी पेशेवरों

  • हर तालिका, हर डेटाबेस, हर सर्वर पर अद्वितीय
  • विभिन्न डेटाबेस से रिकॉर्ड के आसान विलय की अनुमति देता है
  • कई सर्वरों में डेटाबेस के आसान वितरण की अनुमति देता है
  • डेटाबेस में राउंडट्रिप करने के बजाय आप कहीं भी आईडी जनरेट कर सकते हैं
  • अधिकांश प्रतिकृति परिदृश्यों को वैसे भी GUID स्तंभों की आवश्यकता होती है

गाइड विपक्ष

  • यह पारंपरिक 4-बाइट इंडेक्स मूल्य से 4 गुना बड़ा है; यदि आप सावधान नहीं हैं तो इसका गंभीर प्रदर्शन और भंडारण प्रभाव हो सकता है
  • डिबग करने के लिए बोझिल (जहां userid = '{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • उत्पन्न GUIDs सर्वश्रेष्ठ प्रदर्शन के लिए आंशिक रूप से अनुक्रमिक होना चाहिए (उदाहरण के लिए, SQL 2005 पर newfterentialid) और संकुल अनुक्रमित के उपयोग को सक्षम करने के लिए

1

एक चीज है जिसे वास्तव में संबोधित नहीं किया जाता है, अर्थात् प्राथमिक कुंजी के रूप में यादृच्छिक (UUIDv4) आईडी का उपयोग करके प्राथमिक कुंजी सूचकांक के प्रदर्शन को नुकसान होगा । ऐसा होगा कि आपकी मेज कुंजी के चारों ओर है या नहीं।

RDBMs आमतौर पर प्राथमिक कुंजी की विशिष्टता को सुनिश्चित करते हैं, और BTree नामक संरचना में एक कुंजी द्वारा लुकअप सुनिश्चित करते हैं, जो कि एक बड़े ब्रांचिंग कारक (बाइनरी सर्च ट्री में 2 का ब्रांचिंग कारक) है। अब, एक अनुक्रमिक पूर्णांक आईडी आवेषण को पेड़ के सिर्फ एक तरफ होने का कारण होगा , जिससे अधिकांश पत्ती नोड्स से अछूता रहता है। यादृच्छिक UUID को जोड़ने से सभी इंडेक्स पर लीफ नोड्स को विभाजित करने के लिए सम्मिलन का कारण होगा।

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

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