प्राथमिक कुंजी के रूप में ईमेल पते का उपयोग करें?


234

क्या ईमेल का पता प्राथमिक के लिए एक खराब उम्मीदवार है जब ऑटो इंक्रीमेंट संख्या की तुलना में?

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

क्या यह प्राथमिक कुंजी के रूप में ईमेल का उपयोग नहीं करने का एक वैध कारण है?

हम उपयोग कर रहे हैं PostgreSQL


5
'प्राथमिक' से आपका क्या तात्पर्य है? यदि ईमेल पते को विशिष्ट होना चाहिए तो यह एक कुंजी है और इसके लिए एक अद्वितीय अवरोध की आवश्यकता होती है। चाहे आप 'प्रमोट' करने का निर्णय लेते हों, यह 'प्राथमिक' हो सकता है, जब तक कि ऐसा करने का कोई व्यावहारिक कारण न हो, उदाहरण के लिए 'प्राथमिक' मनमाना है।
onedaywhen

7
यदि आप चाहते हैं कि आपका डेटाबेस एक अद्वितीय ईमेल पते को लागू करे, तो एक अद्वितीय सूचकांक के साथ एक कॉलम बनाएं, लेकिन इसे प्राथमिक कुंजी के रूप में उपयोग न करें।
जेम्स वेस्टगेट

104
यदि कोई व्यक्ति अपना ईमेल पता बदलना चाहता है तो क्या होगा? क्या आप सभी विदेशी कुंजियों को भी बदलने जा रहे हैं?
systempuntoout 20

3
@onedaywhen - शायद ही कोई अंतर हो, लेकिन प्राथमिक कुंजी डिफ़ॉल्ट रूप से क्लस्टर की जाएगी, जबकि एक अद्वितीय सूचकांक अभ्यस्त होना चाहिए। आप अभी भी प्राथमिक कुंजी को परिभाषित करना चाहेंगे जो डिफ़ॉल्ट एकल रिकॉर्ड लुकअप कुंजी होगी, अद्वितीय सूचकांक केवल एक सामान्य सूचकांक पर कॉलम की विशिष्टता को लागू करता है
जेम्स वेस्टगेट

3
@ जेम्स वेस्टगेट: FYI करें, PostgreSQL में स्वचालित क्लस्टरिंग जैसी कोई चीज नहीं है। एक प्राथमिक कुंजी डिस्क पर ठीक उसी तरह लागू की जाती है जैसे एक UNIQUE INDEX जहां सभी फ़ील्ड NULL नहीं हैं।
मैथ्यू वुड

जवाबों:


283

स्ट्रिंग तुलना इंट की तुलना में धीमी है। हालाँकि, इससे कोई फर्क नहीं पड़ता कि आप केवल ई-मेल पते का उपयोग करके डेटाबेस से किसी उपयोगकर्ता को पुनः प्राप्त करते हैं। यह महत्वपूर्ण है कि यदि आपके पास कई जोड़ों के साथ जटिल प्रश्न हैं।

यदि आप उपयोगकर्ताओं के बारे में कई तालिकाओं में जानकारी संग्रहीत करते हैं, तो उपयोगकर्ता तालिका की विदेशी कुंजियाँ ई-मेल पता होंगी। इसका मतलब है कि आप ई-मेल पते को कई बार स्टोर करते हैं।


11
@Sjoerd: मुद्दा यह नहीं है कि ईमेल-पता कई बार संग्रहीत किया जाता है, हालांकि यह निश्चित रूप से अक्षम है, लेकिन आज हार्ड ड्राइव के बारे में कौन परवाह करता है। अधिकांश व्यवसायों में Google के पैमाने नहीं होते हैं, जहां यह बात होगी। मुद्दा यह है कि ईमेल पते को बाद में नहीं बदला जा सकता है, क्योंकि यह एक प्राथमिक कुंजी है और विदेशी कुंजी के रूप में संदर्भित है।
स्टीफन स्टेगर

@StefanSteiger हार्ड ड्राइव स्पेस के बारे में किसने क्या कहा? आपके द्वारा संग्रहित कुछ भी रैम में जगह लेने वाला है।
जोनाथन एलन

