2010-06-21 11 views
11

मैं अनुमान लगा रहा हूं, क्योंकि विदेशी कुंजी अपनी खुद की तालिकाओं में प्राथमिक कुंजी हैं, इसलिए वे अद्वितीय होंगे।क्या डेटाबेस तालिका में दो कॉलम हैं जो विदेशी कुंजी हैं, एक तीसरा कॉलम है जो प्राथमिक कुंजी है?

और जानकारी

मैं MySQL का उपयोग कर रहा है और निम्नलिखित तीन टेबल InnoDB इंजन का उपयोग कर रहे हैं।

======================= ======================= 
| galleries   | | images    | 
|---------------------| |---------------------| 
| PK | gallery_id  | | PK | image_id  | 
| | name   | | | title   | 
| | description | | | description | 
| | max_images  | | | filename  | 
| | enabled  | | | enabled  | 
======================= ======================= 

======================== 
| galleries_images  | 
|----------------------| 
| FK | gallery_id  | 
| FK | image_id  | <----- Should I add a PK to this table? 
======================== 

उपसंहार

उत्कृष्ट जवाब के लिए धन्यवाद। मैंने समग्र कुंजी के बारे में सीखा और, मेरे विशिष्ट मामले पर विचार करने के बाद, मैंने कॉलम को galleries_images तालिका प्राथमिक प्राथमिक कुंजी में बनाने का निर्णय लिया। इस तरह, छवियों को केवल एक गैलरी से जोड़ा जा सकता है, जो मैं चाहता हूं।

मैं order_num कॉलम galleries_images में भी लागू करने जा रहा हूं जिसे मैं बनाए रखने के लिए PHP तर्क का उपयोग करूंगा। इस प्रकार उपयोगकर्ता छवियों को प्रत्येक गैलरी में एक विशिष्ट क्रम में रख सकता है।

============================ 
| galleries_images   | 
|--------------------------| 
| PK, FK | image_id  | 
| FK  | gallery_id  | 
|  | order_num  | 
============================ 

धन्यवाद फिर से: मैं इस के साथ समाप्त हो गया!

उपसंहार द्वितीय

आप में से जो लोग ने बताया कि मैं भी इस तालिका जरूरत नहीं थी के लिए धन्यवाद। मैंने शुरू करने के लिए सबसे पूर्ण जानकारी प्रदान नहीं की है। मैंने galleries_images तालिका को पूरी तरह से छोड़ दिया और तालिका में विदेशी कुंजी के रूप में gallery_id को जोड़ा। वैसे भी, मैंने अभी भी सोचा था कि मैंने सोचा था कि मैं मदद के लिए आभारी हूं और आभारी हूं।

+0

+1। यहां तक ​​कि मैं भी सोच रहा हूं, लेकिन हमें और जानकारी चाहिए। आम तौर पर कोई भी डीबी तालिका की प्राथमिक कुंजी पर एक अद्वितीय इंडेक्स बनाएगा। यदि आपकी तालिका में केवल दो विदेशी कुंजी हैं और कोई प्राथमिक कुंजी नहीं है, तो मुझे डर है कि इंडेक्स नहीं बनाया जाएगा (पुष्टि नहीं की गई है, अटकलें)। यह तब निर्भर करता है कि तालिका के लिए किस प्रकार और कैसे उपयोग किया जाता है। – Guru

+0

सिर्फ इसलिए कि विदेशी कुंजी मूल सारणी में प्राथमिक कुंजी के लिए मानचित्र हैं, इसका मतलब यह नहीं है कि विदेशी कुंजी का संयोजन अद्वितीय होना चाहिए। – David

+3

प्रतीक्षा करें! मैपिंग टेबल की एकमात्र आवश्यकता यह है कि यदि मॉडल के लिए गैलरी और छवि के बीच कई रिश्तों की आवश्यकता है। यदि आप पीके छवि_आईडी बनाते हैं, तो यह अब बहुत से नहीं है ... बस गैलरी_आईडी को आप में टेबल टेबल डालें और इसके साथ किया जाए। मुझे नहीं पता कि InnoDB क्या है, लेकिन अगर यह दो चीजों में से एक की तुलना में कचरा बनाता है, तो यह कई और कई लोगों के बीच अंतर नहीं कर सकता है या आप नहीं कर सकते हैं। भौतिक डिजाइन से डेटाबेस शुरू करने में यह समस्या है। आप इस बात पर विचार करने के लिए परेशान नहीं हैं कि आपके रिश्ते क्या हैं। –

उत्तर

6

सभी तालिकाओं में प्राथमिक कुंजी होनी चाहिए।

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

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

संपादित

मैं सिर्फ gallery_id पर प्राथमिक कुंजी समग्र, image_id होगा आपके सवाल का अद्यतन करें। मुझे नया कॉलम जोड़ने का कोई फायदा नहीं दिख रहा है।

+2

हालांकि मेरे पास हाथों के सबूत नहीं हैं, लेकिन मैं कल्पना करूंगा कि एक पूर्ण कुंजी का उपयोग करके प्रयोजनों में शामिल होने के लिए एक पूर्णांक सरोगेट कुंजी का उपयोग करना तेज़ है। इस कारण से, मैं हमेशा सभी तालिकाओं पर int सरोगेट कुंजी बना देता हूं। – David

