गाइड बनाम INT - जो प्राथमिक कुंजी के रूप में बेहतर है?


97

मैं उपयोग करने या न करने के कारणों के आसपास पढ़ रहा हूं Guidऔर int

intयाद रखने में आसान छोटा, तेज, आसान है, एक कालानुक्रमिक अनुक्रम रखता है। और जैसा कि Guid, मैंने पाया एकमात्र लाभ यह है कि यह अद्वितीय है। किस मामले में Guidऔर से बेहतर होगा intऔर क्यों?

मैंने जो देखा है, उसमें intसंख्या सीमा को छोड़कर कोई दोष नहीं है, जो कई मामलों में अप्रासंगिक हैं।

वास्तव में क्यों Guidबनाया गया था? मुझे वास्तव में लगता है कि एक साधारण तालिका की प्राथमिक कुंजी के रूप में सेवा करने के अलावा इसका एक उद्देश्य है। (किसी Guidचीज़ का उपयोग करके वास्तविक एप्लिकेशन का कोई उदाहरण ?)

(गाइड = UniqueIdentifier) ​​SQL सर्वर पर टाइप करें


1
प्राथमिक कुंजी के बजाय , मुझे लगता है कि आप सरोगेट कुंजी का मतलब है कि एक कुंजी है जो प्राकृतिक कुंजी नहीं है (बाद की कुंजी जिसे हम वास्तविक दुनिया में उपयोग करते हैं)। संभवतः आप का मतलब क्लस्टर इंडेक्स है।
onedaywhen

प्राथमिक (प्राथमिक) कुंजी और INDEX के बीच का अंतर भी याद रखें।
एलन एस। हैंसेन


2
" intसंख्या सीमा को छोड़कर कोई दोष नहीं है, जो कई मामलों में अप्रासंगिक हैं।": वास्तव में, INT बनाम GUID के इस संदर्भ में, हस्ताक्षरित, 32-बिट INTकी ऊपरी सीमा पूरी तरह से अप्रासंगिक है जो किसी हस्ताक्षरित की ऊपरी सीमा को देखते हुए है। , 64-बिट BIGINTलगभग सभी उपयोगों से परे अच्छी तरह से है (इससे भी अधिक यदि आप कम सीमा पर नंबरिंग शुरू करते हैं, और उसी के लिए जाते हैं INT) और यह अभी भी GUID (16 के बजाय 8 बाइट्स) का आधा आकार है और अनुक्रमिक है।
सोलोमन रटज़की

जवाबों:


89

यहां और यहां स्टैक ओवरफ्लो में यह पूछा गया है

जेएफ की पोस्ट GUID का उपयोग करने के पेशेवरों और विपक्षों के बारे में बहुत कुछ बताती है।

GUID पेशेवरों

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

गाइड विपक्ष

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

यदि आप प्रदर्शन के बारे में निश्चित हैं और आप रिकॉर्ड को दोहराने या विलय करने की योजना नहीं बना रहे हैं, तो इसका उपयोग करें int, और इसे ऑटो वेतन वृद्धि ( SQL सर्वर में पहचान बीज ) सेट करें।


20
GUID दृष्टिकोण का एक और संदर्भ यह है कि आप इसे अपने अंतिम-उपयोगकर्ता के लिए पहचानकर्ता के रूप में उपयोग नहीं कर सकते। क्या आप वास्तव में अपने उपयोगकर्ताओं से फोन पर यह बताने की अपेक्षा करते हैं कि उनके पास ऑर्डर "BAE7DF4-DDF-3RG-5TY3E3RF456AS10" है? :)
ब्रान जूल

3
यदि आप अनुक्रमिक छापों का उपयोग नहीं करते हैं, और आपकी प्राथमिक कुंजी (SQL सर्वर डिफॉल) को क्लस्टर कर दिया जाता है, तो आपके सभी डेटा आवेषण तालिका में बेतरतीब ढंग से बिखरे रहेंगे, जिससे आपके डेटा का बड़े पैमाने पर विखंडन होगा। यह मानते हुए कि डेटा को सामान्य रूप से किसी क्रम में डाला जाएगा, जैसे कालानुक्रमिक।
डेटागोड

6
SQL आवृत्ति के पुनरारंभ होने तक अनुक्रमिक मार्गदर्शिकाएँ केवल अनुक्रमिक होती हैं। फिर पहले मूल्य से अधिक होने की संभावना पहले से कम होगी जिस तरह से रूट मूल्य उत्पन्न होता है, जिससे सभी प्रकार की समस्याएं फिर से उत्पन्न होती हैं।
मर्डेनी

20
@Brann आदर्श रूप से आपको अपने पीके मूल्यों को अंत उपयोगकर्ताओं को पहली जगह में नहीं दिया जाएगा। मुझे पता है कि ऐसा करना कुछ सामान्य है, और यह कुछ ऐसा है जो मैंने खुद अतीत में किया है इससे पहले कि मैंने सीखा नहीं। लेकिन जब से यह नहीं किया जाना चाहिए, GUID पर INT पसंद करने का वह विशेष कारण वैध नहीं है।
सोलोमन रटज़की

