दिलचस्प पोस्ट
XCode 6 में उद्देश्य-सी हेडर पर स्विफ्ट नहीं बनाया गया क्या खुला स्रोत सी ++ स्थिर विश्लेषण उपकरण उपलब्ध हैं? टर्नरी ऑपरेटर कैसे काम करता है? जावास्क्रिप्ट माइम प्रकार जावा – कैसे मैक ओएस पर प्रतिलिपि और चिपकाएँ मेनू में हुक जावा स्विंग जीयूआई जमा देता है क्या एक async एपीआई कभी सिंक्रोनस फेंकता है? ऑर्डर आइटम और WC_Order_Item_Product को Woocommerce 3 में प्राप्त करें नेक्सस 4 एमटीपी के माध्यम से फाइल नहीं दिखा रहा है क्या मैं दूसरे वर्ग में किसी गतिविधि का उद्देश्य बना सकता हूं? जावा में गणित अभिव्यक्ति के मूल्यांकन के लिए विधि ब्राउज़र विंडो की 100% ऊंचाई बनाओ अनिर्दिष्ट होने पर सी ++ ऑपरेटरों के ऑपरेंडों की मान श्रेणी क्या है? PHP में XML दस्तावेज़ जेनरेट करना (एस्केप वर्ण) मैं Python के easy_install के साथ स्थापित संकुल को कैसे निकालूं?

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

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

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

वेब के समाधान से एकत्रित समाधान "GUID / UUID डेटाबेस कुंजियों के फायदे और नुकसान"

लाभ:

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

नुकसान:

  • बड़ी जगह का उपयोग करें, लेकिन स्थान सस्ता है (एर)
  • डालने के आदेश प्राप्त करने के लिए ID द्वारा आदेश नहीं दे सकता।
  • यूआरएल में बदसूरत लग सकता है, लेकिन वास्तव में, डब्ल्यूटीएफ आप यूआरएल में असली डीबी कुंजी डाल रहे हैं!
  • मैन्युअल डिबगिंग करने के लिए कड़ी मेहनत, लेकिन यह मुश्किल नहीं है

निजी तौर पर, मैं उन्हें पीके के किसी सभ्य आकार के किसी भी सिस्टम के लिए उपयोग करता हूं, लेकिन मुझे एक सिस्टम पर "प्रशिक्षित" मिला, जो सभी जगहों पर दोहराया गया था, इसलिए हमें उन्हें लेना पड़ा। YMMV।

मुझे लगता है कि डुप्लिकेट डेटा चीज कचरा है – आप डुप्लिकेट डेटा प्राप्त कर सकते हैं, हालांकि आप ऐसा करते हैं। सरोगेट चाबियाँ आमतौर पर जहां मैं काम कर रहा हूँ पर frowned हैं हम हालांकि वर्डप्रेस-जैसे सिस्टम का प्रयोग करते हैं:

  • पंक्ति के लिए अद्वितीय आईडी (GUID / जो भी) कभी भी उपयोगकर्ता को दिखाई नहीं देता
  • सार्वजनिक आईडी कुछ फ़ील्ड से एक बार उत्पन्न होती है (उदाहरण के लिए शीर्षक – यह शीर्षक-के- the- लेख करें)

अद्यतनः तो यह एक बहुत अधिक हो जाता है, और मैंने सोचा कि मुझे ग्वाड पीके के बड़े नकारात्मक पक्ष का कहना चाहिए: क्लस्टर इंडेक्स

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

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

@ मेट शेपर्ड:

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

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

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

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

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

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

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

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

इस सवाल के जवाब में मेरे दो उत्तरों को मिला दिया गया

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

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

क्यों कोई भी प्रदर्शन का उल्लेख नहीं करता है? जब आपके पास एकाधिक जुड़ जाते हैं, तो इन सभी गंदा GUIDs के आधार पर प्रदर्शन फर्श के माध्यम से किया जाएगा, वहां 🙁

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

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

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

मिथकों, GUID बनाम Autoincrement (MySQL 5)

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

यूआईडी प्रो

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

GUID विपक्ष

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

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

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

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