+0

@ डेविड - शायद यह है। संतुलन में जोड़ने के लिए एक और बात! –

+0

ओह, एक समग्र कुंजी मेरे लिए एक नई बात है। मैंने इसे एक विकल्प के रूप में नहीं माना था। –

5

उत्तर आमतौर पर "हाँ" होता है। आपके द्वारा वर्णित तालिका का प्रकार एसोसिएशन तालिका है, जो संघों को संग्रहीत करता है। चूंकि ये रिकॉर्ड अपने अधिकार में दिलचस्प हैं, और क्योंकि आप शायद बाद में उन्हें देखना चाहते हैं, उनके पास सार्थक पहचान होनी चाहिए।

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

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


अद्यतन:

======================== 
| galleries_images  | 
|----------------------| 
| FK | gallery_id  | 
| FK | image_id  | <----- Should I add a PK to this table? 
======================== 

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

+0

इसके अलावा, आपके उदाहरण में, दो खिलाड़ियों के बीच एक मैचअप एक से अधिक बार हो सकता है, इसलिए केवल दो खिलाड़ी आईडी को कुंजी के रूप में काम करने वाला नहीं है। –

+0

@Eric: निश्चित रूप से! मैंने इस घर को हथौड़ा बनाने के लिए संपादित किया। –

+0

हालांकि अन्य सारणी से 2 प्राथमिक कुंजी फ़ील्ड और दिनांक फ़ील्ड के साथ एक समग्र प्राथमिक कुंजी होने के लिए यह पूरी तरह से स्वीकार्य होगा। –

1

आप कहते हैं कि विदेशी कुंजी अपनी कुंजी में प्राथमिक कुंजी हैं। इसका मतलब है कि वे उन तालिकाओं में अद्वितीय हैं। इसका मतलब यह नहीं है कि हालांकि, वे इस तालिका में अद्वितीय हैं।

मुझे आमतौर पर पता चला है कि डेटाबेस तालिका पर प्राथमिक कुंजी बनाना सर्वोत्तम है। जल्दी या बाद में, आपको यह पता चल जाएगा कि आपको इसकी आवश्यकता है, तो शुरुआत से नई प्राथमिक कुंजी क्यों शामिल न करें?

10

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

कुछ सॉफ़्टवेयर को साधारण पीके की आवश्यकता होती है, भले ही रिलेशनल डेटा मॉडल नहीं है।

2

यदि एक विशिष्ट छवि केवल एक गैलरी से जुड़ी हो सकती है, तो आपकी गैलरी-छवि तालिका में संयोजन अद्वितीय हैं, और आप पीके के रूप में फ़ील्ड की उस जोड़ी का उपयोग कर सकते हैं। अपने स्कीमा अधिक तालिकाओं कि कि दीर्घाओं-चित्रों के बच्चे होने की goind शामिल हैं
तो दीर्घाओं-छवियों संयोजन दोहराया जा सकता है या
अगर,
तो मैं तुम्हें एक अतिरिक्त क्षेत्र है कि पी हो जाएगा शामिल हैं सुझाव है।

2

इस उत्तर को अपने लॉकिंग प्रश्न के साथ करना है: मुझे पता है, नया विषय होना चाहिए लेकिन जो भी हो। कृपया इसके लिए बस डाउनवोट न करें।

उदाहरण के लिए आप एक तालिका ऑर्डर_मेज_लॉक (गैलरी आईडी (प्राथमिक कुंजी), start_time बना सकते हैं)।

3 विधियां/स्पॉक्स बनाएं: गेटलॉक, चेक लॉक, ड्रॉप लॉक।

जब आप पोर्टफोलियो को पुन: व्यवस्थित करना चाहते हैं, तो आप GetLock को कॉल करते हैं जो (गैलरी_आईडी, sysdate) प्रविष्ट करता है।

यदि यह काम करता है, तो आप आगे बढ़ सकते हैं। यदि यह पीके पर विफल रहता है, तो कोई और पुन: व्यवस्थित होता है, अपवाद उठाता है।

जब आप पुन: व्यवस्थित करने के लिए तैयार हों, तो चेक लॉक को यह देखने के लिए कॉल करें कि क्या आपका लॉक अभी भी है (आप देखेंगे क्यों) यदि आपके पास है, तो पुनः प्राप्त मूल्यों को अपडेट करें, अगर गेटलॉक पर न जाएं।

जब आप पूरा कर लें, तो ड्रॉप लॉक रिकॉर्ड हटा देता है।

एक सर्वर प्रक्रिया x मिनट से अधिक ताले के लिए तालिका को साफ़ कर सकती है। डिस्कनेक्ट करने के लिए या स्क्रीन छोड़ने वाले लोग और दोपहर के भोजन के लिए सिर।

उस तालिका में user_id कॉलम भी जोड़ें, ताकि आप वापस रिपोर्ट कर सकें कि दूसरे उपयोगकर्ता को कौन सा ताला लगा सकता है।

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

+0

बहुत बहुत धन्यवाद !! मैं जल्द ही इस पर वापस आऊंगा। –

संबंधित मुद्दे

 संबंधित मुद्दे