2012-01-24 17 views
7

मैं डेटाबेस बनाने की कोशिश कर रहा हूं, जिसमें पारस्परिक रूप से निर्भर विदेशी कुंजी के साथ 2 टेबल हैं।mysql - परस्पर निर्भर विदेशी कुंजी

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

दूसरा तालिका जवाब कहा जाता है, यह सवालों के जवाब के बारे में जानकारी रखता है (यह हमारी दूसरी तालिका कहा जाता है जवाब देने के लिए एक विदेशी कुंजी होना चाहिए), और यह भी एक question_id क्षेत्र धारण करने के लिए की जरूरत है, इस प्रश्न का एक महत्वपूर्ण यह है कि यह जवाब जवाब देता है। यह पहली तालिका में भी एक विदेशी कुंजी है।

जब मैं टेबल बनाने का प्रयास करें, यह नहीं पहले एक, बना सकते हैं, क्योंकि यह एक दूसरे के बारे में पता नहीं है

(त्रुटि जब हम दूसरी तालिका के लिए विदेशी कुंजी जो अभी तक अस्तित्व में नहीं है की घोषणा करने की कोशिश)

यहाँ है कोड मैं उपयोग कर रहा हूँ:

create table question 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id) references answer(a_id), 
); 


create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

मैं इस समस्या का समाधान कैसे हो? धन्यवाद

+1

एक समान प्रश्न में मेरा उत्तर देखें: [? क्या एक दूसरे के 1 के लिए संदर्भ 1 के साथ तालिका में पंक्तियों को सम्मिलित करने के लिए सबसे अच्छा तरीका है] (http://stackoverflow.com/questions/6691366/mysql-database-design -इन्सर्टिंग-पंक्ति-इन-1to1-table/6692054 # 6692054) –

उत्तर

4

विदेशी कुंजी बाधा के बिना पहली तालिका बनाएं। फिर दूसरी सारणी बनाओ। अंत में, वापस जाएं और पहली तालिका को बदलें, जिससे विदेशी कुंजी बाधा अलग हो।

और एसक्यूएल जोड़ने के लिए विदेशी कुंजी इस तरह दिखेगा:

ALTER TABLE question 
ADD FOREIGN KEY (best_a_id) 
REFERENCES answer(a_id); 

बस उत्सुक, लेकिन क्यों दोनों तालिकाओं में सवाल करने के लिए इस सवाल का जवाब संबंध बनाए रखने? क्योंकि (जैसा कि यपरक्यूब बताता है) जब आपके पास सवाल पूछा जाता है तो आपके पास "सर्वश्रेष्ठ जवाब" नहीं होता है, फिर भी आपके डिज़ाइन की आवश्यकता होती है। उत्तर तालिका में उस संबंध को बनाए रखना संभवतः ओलिवियर की सिफारिश के समान ही बेहतर है।

+0

वाह !!!! बहुत बहुत धन्यवाद!!! =] –

+4

और फिर, आप पंक्तियों को कैसे सम्मिलित करेंगे? –

+1

@happy दोस्त: यह काम कर सकता है, केवल तभी जब 'question.best_a_id' को शून्य के रूप में सेट किया गया हो। –

3

उत्तर तालिका में एक ध्वज जोड़ें।

create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
    best_answer  numeric(1) default 0 not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

और प्रश्न तालिका से best_a_id हटा दें।

+0

यह एक बेहतर दृष्टिकोण है लेकिन मुश्किल बात यह सुनिश्चित करना है कि प्रत्येक प्रश्न के लिए केवल एक ही जवाब सबसे अच्छा है। मुझे पता है कि ओरेकल डीबीएमएस के साथ ऐसा कैसे करें लेकिन मुझे नहीं लगता कि MySQL फ़ंक्शन-आधारित इंडेक्स का समर्थन करता है, अद्वितीय या अन्यथा। – APC

+2

बुरा नहीं है, लेकिन मेरे पास एक best_answer तालिका होगी। –

+0

आप उसी प्रश्न_आईडी के साथ अन्य उत्तरों के ध्वज को साफ़ करने के लिए एक अद्यतन अद्यतन ट्रिगर का भी उपयोग कर सकते हैं। –

5

question.best_a_id से छुटकारा पर विचार हो रही है और, बजाय, एक best_answers तालिका जोड़ने:

create table best_answers 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id, q_id) references answer(a_id, q_id) 
); 

क्या तुमने कभी किसी प्रश्न (शायद एक टाई) के लिए एक सर्वश्रेष्ठ उत्तर की तुलना में अधिक है चाहते हैं, तो best_a_id जोड़ने प्राथमिक कुंजी के लिए कॉलम भी।

+0

मैंने संदर्भों को सही ढंग से प्रतिबिंबित करने के लिए आपका उत्तर संपादित किया। –

+0

धन्यवाद, @ypercube –

+0

MySQL में, '(a_id, q_id)' पर तालिका 'answer' में' अद्वितीय कुंजी 'की भी आवश्यकता होगी। –

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