किसी भी चमत्कार के मामले में, जैसा कि मैंने किया था, एक GUID कुंजी एक ईमेल कुंजी के बराबर होगी जो मुझे लगता है।
टॉफटिम 19

178

मैं यह भी बताऊंगा कि एक विशिष्ट क्षेत्र बनाने के लिए ईमेल एक बुरा विकल्प है, ऐसे लोग और यहां तक ​​कि छोटे व्यवसाय भी हैं जो ईमेल पता साझा करते हैं। और फोन नंबर की तरह, ईमेल फिर से उपयोग किए जा सकते हैं। Jsmith@somecompany.com आसानी से जॉन स्मिथ से एक साल और जूलिया स्मिथ से दो साल बाद संबंधित हो सकती है।

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


47
कैस्केडिंग अद्यतन समस्या का उल्लेख करने के लिए +1। यही कारण है कि दोस्तों को दोस्तों को केवल सरोगेट कुंजियों का उपयोग करना चाहिए ;-)।
सेल्के

10
आह, मुझे यह कहना बिल्कुल पसंद नहीं है ... सरोगेट कुंजी भी समस्याओं का स्रोत हो सकती है; हां, एप्लिकेशन व्यवसाय और / या अखंडता नियमों को बदलने के लिए अधिक मजबूत होगा, हालांकि जानकारी थोड़ी आसान हो सकती है और रिकॉर्ड की पहचान कम स्पष्ट हो जाती है। इसलिए मैं यहां एक अंगूठे के नियम की सिफारिश नहीं करूंगा ...
अनरेसन

12
@onedaywhen और @jay, सिर्फ इसलिए कि आपको लगता है कि यह बहुत ही अनोखा है, इसे अद्वितीय मत बनाओ। और हाँ एक पति और पत्नी अलग-अलग ग्राहक हो सकते हैं। बस इससे पहले कि आप इसमें भाग नहीं लेंगे इसका मतलब यह नहीं होगा। मैंने इसमें भाग लिया है और ऐसा होता है यही कारण है कि ईमेल को कभी भी विशिष्ट नहीं माना जाना चाहिए चाहे आपको लगता है कि यह होना चाहिए या नहीं। यह उस तरह की आवश्यकता है जिसे आप पीछे धकेलते हैं क्योंकि यह स्वाभाविक रूप से गलत है।
HLGEM

15
@HLGEM: मैं एक अंतहीन तर्क में नहीं आना चाहता, लेकिन आप यह नहीं कह सकते कि प्रस्तावित कुंजी संदर्भ को जाने बिना काल्पनिक के आधार पर अद्वितीय नहीं है। उदाहरण के लिए, फोन कंपनी के दृष्टिकोण से, एक टेलीफोन नंबर विशिष्ट रूप से ग्राहक की पहचान करता है। हां, आप कह सकते हैं, "लेकिन क्या होगा यदि दो या तीन लोग हैं जो उस नंबर पर कॉल करने पर जवाब दे सकते हैं?" लेकिन यह अप्रासंगिक है। फोन कंपनी के दृष्टिकोण से, परिभाषा के अनुसार यह एक ग्राहक है। (जारी ...)
जे

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

99

प्राथमिक कुंजी अद्वितीय और स्थिर होनी चाहिए

ईमेल पते मौसम की तरह बदलते हैं। लुकअप के लिए द्वितीयक कुंजी के रूप में उपयोगी है, लेकिन प्राथमिक कुंजी के लिए एक खराब विकल्प।


17
एक अच्छी कुंजी की एक संपत्ति यह है कि स्थिर होना चाहिए लेकिन जरूरी नहीं कि अपरिवर्तनीय हो।
onedaywhen

5
@onedaywhen: हाँ! अन्यथा SQL अपडेट को कैसकेडिंग का समर्थन क्यों करेगा?
बिल करविन

18
यदि आपके पास कोई विकल्प है, तो निरंतर / अपरिवर्तनीय कुंजियों के लिए जाएं; सड़क के नीचे आपके लिए कम काम; सिर्फ इसलिए कि SQL कैस्केडिंग अपडेट का समर्थन करता है इसका मतलब यह नहीं है कि यह हमेशा एक अच्छा विचार है!
स्टीवन ए लोवे

