हां, प्राथमिक कुंजी के लिए संख्यात्मक प्रकार के बजाय स्ट्रिंग का उपयोग करने के लिए बिल्कुल नकारात्मक परिणाम हैं, और इससे भी अधिक यदि पीके क्लस्टर किया गया है (जो वास्तव में आपके मामले में है)। हालाँकि, जिस डिग्री को आप स्ट्रिंग क्षेत्र का उपयोग करने का प्रभाव (ओं) को देखते हैं, वह इस तालिका में कितनी पंक्तियाँ हैं, का एक कार्य है) यदि आपके पास इस तालिका में केवल 10k पंक्तियाँ हैं और कुछ अन्य तालिकाओं में 100k पंक्तियाँ हैं जो कि उस फ़ील्ड के माध्यम से इस तालिका में FK करती हैं, तो शायद यह इतना ध्यान देने योग्य नहीं होगा। लेकिन वे प्रभाव निश्चित रूप से अधिक ध्यान देने योग्य हो जाते हैं क्योंकि पंक्ति की संख्या बढ़ जाती है।
आपको यह विचार करने की आवश्यकता है कि एक क्लस्टर इंडेक्स में फ़ील्ड को गैर-क्लस्टर इंडेक्स पर ले जाया जाता है। तो आप प्रति पंक्ति केवल 40 बाइट्स तक नहीं देख रहे हैं, लेकिन (40 * some_number) बाइट्स। और किसी भी FK तालिकाओं में आपके पास वही 40 बाइट पंक्ति में हैं और अधिक से अधिक बार उस क्षेत्र पर एक गैर-क्लस्टर इंडेक्स नहीं होगा जैसा कि JOINs में उपयोग किया जा रहा है, इसलिए अब यह वास्तव में किसी भी तालिकाओं में दोगुना है कि FK यह वाला। यदि किसी को यह सोचने की इच्छा है कि 40 बाइट्स * 1 मिलियन पंक्तियाँ * इसकी 10 प्रतियों के बारे में चिंतित होने की कोई बात नहीं है, तो कृपया मेरा लेख देखें डिस्क सस्ता है! औरली? इस निर्णय से प्रभावित क्षेत्रों के सभी (या कम से कम अधिकांश) विवरण।
विचार करने के लिए दूसरी बात यह है कि छानने और तारों पर छँटाई, खासकर जब एक द्विआधारी मिलान (मैं आप डेटाबेस डिफ़ॉल्ट जो आम तौर पर केस-संवेदी है प्रयोग कर रहे हैं मान) का उपयोग नहीं (यानी समय लेता है) अब तक कम कुशल है जब का उपयोग करने से है INT
/ BIGINT
। यह इस फ़ील्ड पर फ़िल्टर / जॉइन / सॉर्ट करने वाले सभी प्रश्नों को प्रभावित करता है।
इसलिए, कुछ का उपयोग CHAR(5)
करना संभवत: क्लस्टर पीके के लिए ठीक होगा, लेकिन ज्यादातर अगर यह भी परिभाषित किया गया था COLLATE Latin1_General_100_BIN2
(या ऐसा कुछ)।
और क्या [CODE]
कभी भी मूल्य बदल सकता है? यदि हाँ, तो इसका एक और कारण यह भी है कि इसे पीके के रूप में उपयोग न करें (भले ही आप एफके सेट करते हैं ON UPDATE CASCADE
)। अगर यह ठीक है या नहीं बदल सकता है, लेकिन अभी भी पर्याप्त कारण से अधिक है पहले से ही इसे एक संकुल पीके के रूप में उपयोग नहीं करते हैं।
बेशक, सवाल गलत तरीके से व्यक्त किया जा सकता है क्योंकि ऐसा लगता है कि आपके पास पहले से ही आपके पीके में यह फ़ील्ड है।
भले ही, आपका सबसे अच्छा विकल्प, अब तक, [ID_CODE]
क्लस्टर्ड पीके के रूप में उपयोग करना है, एफके के रूप में संबंधित तालिकाओं में उस फ़ील्ड का उपयोग करें और [CODE]
एक के रूप में रखें UNIQUE INDEX
(जिसका अर्थ है कि यह "वैकल्पिक कुंजी" है)।
अद्यतन
इस उत्तर पर एक टिप्पणी में इस सवाल पर आधारित एक और अधिक जानकारी:
क्या [ID_CODE], प्राथमिक कुंजी के रूप में, सबसे अच्छा विकल्प है अगर मैं तालिका देखने के लिए [CODE] कॉलम का उपयोग करता हूं?
यह सब एक महान कई कारकों पर निर्भर करता है, जिनमें से कुछ मैं पहले ही उल्लेख कर चुका हूं, लेकिन आराम करेंगे:
एक प्राथमिक कुंजी यह है कि व्यक्तिगत पंक्ति को कैसे पहचाना जाता है, किसी विदेशी कुंजी द्वारा संदर्भित किया जाता है या नहीं। आपकी प्रणाली आंतरिक रूप से कैसे पहचानती है कि पंक्ति किससे संबंधित है, लेकिन यह आवश्यक नहीं है कि कैसे, आपके उपयोगकर्ता स्वयं या उस पंक्ति को कैसे पहचानें। अद्वितीय डेटा वाला कोई भी NULL कॉलम काम नहीं कर सकता है , लेकिन विचार करने के लिए व्यावहारिकता के मुद्दे हैं, खासकर यदि पीके वास्तव में, किसी भी एफके द्वारा संदर्भित है। उदाहरण के लिए GUID अनूठे हैं और कुछ लोग वास्तव में विभिन्न कारणों से उनका उपयोग करना पसंद करते हैं, लेकिन वे Clustered Indexes के लिए काफी खराब हैं ( NEWSEQUENTIALID
बेहतर है, लेकिन सही नहीं है)। दूसरी ओर, GUIDs वैकल्पिक कुंजियों के रूप में ठीक हैं और पंक्ति को देखने के लिए ऐप द्वारा उपयोग किया जाता है, लेकिन JOIN अभी भी एक INT (या समान) पीके का उपयोग करके किया जाता है।
अब तक आपने हमें यह नहीं बताया कि यह [CODE]
क्षेत्र सभी कोणों से सिस्टम में कैसे फिट बैठता है, अब इस बात का उल्लेख करते हुए कि यह कैसे आप पंक्तियों को देखते हैं, लेकिन क्या यह सभी प्रश्नों के लिए है या सिर्फ कुछ के लिए है? इसलिये:
यह निर्णय "NVARCHAR हाँ या नहीं?" के सवाल पर विशुद्ध रूप से नहीं किया जा सकता है। मैं फिर से कहूंगा कि आम तौर पर बोलना मुझे एक अच्छा विचार नहीं लगता है, लेकिन निश्चित रूप से ऐसे समय होते हैं जब यह ठीक होता है। इस तालिका में इतने कम क्षेत्रों को देखते हुए यह संभावना नहीं है कि कोई और अधिक है, या कम से कम कई नहीं, अनुक्रमणिका हैं। तो आप [CODE]
क्लस्टर्ड इंडेक्स के रूप में ठीक हो सकते हैं । और अगर कोई अन्य तालिका इस तालिका का संदर्भ नहीं देती है, तो आप इसे पीके बना सकते हैं। लेकिन, अगर अन्य टेबल इस तालिका को संदर्भित करते हैं तो मैं [ID_CODE]
पीके के रूप में क्षेत्र का विकल्प चुनूंगा, भले ही गैर-क्लस्टर हो।