2012-11-21 16 views
5

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

Comments: 
• Id 
• Title 
• Text 

    Replies: 
• Id 
• Title 
• Text 
• Comment id 

अग्रिम धन्यवाद।

+0

आप डिज़ाइन सामान्यीकृत हैं, तो आप इसके साथ आगे बढ़ सकते हैं। आपके पास एक उपयोगकर्ता आईडी होना चाहिए जो दोनों टेबलों में निर्माता की आईडी होगी। दूसरे उत्तर के लिए उत्तर दें एक तार्किक परिदृश्य है, इसका कार्यान्वयन ऐसा है जैसे आपके पास एक स्थिति है जिस पर लोग –

+0

उपयोगकर्ता आईडी का जवाब देते हैं? संदर्भित 'उपयोगकर्ता' कहां है? – mcalex

उत्तर

11

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

आप रिकॉर्ड के अभिभावक रिकॉर्ड (का निरीक्षण अभिभावक) से पूछ सकते हैं कि यह उत्तर किसी टिप्पणी या उत्तर के लिए है या नहीं।

संपादित करें: उपरोक्त एक काफी व्यावहारिक समाधान है। हालांकि, सामान्यीकृत संस्करण के साथ जाने के लिए, अभी भी एक टिप्पणियाँ तालिका (बिना किसी अभिभावक के) रखें, और एक उत्तर दें तालिका जिसमें एक टिप्पणी आईडी है, और एक ResponseID, दोनों टिप्पणियाँ तालिका में रिकॉर्ड्स की आईडी हैं।

इस विचार का उपयोग करना, निम्नलिखित एसक्यूएल टिप्पणियों और प्रत्येक जबाब एक टिप्पणी है कि के लिए प्रत्येक टिप्पणी के लिए 'जबाब' दिखाएगा:

select c.comment, r.comment as reply 
from comment as c, comment as r, replyto as rt 
where c.ID = rt.CommentID 
and r.ID = rt.ReplyID 

Dimitrii बताते रूप में, यह के साथ टिप्पणी प्रदर्शित नहीं करेगा कोई जवाब नहीं - इसके लिए आपको बाहरी जॉइन क्वेरी की आवश्यकता है (सिंटैक्स का परीक्षण नहीं किया गया है):

SELECT c.comment, r.comment as reply, 
from Comment c 
    left outer join Comment r on c.id = r.id 
    left outer join replyto rt on rt.responseid = r.id 
+0

वह कर सकता है, लेकिन उसका डिजाइन अधिक सामान्य है ... –

+1

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

+0

धन्यवाद एलेक्स, मुझे लगता है कि दोनों समाधान अच्छे काम करेंगे, लेकिन आपके अनुभव में आपको कौन सा लगता है कि बेहतर समग्र प्रदर्शन प्रदान करेगा? – grasshopper

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