2
चयन @ChadKuehn UNIQUEIDENTIFIERसे अधिक INTहै क्योंकि INTएक ऊपरी सीमा है, असीम जा रहा है के बाद से नहीं बल्कि गरीब तर्क है, जबकि पर्याप्त सच है, एक नहीं है व्यावहारिक लाभ। आप INTइसे 1 के बजाय कम सीमा (-2.14 बिलियन) पर शुरू करके आसानी से प्रभावी क्षमता को दोगुना कर सकते हैं , या यदि पूर्ण 4.3 बिलियन पर्याप्त नहीं है, तो इसके साथ शुरू करना BIGINTअभी भी केवल 8 बाइट्स के रूप में है GUID के लिए 16 की तुलना में, और यह अलग है।
सोलोमन रटज़की 18

18

यदि आप अपने डेटा को किसी बाहरी स्रोत से सिंक्रनाइज़ कर रहे हैं, तो एक निरंतर GUID बहुत बेहतर हो सकता है। एक त्वरित उदाहरण जहां हम एक GUID का उपयोग कर रहे हैं, एक ऐसा उपकरण है जो ग्राहक को उनके नेटवर्क को क्रॉल करने और ऑटो-डिस्कवरी के कुछ वर्गों को करने के लिए भेजा जाता है, रिकॉर्ड किए गए रिकॉर्ड को संग्रहीत करता है, और फिर सभी ग्राहक रिकॉर्ड एक केंद्रीय डेटाबेस में एकीकृत होते हैं वापस हमारे अंत पर। यदि हम एक पूर्णांक का उपयोग करते हैं, तो हमारे पास 7,398 "1" s होगा, और जो "1" था, उस पर नज़र रखना बहुत कठिन होगा।


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

15

मैंने सफलता के साथ एक संकर दृष्टिकोण का उपयोग किया है। तालिकाओं में एक ऑटो-इन्क्रिमेंट प्राथमिक कुंजी पूर्णांक idस्तंभ और एक guidस्तंभ होता है। guidके रूप में विशिष्ट विश्व स्तर पंक्ति की पहचान करने की जरूरत है और इस्तेमाल किया जा सकता idछंटाई और पंक्ति के मानव पहचान प्रश्नों के लिए इस्तेमाल किया जा सकता है।


3
यदि idकोई पंक्ति पहचानने के लिए पहले से ही पर्याप्त है तो GUID क्या मूल्य देता है ?
मार्टिन स्मिथ

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

2
@MartinSmith मैंने स्वयं इस दृष्टिकोण का उपयोग किया है और यह काफी अच्छी तरह से काम करता है। GUID नॉनक्लेस्टेड इंडेक्स के साथ केवल एक वैकल्पिक कुंजी है, और आवेदन से पारित हो जाता है, लेकिन केवल प्राथमिक तालिका में रहता है। सभी संबंधित टेबल INTपीके के माध्यम से संबंधित हैं । मुझे यह अजीब लगता है कि यह दृष्टिकोण बहुत अधिक सामान्य नहीं है क्योंकि यह दोनों दुनिया में सबसे अच्छा है। ऐसा लगता है कि ज्यादातर लोग बहुत ही निरंकुश शब्दों में समस्याओं को हल करना पसंद करते हैं, यह महसूस नहीं करते हैं कि पीके को अभी भी वैश्विक विशिष्टता और / या पोर्टेबिलिटी के लिए GUID का उपयोग करने के लिए ऐप के लिए GUID होने की आवश्यकता नहीं है।
सोलोमन रटज़की

1
@rmirabelle मैंने इस दृष्टिकोण के बारे में सोचा था और संकोच कर रहा था, लेकिन आपके जवाब ने मुझे आश्वस्त किया। मूल रूप से मैं ऐसी स्थिति में हूं, जहां मुझे किसी कार्य आइटम (जो कहीं से भी नेटवर्क में आ सकता है) के लिए एक विशिष्ट पहचानकर्ता होना चाहिए, लेकिन मैं पहले डेटाबेस के लिए चक्कर नहीं लगाना चाहता। GUIDs इसके लिए एक अच्छा समाधान हैं, लेकिन मुझे लगता है कि अगर मेरे पास अनुक्रमिक संकुल कुंजी नहीं है, तो JOIN बहुत धीमी हो जाएगी।
ईकोटर

1
@easuter मैं ID फ़ील्ड्स को "केवल इसके लिए" नहीं जोड़ने से सहमत हूं, जैसे कि कई-से-कई "पुल" तालिकाओं में जहां PK संबंधित होने वाले दो FK का समग्र होना चाहिए। लेकिन यहाँ यह एक व्यापार बंद नहीं है क्योंकि आईडी क्षेत्र केवल इसके लिए नहीं है। सिस्टम को कुशलता से काम करने की अनुमति देना काफी महत्वपूर्ण है; ;-) और, मैं यह दलील दूंगा कि आपके मामले में, चूंकि GUIDs बाहरी रूप से उत्पन्न होते हैं, इसलिए इनकी गारंटी अद्वितीय नहीं है , भले ही व्यावहारिक रूप से वे हों। लेकिन डेटा अखंडता के लिए जिम्मेदारी पर्याप्त कारण है कि एक वैकल्पिक कुंजी होना चाहिए और आईडी आपके मामले में पीके होना चाहिए :)
सोलोमन रटज़की

