2009-03-24 20 views
6

मेरा डेटाबेस डिज़ाइन पहले से ही रैखिक रहा है, इसलिए मैं समस्या हल करने के लिए शायद बहुत आसान है पर स्टंप हो रहा हूं।एकाधिक विदेशी कुंजी

मेरे पास "POSTS" की एक तालिका है, जिसमें ऐसी पोस्टें हैं जो "कैटेगरी" या "TOPIC" का बच्चा हो सकती हैं। "POSTS" तालिका के लिए विदेशी कुंजी को परिभाषित करने का सबसे अच्छा तरीका क्या होगा?

मैं मैं एक स्तंभ POST_CATEGORY_ID नाम और एक क्षेत्र "POST_TOPIC_ID नाम है, जो व्यर्थ हो सकता है हो सकता है लगता है, लेकिन यह सिर्फ सही ध्वनि नहीं करता है। निश्चित रूप से वहाँ एक सरल उपाय है कि मैं याद कर रहा हूँ है!

उत्तर

2

आप कई-से-अनेक पोस्ट और श्रेणी और पोस्ट और विषय के बीच संबंधों को कर सकता है के लिए एक एकल विदेशी कुंजी:

POST 
---- 
ID 
Text ... 
... 

CATEGORY 
-------- 
ID 
Name 

TOPIC 
----- 
ID 
Name 

POST_CATEGORY 
------------- 
POST_ID (FK) 
CATEGORY_ID (FK) 

POST_TOPIC 
---------- 
POST_ID (FK) 
TOPIC_ID (FK) 

इस तरह, एक पोस्ट किसी भी श्रेणी और विषयों से जुड़ा जा सकता है।

+0

यह कम से कम एक मध्यस्थ तालिका परिप्रेक्ष्य से अधिक एक्स्टेंसिबल लगता है, लेकिन क्या यह सिर्फ पोस्टस्ट टेबल से मेरे नलिका कॉलम नहीं ले रहा है और उनमें से एक नई तालिका बना रहा है? –

+0

मुझे लगता है कि यदि आप ऐसा करते हैं तो आपको किसी भी नाखून की आवश्यकता नहीं होगी। यदि रिश्ते मौजूद हैं –

+0

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

1

मुझे लगता है कि एक विदेशी कुंजी घोषणा केवल एक ही तालिका देखें कर सकते हैं:

FOREIGN KEY(CATEGORY_ID) REFERENCES CATEGORY(CATEGORY_ID); 
FOREIGN KEY(TOPIC_ID) REFERENCES TOPIC(TOPIC_ID); 

अगर मैं सही हूँ, आप दो विदेशी कुंजी, विषय के लिए श्रेणी तालिका के लिए और दूसरा है करने के लिए होगा, और दोनों की जरूरत शून्य होने के लिए।

4

आप सही रास्ते पर हैं एच nullable POST_CATEGORY_ID और POST_TOPIC_ID फ़ील्ड। यह मॉडल करेगा कि एक पोस्ट वैकल्पिक रूप से एक श्रेणी से संबंधित है और वैकल्पिक रूप से किसी विषय से संबंधित है।

यदि यह अनन्य और अनिवार्य होना है, तो आपको एक चेक बाधा जोड़ने की आवश्यकता होगी जो कि शून्य है, लेकिन दोनों नहीं।

+0

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

0

विरासत का उपयोग करने का सबसे अच्छा तरीका है। आप "पोस्ट" के दो विशेषज्ञताओं होगा:

"category_id" ("Posts_Category": "Posts_Category" और "Posts_Topic" दोनों "post_id" और एक अन्य क्षेत्र (जो माता-पिता तालिका "पोस्ट" से संबंधित है) है)

"Topic_ID" ("Posts_Topic")

इस लगता है अपनी दस्तावेज़ीकरण में सिद्धांत (पीएचपी ORM) पर नज़र भ्रमित: http://www.doctrine-project.org/documentation/manual/1_0/en/inheritance

0

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

1

कैसे एक ही मेज

तालिका topics_categories बनाने में श्रेणियां और विषय होने के बारे में ( आईडी नंबर, वर्णन varchar2 (100), item_type चार (1)); --C या टी

फिर topics_categories

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