"नए" अनुप्रयोगों में समग्र कुंजियों पर कभी विचार नहीं किया जाना चाहिए। वे अतीत में उन लोगों द्वारा उपयोग किए जाते थे जो सोचते थे कि "व्यावसायिक कुंजी" "सरोगेट कुंजी" से बेहतर हैं।
संपादित करें:जैसा कि क्रिस ने पूछा है, मैं अपने उत्तर का विस्तार कर रहा हूं।
मुझे यह बताते हुए शुरू करना चाहिए कि मैं इस प्रश्न को "समग्र प्राथमिक कुंजी" बनाम "सरोगेट कुंजी" के रूप में समझता हूं।
साथ ही, मैं मानता हूं कि एक . है मामले का उपयोग करें जहां एक समग्र कुंजी समझ में आता है:क्रॉस रेफरेंस टेबल में, जिसे "लिंक टेबल" भी कहा जाता है। इनका उपयोग कई-से-कई तालिकाओं में किया जाता है और इसमें केवल दो फ़ील्ड होते हैं, दोनों विदेशी कुंजियाँ जो xref तालिका के लिए प्राथमिक कुंजी बनाती हैं। उदाहरण के लिए, UserRole
तालिका में user_id
होगा और role_id
, और कुछ नहीं। जावा में कोई वर्ग प्रतिनिधित्व नहीं है, उदाहरण के लिए, इस तरह की तालिका के लिए। यह आमतौर पर एक @ManyToMany
होता है , एक Collection
. के साथ दोनों पक्षों में।
मैंने एक अन्य उत्तर में प्राकृतिक कुंजी बनाम सरोगेट कुंजी पर अपने विचार साझा किए ( हाइबरनेट:समग्र पीके बनाम सरोगेट पीके में राय ) , और मेरा मानना है कि समग्र कुंजी प्राकृतिक कुंजी के कुछ नुकसानों को साझा करती है, बिना कोई वास्तविक लाभ लाए।
संयुक्त कुंजियों के साथ समस्या यह है कि आपको दो की आवश्यकता होगी मान विशिष्ट रूप से एक रिकॉर्ड की पहचान करने के लिए। एक बार जब आप इस पहली तालिका में रिकॉर्ड्स का संदर्भ देने वाली तालिकाएँ बनाना शुरू कर देते हैं तो यह एक समस्या बन जाती है। फिर दूसरी तालिका को दो . की आवश्यकता होती है एक . को संदर्भित करने में सक्षम होने के लिए कॉलम अभिलेख। और यदि यह दूसरी तालिका एकल मान + विदेशी कुंजी से बनी संयुक्त कुंजी का उपयोग करती है, तो अब आपके पास तीन हैं विशिष्ट रूप से एक . की पहचान करने के लिए कॉलम अभिलेख। और एक तीसरी तालिका के लिए इन तीन की आवश्यकता होगी एक . को संदर्भित करने के लिए अतिरिक्त कॉलम दूसरी तालिका में रिकॉर्ड वास्तव में, यह एक बर्फ का गोला है।
एक और नुकसान यह है कि आवश्यकताएं करें परिवर्तन। पुरे समय। तो, जो आज एक अच्छी समग्र कुंजी प्रतीत होती है वह कल की कुंजी नहीं है। इसलिए हमारे पास सरोगेट कुंजियाँ हैं:भविष्य-सबूत होने के लिए।
समग्र कुंजियों का मुख्य रूप से उपयोग किया जाता है ताकि किसी तालिका में रिकॉर्ड स्तंभों के सेट के आधार पर अद्वितीय हों। उदाहरण के लिए, यदि आपके पास Customers
है तालिका, आपके पास NationalId
हो सकता है +Country
एक अद्वितीय मूल्य के रूप में, जिसका अर्थ है कि दो उपयोगकर्ता एक ही एसएसएन साझा नहीं कर सकते हैं यदि उनका देश यूएसए है। लेकिन दो रिकॉर्ड के लिए समान संख्या होना संभव है, यदि वे एक ही देश में नहीं हैं। यदि आप समग्र कुंजी पसंद करते हैं, तो यह इसके लिए एक अच्छा उम्मीदवार होगा। लेकिन जैसा कि मैंने पहले संकेत दिया था, आप एक सरोगेट कुंजी का उपयोग कर सकते हैं और एक unique
लागू कर सकते हैं बाधा आपको एक समग्र कुंजी के साथ-साथ एक सरोगेट कुंजी की सुरक्षा के लाभ होंगे।