1

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

बेशक, इसका दोष यह है कि "स्केलेबिलिटी के लिए ना कहें!"


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

मुझे पता है कि यह वास्तव में स्पष्ट लगता है, लेकिन मैं देख रहा हूं कि अक्सर भूल हो रही है।

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

हालांकि, यह बहुत कम है कि आप इन डेटा पॉइंट्स पर कड़ा नियंत्रण रख सकते हैं, और इस तरह, आपको सुधार या समायोजन करने की आवश्यकता हो सकती है। आप प्राथमिक कुंजी के साथ ऐसा नहीं कर सकते हैं (ठीक है, आप कर सकते हैं, लेकिन यह एक दर्द हो सकता है)।

धन्यवाद @VahiD स्पष्टीकरण के लिए।


सार्थक प्राथमिक कुंजियों का उपयोग करने की अनुशंसा बिल्कुल भी नहीं की जाती है, नीचे के परिदृश्य पर विचार करें, किसी ने गलत लाइसेंस नंबर दर्ज किया है और आपने इस आईडी का उपयोग विदेशी कुंजी के रूप में 3-4 तालिकाओं में किया है, आप इस गलती को कैसे ठीक करते हैं? बस लाइसेंस संख्या का संपादन इस मामले में पर्याप्त नहीं हो सकता है।
वाहि

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

वर्षों में विकास के लिए
उत्थान

1

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


0

GUID कैसे जेनरेट किए जाते हैं, इसके साथ एक और बात। मर्डेनी ने सही ढंग से बताया कि भले ही न्यूडिसिडियलाइड () का उपयोग किया जा रहा है, उदाहरणों को फिर से शुरू करने से नए मानों को पहले प्रसंस्करण में पीछे छोड़ दिए गए "छेद" से शुरू होता है। एक अन्य चीज जो "अनुक्रमिक" GUID को प्रभावित करती है वह है नेटवर्क कार्ड। अगर मुझे सही से याद है, तो NIC के UID का उपयोग GUID एल्गोरिथम के भाग के रूप में किया जाता है। यदि एक एनआईसी को बदल दिया जाता है, तो इस बात की कोई गारंटी नहीं है कि चीजों के अनुक्रमिक पहलू को बनाए रखने के लिए यूआईडी एक उच्च मूल्य होगा। मुझे यह भी पता नहीं है कि एल्गोरिथ्म का उपयोग करके कई एनआईसी मानों के असाइनमेंट को कैसे प्रभावित कर सकते हैं।

बस एक विचार और मुझे आशा है कि मैं सही ढंग से याद कर रहा हूं। आपका दिन अच्छा रहे!


2
डेटाबेस प्रशासक, bobo8734 में आपका स्वागत है। क्या आप इन टिप्पणियों के लिए कुछ स्रोत पा सकते हैं? यदि आप उनके बारे में अनिश्चित हैं, तो हो सकता है कि वे एक स्टैंडअलोन उत्तर की तुलना में एक टिप्पणी (जब आपके पास इसके लिए प्रतिनिधि हों) के रूप में बेहतर सेवा हो।
लोवल्डबा

-6

दोनों का उपयोग करें

उपयोग पूर्णांक / BigInt प्राथमिक कुंजी के लिए के रूप में इसे बनाए रखने और विदेशी कुंजी संबंधों के रूप में उपयोग करने के लिए आसान है।

लेकिन एक कॉलम को GUID से बांधें ताकि हर पंक्ति में एक अनूठा कॉलम भी हो


2
इस सुझाव के पीछे आपके तर्क को समझाने से किसी को भी दुख नहीं होगा, मुझे यकीन है।
एंड्री एम

GUID 36 वर्ण लंबा है जिसे आप किसी विशिष्ट मामले में खोज रहे हैं तो पढ़ना मुश्किल होगा।
अब्दुल हन्नान एजाज़

1
ठीक है, लेकिन यह वास्तव में यह नहीं बताता है कि ओपी को दोनों का उपयोग क्यों करना चाहिए intऔर guid, जैसा कि आप अपने जवाब में सुझाव दे रहे हैं। और इसके अलावा, मैं आपके सुझाव को सिर्फ मुझे समझाने की बात नहीं कर रहा था - मेरी बात यह थी कि आप अपने उत्तर को अपडेट करना चाहते हैं । वैसे, क्या आप जानते हैं कि एक और उत्तरदाता ने पहले से ही (कम या ज्यादा) आपको जैसा सुझाव दिया है ?
एंड्री एम

यप मेरा मतलब वही था .. शांत बीटीडब्ल्यू :)
अब्दुल हन्नान एजाज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.