यह निर्भर करता है
कई मौजूदा चर्चाएं हैं नेचुरल और सरोगेट कीज़ के बीच ट्रेड-ऑफ़ पर - आपको यह तय करना होगा कि आपके लिए क्या कारगर है और आपके संगठन में 'मानक' क्या है।
ओपी के मामले में, दोनों एक सरोगेट कुंजी है (int userId
) और एक प्राकृतिक कुंजी (char
.) या varchar username
) किसी भी कॉलम को तालिका के लिए प्राथमिक कुंजी के रूप में उपयोग किया जा सकता है, और किसी भी तरह से, आप अभी भी दूसरी कुंजी की विशिष्टता को लागू करने में सक्षम होंगे।
एक या दूसरे तरीके को चुनते समय यहां कुछ विचार दिए गए हैं:
सरोगेट कुंजियों का उपयोग करने का मामला (उदा. UserId INT AUTO_INCREMENT)
यदि आप किसी किराएदार का उपयोग करते हैं, (उदा. UserId INT AUTO_INCREMENT
) प्राथमिक कुंजी के रूप में, फिर सभी तालिकाएं संदर्भित तालिका MyUsers
उसके बाद UserId
. का उपयोग करना चाहिए विदेशी कुंजी के रूप में।
फिर भी आप username
. की विशिष्टता को लागू कर सकते हैं एक अतिरिक्त अद्वितीय अनुक्रमणिका
के उपयोग के माध्यम से कॉलम , उदा.:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
@Dagon के अनुसार, एक संकीर्ण प्राथमिक कुंजी (जैसे int
. का उपयोग करके) ) के पास varchar
. जैसे व्यापक (और परिवर्तनीय लंबाई) मान का उपयोग करने पर प्रदर्शन और भंडारण लाभ हैं . यह लाभ आगे की तालिकाओं को भी प्रभावित करता है जो MyUsers
. का संदर्भ देती हैं , userid
. की विदेशी कुंजी के रूप में संकरा होगा (लाने के लिए कम बाइट)।
सरोगेट पूर्णांक कुंजी का एक अन्य लाभ यह है कि उपयोगकर्ता नाम को MyUsers
संदर्भित तालिकाओं को प्रभावित किए बिना आसानी से बदला जा सकता है .अगर username
एक प्राकृतिक कुंजी के रूप में उपयोग किया गया था, और अन्य तालिकाओं को MyUsers
. के साथ जोड़ा गया है username
. के माध्यम से , यह उपयोगकर्ता नाम बदलने के लिए बहुत असुविधाजनक बनाता है (चूंकि विदेशी कुंजी संबंध अन्यथा उल्लंघन किया जाएगा)। यदि username
. का उपयोग करके तालिकाओं पर उपयोगकर्ता नाम अपडेट करना आवश्यक था विदेशी कुंजी के रूप में, एक तकनीक जैसे ON UPDATE CASCADE
डेटा अखंडता बनाए रखने के लिए आवश्यक है।
प्राकृतिक कुंजी (यानी उपयोगकर्ता नाम) का उपयोग करने का मामला
सरोगेट कुंजियों का उपयोग करने का एक नकारात्मक पहलू यह है कि अन्य तालिकाएं जो MyUsers
. का संदर्भ देती हैं एक सरोगेट कुंजी के माध्यम से JOIN
होने की आवश्यकता होगी MyUsers
. पर वापस जाएं तालिका यदि username
कॉलम की आवश्यकता है। प्राकृतिक कुंजियों के संभावित लाभों में से एक यह है कि यदि किसी क्वेरी के लिए केवल username
. की आवश्यकता होती है MyUsers
. को संदर्भित करने वाली तालिका से कॉलम , कि उसे MyUsers
. में वापस शामिल होने की आवश्यकता नहीं है उपयोगकर्ता नाम पुनर्प्राप्त करने के लिए, जो कुछ I/O ओवरहेड को बचाएगा।