7
@Vincent Malgrat: "कैस्केडिंग अपडेट ... ब्रेक डीबी सामान्यीकरण" - मिथिंक आपने सामान्यीकरण की अवधारणा को गलत समझा है!
onedaywhen

5
@ विंसेंट मालाग्रेट: यह पुष्टि करने के लिए धन्यवाद कि आपने वास्तव में सामान्यीकरण की अवधारणा को गलत समझा है। "आपके पास एक ही जानकारी कई पंक्तियों पर दोहराई नहीं जानी चाहिए" - क्या आपको वास्तव में "जानकारी" कहने का मतलब है ?! एक यौगिक कुंजी में आमतौर पर कई पंक्तियों पर दोहराए गए मान शामिल होंगे। एक विदेशी कुंजी के लिए, मूल्यों को "दोहराया", बड़े अंतर के बजाय संदर्भित किया जाता है। दो मानों (जैसे 'हाँ' और 'नहीं') वाले एकल-स्तंभ डोमेन में एक संदर्भ तालिका में कई पंक्तियों पर समान मान होंगे यदि इसमें तीन या अधिक पंक्तियाँ हैं। यह वास्तव में बुनियादी सामान है!
onedaywhen

64

प्राथमिक कुंजी के रूप में एक ईमेल पते का उपयोग करने के नुकसान:

  1. जॉइन करते समय धीमा।

  2. पोस्ट की गई विदेशी कुंजी के साथ किसी भी अन्य रिकॉर्ड का अब एक बड़ा मूल्य है, और अधिक डिस्क स्थान ले रहा है। (आज डिस्क स्थान की लागत को देखते हुए, यह संभवतः एक तुच्छ मुद्दा है, इस सीमा को छोड़कर कि अब रिकॉर्ड को पढ़ने में अधिक समय लगता है। # 1 देखें।)

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

एक प्राथमिक कुंजी के रूप में ईमेल पते का उपयोग करने के लाभ:

  1. आप कुछ जोड़ को पूरी तरह से समाप्त करने में सक्षम हो सकते हैं। यदि आपको "मास्टर रिकॉर्ड" से सभी की आवश्यकता है ईमेल पता, तो एक सार पूर्णांक कुंजी के साथ आपको इसे पुनः प्राप्त करने के लिए एक सम्मिलित करना होगा। यदि कुंजी ईमेल पता है, तो आपके पास पहले से ही है और ज्वाइन अनावश्यक है। क्या इससे आपको कोई मदद मिलती है, यह इस बात पर निर्भर करता है कि यह स्थिति कितनी बार सामने आती है।

  2. जब आप तदर्थ क्वेरी कर रहे होते हैं, तो एक मानव के लिए यह देखना आसान होता है कि मास्टर रिकॉर्ड को किस संदर्भ में संदर्भित किया जा रहा है। डेटा समस्याओं को ट्रैक करने की कोशिश करते समय यह एक बड़ी मदद हो सकती है।

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

मेरी विनम्र राय में, यह किसी भी तरह से एक स्लैम-डंक नहीं है। जब एक व्यावहारिक एक उपलब्ध है, तो मैं प्राकृतिक कुंजियों का उपयोग करना पसंद करता हूं क्योंकि वे काम करना आसान होते हैं, और नुकसान वास्तव में ज्यादातर मामलों में बहुत ज्यादा नहीं होते हैं।


@ कोनराड: हालांकि, वह इंगित करता है कि यदि आपके पास एक इंजन नहीं है जो UPDATE CASCADE का समर्थन करता है तो यह PITA नहीं है। यह उस बिंदु कोड-वार पर एक गैर-मुद्दा है; एकमात्र वास्तविक मुद्दा यह है कि अपडेट कितना व्यापक है और कुंजी कितनी व्यापक है। ईमेल पता थोड़ा अधिक हो सकता है, लेकिन 2-वर्ण वाले देश कोड के PK के लिए CASCADE UPDATE कोई बड़ी बात नहीं है।
मैथ्यू वुड

5
@ मट्टू IMHO इसकी अभी भी एक PITA है। उदाहरण के लिए मान लें कि जब आपने अपनी देश तालिका तैयार की थी तो इसमें केवल दो तालिकाओं का उल्लेख था, कोई बड़ी बात नहीं थी, लेकिन समय के साथ-साथ यह सैकड़ों-हजारों अभिलेखों के साथ 20 सारणी बन गई। कुछ संदर्भ के साथ कुछ बिना। यह एक एकल तर्क लिखता है जो हज़ारों लिखता है, और यह सभी तालिकाओं के लिए नहीं बनाता है क्योंकि किसी ने संदर्भ जोड़ दिया जब तालिका में जोड़ा गया। यह सही बात है मुझे एक 2 चार देश कोड टेबल पर मैं तुम्हें बच्चा नहीं है।
कॉनराड फ्रैक्स

@Wood & कॉनराड: सबसे खराब स्थिति तब है जब कोई अंतर्निहित DB समर्थन नहीं है। फिर आपको एक पोस्ट किए गए संदर्भ के साथ हर टेबल के लिए इसके लिए कोड लिखना होगा, और यह सिर्फ एक दर्द है और कीड़े के लिए अंदर जाने के लिए एक दरवाजा है। कैस्केड के साथ, आपको बस प्रत्येक टेबल पर एक क्लॉज जोड़ना याद रखना होगा, ऐसा नहीं अतिमहत्वपूर्ण।
Jay

2
लाभ 1 और 3 समयपूर्व अनुकूलन हैं, लाभ 2 एक बहुत ही मामूली लाभ है और किसी भी सभ्य क्वेरी टूल द्वारा पूरी तरह से दूर हो गया है।
ऐश

4
@Ash: "आशावादी" और "समयपूर्व अनुकूलन" के बीच का अंतर। लेकिन ठीक है, उसी तर्क से, मैंने जिन लोगों को देखा है उनके सभी नुकसान समय से पहले होने वाले अनुकूलन हैं। तो, यह आपको कहां ले जाता है? # 2 के रूप में, मैं एक बड़ी पीड़ा होने के लिए तदर्थ प्रश्नों को करने की कोशिश करते समय अतिरिक्त जोड़ों में टाइपिंग पाता हूं। रिकॉर्ड में अक्सर कई विदेशी कुंजियाँ होती हैं, ताकि आपको समझदार डेटा प्राप्त करने के लिए कई जॉइन की आवश्यकता हो। यदि "सभ्य क्वेरी टूल" से आपका तात्पर्य यह है कि आपके द्वारा बताए बिना आप जो डेटा देखना चाहते हैं उसका एक आंकड़ा है और जादुई रूप से आपके लिए जुड़ता है, तो मैं यह देखना चाहता हूं कि यह कैसे काम करता है।
जे

12

यह बहुत बुरा है। मान लें कि कुछ ई-मेल प्रदाता व्यवसाय से बाहर चला जाता है। उपयोगकर्ता तब अपना ई-मेल बदलना चाहेंगे। यदि आपने प्राथमिक कुंजी के रूप में ई-मेल का उपयोग किया है, तो उपयोगकर्ताओं के लिए सभी विदेशी कुंजियाँ उस ई-मेल की नकल करेंगी, जिससे उसे बदलना बहुत मुश्किल हो जाएगा ...

... और मैंने प्रदर्शन के बारे में बात करना भी शुरू नहीं किया है।


ईमेल पते बदलने के कारण डुप्लिकेट कैसे होंगे? जब तक उपयोगकर्ता A अपना ईमेल पता नहीं बदलता है, और तब उपयोगकर्ता B अपना ईमेल उपयोगकर्ता A के पुराने मान के समान बदलता है, और आपके अपडेट अनुक्रम में नहीं किए जाते हैं। मुझे लगता है कि दूर से संभव है।
जे

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

5
+1 लाइन के लिए "मान लें कि कुछ ई-मेल प्रदाता व्यवसाय से बाहर चला जाता है।"
रेड्डी

ये कोई समस्या नहीं है। इस मुद्दे को हल करने के लिए विदेशी-कुंजी कैस्केडिंग मौजूद है। यदि कोई उपयोगकर्ता अपना ईमेल बदलता है, तो यह परिवर्तन विदेशी कुंजी के रूप में उपयोग करते हुए सभी तालिकाओं में बदल जाएगा।
राफा

1
@ अल्फ़ा, मैं आपको विश्वास दिलाता हूं कि यदि आप कैस्केडिंग अपडेट का उपयोग करते हैं और एक पूरा प्रदाता व्यवसाय से बाहर चला जाता है या अपना नाम बदल देता है (Yahoo.com HooYa.com हो जाता है), तो आपका डेटाबेस सभी उपयोगकर्ताओं के लिए घंटों और शायद दिनों तक बंद रहेगा जबकि यह कैस्केड प्रणाली के माध्यम से। यह एक बहुत ही वैध समस्या है (और इसका कारण यह है कि अगर आपके पास कोई महत्वपूर्ण मात्रा में डेटा है और कुंजी को बदलने की संभावना है तो कैस्केडिंग अपडेट का उपयोग करना एक बुरा विचार है।)
HLGEM

12

मुझे नहीं पता कि आपके सेटअप में कोई समस्या हो सकती है, लेकिन आपके RDBMS के आधार पर कॉलम के मान संवेदनशील हो सकते हैं । PostgreSQL डॉक्स कहते हैं: re यदि आप किसी कॉलम को UNIQUE या PRIMARY KEY घोषित करते हैं, तो अंतर्निहित जेनरेट किया गया केस केस-संवेदी है। दूसरे शब्दों में, यदि आप प्राथमिक कुंजी के रूप में ईमेल के साथ एक तालिका में खोज के लिए उपयोगकर्ता इनपुट को स्वीकार करते हैं, और उपयोगकर्ता "जॉन @ डॉट.कॉम" प्रदान करता है, तो आपको "john@doe.com" नहीं मिलेगा।


7
इस संबंध में उल्लेख करने योग्य है कि John@Doe.com और john@Doe.com एक ही मेलबॉक्स हो सकते हैं या अलग-अलग मेलबॉक्स हो सकते हैं और आपके पास बताने का कोई तरीका नहीं है - यह कहने की युक्ति में कुछ भी नहीं है कि क्या स्थानीय-भाग मामला है- संवेदनशील।
12

यह ईमेल पते की विशिष्टता प्रवर्तन के साथ एक सामान्य मुद्दा है, बजाय इसके कि उन्हें प्राथमिक कुंजी के रूप में उपयोग किया जाना चाहिए - एक ही मुद्दा कोई रास्ता नहीं है। +1 क्योंकि यह अभी भी एक बहुत उपयोगी बिंदु है

11

किसी को भी एक संभावित समस्या का उल्लेख नहीं लगता है कि ईमेल पते को निजी माना जा सकता है। यदि ईमेल पता प्राथमिक कुंजी है, तो प्रोफ़ाइल पृष्ठ URL सबसे अधिक संभावना कुछ ऐसा दिखाई देगा ..../Users/my@email.com। क्या होगा यदि आप उपयोगकर्ता के ईमेल पते को उजागर नहीं करना चाहते हैं? आपको उपयोगकर्ता की पहचान करने के कुछ अन्य तरीके खोजने होंगे, संभवतः URL जैसे बनाने के लिए एक अद्वितीय पूर्णांक मान द्वारा ..../Users/1। फिर आप सभी के बाद एक अद्वितीय पूर्णांक मान के साथ समाप्त करेंगे।


9

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

उस कारण से, डिजाइन को अनुकूलित किया जा सकता है। प्राकृतिक कुंजी वैकल्पिक कुंजी बन जाती है (UNIQUE, NOT NULL), और आप सरोगेट / कृत्रिम / तकनीकी कुंजी का उपयोग प्राथमिक कुंजी के रूप में करते हैं, जो आपके मामले में एक ऑटो-इन्क्रीमेंट हो सकती है।

systempuntoout ने पूछा,

यदि कोई अपना ईमेल पता बदलना चाहता है तो क्या होगा? क्या आप सभी विदेशी कुंजियों को भी बदलने जा रहे हैं?

जो कि कैस्केडिंग है।

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

एक वैकल्पिक कुंजी के रूप में एक स्ट्रिंग का उपयोग करते समय ध्यान में रखने वाली एक और बात यह है कि वास्तविक स्ट्रिंग के एक हैश का उपयोग करना जो आप चाहते हैं कि कुछ अक्षर के ऊपरी और निचले मामलों जैसी चीजों को छोड़ना तेज हो सकता है। (मैं वास्तव में यहाँ क्या मैं अभी भी कहा पुष्टि करने के लिए एक संदर्भ की तलाश में उतरा, अभी भी देख रहा हूँ ...)


4

हां, इसके बजाय पूर्णांक का उपयोग करें तो बेहतर है। आप अपने ईमेल कॉलम को अद्वितीय बाधा के रूप में भी सेट कर सकते हैं।

इस तरह:

CREATE TABLE myTable(
    id integer primary key,
    email text UNIQUE
);

8
यह "बेहतर" क्यों है? कोई कारण या स्रोत?
सोजेरड

20
क्या आप इसे विस्तार में बताने में सक्षम हैं?
Sjoerd


3

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


3

मैं पोस्टग्रेज से बहुत परिचित नहीं हूं। प्राथमिक कुंजी एक बड़ा विषय है। मैंने इस साइट (stackoverflow.com) पर कुछ उत्कृष्ट प्रश्न और उत्तर देखे हैं।

मुझे लगता है कि आपके पास संख्यात्मक प्राथमिक कुंजी होने और ईमेल कॉलम पर UNIQUE INDEX का उपयोग करने से बेहतर प्रदर्शन हो सकता है। ईमेल लंबाई में भिन्न होते हैं और प्राथमिक कुंजी सूचकांक के लिए उचित नहीं हो सकते हैं।

यहाँ और यहाँ कुछ पढ़ना


3

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


2

आपका सहकर्मी सही है: अपनी प्राथमिक कुंजी के लिए एक स्वत: पूर्णांक पूर्णांक का उपयोग करें।

आप ईमेल-विशिष्टता को या तो एप्लिकेशन स्तर पर कार्यान्वित कर सकते हैं, या आप अपने ईमेल पते कॉलम को अद्वितीय के रूप में चिह्नित कर सकते हैं, और उस कॉलम पर एक इंडेक्स जोड़ सकते हैं।

फ़ील्ड को अद्वितीय के रूप में जोड़ने पर आपको स्ट्रिंग तुलना केवल उस तालिका में सम्मिलित करते समय खर्च होगी, न कि जब जोड़ और विदेशी कुंजी बाधा जाँच करते समय।

बेशक, आपको ध्यान देना चाहिए कि डेटाबेस स्तर पर आपके एप्लिकेशन में किसी भी बाधा को जोड़ने से आपका ऐप अनम्य हो सकता है। किसी भी क्षेत्र को "अद्वितीय" या "शून्य नहीं" बनाने से पहले हमेशा उचित विचार दें क्योंकि आपके आवेदन को विशिष्ट या गैर-रिक्त होना चाहिए।


1
"हमेशा आवश्यकता पर विचार करने से पहले आप आवश्यकता एक्स लागू करें क्योंकि आपके आवेदन की आवश्यकता एक्स है।" - सलाह का सबसे खराब टुकड़ा मैंने काफी समय में पढ़ा है।
onedaywhen

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

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

1
भेड़ियों बनो: मैं एक महिला को एक बार जानता था, जिसके पास अपना फोन नंबर नहीं था। तब आप क्या करते हो?
डेविड थॉर्नले

@DavidThornley की तरह लगता है कि आपको अधिक काम करना चाहिए, या शायद एक फ्रेंडली डेमोनर को अनुकूलित करना चाहिए।
फिलिप शिफ

2

एक प्राथमिक कुंजी के रूप में एक GUID का उपयोग करें ... इस तरह से आप इसे अपने कार्यक्रम से उत्पन्न कर सकते हैं जब आप एक INSERT करते हैं और आपको प्राथमिक कुंजी क्या है यह जानने के लिए सर्वर से प्रतिक्रिया प्राप्त करने की आवश्यकता नहीं है। यह टेबल और डेटाबेस के लिए भी विशिष्ट होगा और आपको इस बात की चिंता करने की ज़रूरत नहीं है कि यदि आप किसी दिन टेबल को काटते हैं और ऑटो-इंक्रीमेंट 1 पर रीसेट हो जाता है।


2
जब तक आप प्रदर्शन के बारे में कुछ भी ध्यान नहीं देते तब तक एक GUID का उपयोग करें। यह कोई नहीं # 1 है अगर आप एक ऐसी प्रणाली का निर्माण कर रहे हैं, जिसे
मीका

नहीं ... देखने davybrion.com/blog/2009/05/...
JoelFan

3
सच में कहा माइक्रोसॉफ्ट-कूल-एड-ड्रिंकिंग फैशन!
गैरी चैम्बर्स

2

मुझे पता है कि यह थोड़ी देर की प्रविष्टि है लेकिन मैं यह जोड़ना चाहूंगा कि लोग ईमेल खातों को छोड़ दें और सेवा प्रदाता पते को पुनर्प्राप्त करें जिससे किसी अन्य व्यक्ति को इसका उपयोग करने की अनुमति मिले।

जैसा कि @HLGEM ने बताया "Jsmith@somecompany.com आसानी से जॉन स्मिथ से एक साल और जूलिया स्मिथ से दो साल बाद संबंधित हो सकती है।" इस मामले में जॉन स्मिथ को आपकी सेवा चाहिए या तो आपको अपने ईमेल पते का उपयोग करने से इंकार करना होगा या जूलिया स्मिथ से संबंधित अपने सभी रिकॉर्ड को हटाना होगा।

यदि आपको रिकॉर्ड हटाना है और वे स्थानीय कानून के आधार पर व्यवसाय के वित्तीय इतिहास से संबंधित हैं, तो आप खुद को गर्म पानी में पा सकते हैं।

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


2

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

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



1

आपको एक पूर्णांक प्राथमिक कुंजी का उपयोग करना चाहिए। यदि आपको विशिष्ट होने के लिए ईमेल-कॉलम की आवश्यकता है, तो आप उस कॉलम पर केवल एक अद्वितीय-इंडेक्स सेट क्यों नहीं करते हैं?


1

यदि आपके पास प्राथमिक कुंजी के रूप में एक गैर अंतर मूल्य है तो बड़े डेटा पर सम्मिलन और पुनर्प्राप्ति बहुत धीमी हो जाएगी।


1
नहीं, आवेषण यह धीमा होगा , क्योंकि आपको दो अद्वितीय अनुक्रमित चाहिए: एक उत्पन्न प्राथमिक कुंजी पर और दूसरा ईमेल पते पर।
a_horse_with_no_name

1

प्राथमिक कुंजी को एक स्थिर विशेषता चुना जाना चाहिए। चूंकि ईमेल पते स्थिर नहीं हैं और कई उम्मीदवारों द्वारा साझा किए जा सकते हैं, इसलिए उन्हें प्राथमिक कुंजी के रूप में उपयोग करना अच्छा नहीं है। इसके अलावा ईमेल पते आमतौर पर एक निश्चित लंबाई के होते हैं, जो अद्वितीय आईडी से अधिक हो सकते हैं जिन्हें हम उपयोग करना चाहते हैं [len (email_address)> len (unique_id)] ​​इसलिए इसे अधिक स्थान की आवश्यकता होगी और यहां तक ​​कि सबसे अधिक वे विदेशी कुंजी के साथ कई बार संग्रहीत होते हैं । और फलस्वरूप यह प्रदर्शन को नीचा दिखाएगा।


0

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


0

यदि यह केवल ईमेल की आवश्यकता के लिए अद्वितीय होने की बात है तो आप उस कॉलम के साथ एक अद्वितीय सूचकांक बना सकते हैं।


0

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


0

ईमेल पते को प्राथमिक कुंजी के रूप में उपयोग न करें, ईमेल को अद्वितीय रखें, लेकिन प्राथमिक कुंजी के रूप में इसका उपयोग न करें, प्राथमिक आईडी के रूप में उपयोगकर्ता आईडी या उपयोगकर्ता नाम का उपयोग न करें

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