2010-06-17 12 views
5

मेरे पास एक सूची प्रबंधन appliaction है जो अपने डेटा को कई से अधिक रिलेशनशिप डेटाबेस में संग्रहीत करता है।एक्सएमएल या अन्य साधारण फ़ाइल प्रारूप में कई से कई रिश्तों का प्रतिनिधित्व कैसे करें?

आईई। एक नोट किसी भी सूची में हो सकता है, और एक सूची में कई नोट्स हो सकते हैं।

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

अब एक नोट जो कई सूचियों में है, डीबी में दो समान पंक्तियों में विभाजित है और उनके बीच सभी संबंध खो गए हैं।

प्रश्न: मैं एक साधारण, मानक फ़ाइल प्रारूप में इस से कई रिश्तों का प्रतिनिधित्व कैसे कर सकता हूं? (अधिमानतः एक्सएमएल अनुकूलता पीछे की ओर बनाए रखने के लिए)

उत्तर

6

मुझे लगता है कि आपके एक्सएमएल प्रारूप को किसी प्रकार के "संदर्भ" का उपयोग करना चाहिए। आप सूची करने के लिए नोट्स संबंध चाहें, तो दिखाई दे सकता है, तो निम्नलिखित की तरह कुछ उपयुक्त हो सकते हैं:

<notes> 
    <note id="Note1"> ... </note> 
    <note id="Note2"> ... </note> 
    ... 
</notes> 

<lists> 
    <list id="List1"> 
     <note_refs> 
      <note_ref id="Note1"/> 
      <note_ref id="Note4"/> 
     </note_refs> 
    </list> 
    ... 
</lists> 

दूसरी ओर आप आसानी से किसी दिए गए नोट से संबद्ध सूचियों को देखने के लिए चाहते हैं, तो आप मेरे उदाहरण में सूचियों और नोट्स की भूमिकाओं को आसानी से बदल सकता है।

वैकल्पिक रूप से, आप कई से अधिक रिश्तों को गणितीय संबंध के रूप में अधिक समरूप रूप से प्रस्तुत कर सकते हैं: सभी नोट्स को परिभाषित करें, सभी सूचियों को परिभाषित करें, और उसके बाद [सूची संदर्भ, नोट संदर्भ] जोड़े वाले मैपिंग को परिभाषित करें।

<notes> 
    <note> 
    <title>Groceries to get</title> 
    <list>shopping</list> 
    <list>urgent</list> 
    <body>eggs, cheese, milk</body> 
    </note> 
</notes> 

चाहेंगे कि अपनी आवश्यकताओं फिट:

+1

अंतिम सुझाव यहां बताया गया है कि डेटाबेस कितने रिलेशनल करेंगे: आप दो टेबल, "नोट्स" और "सूचियां" परिभाषित करते हैं और फिर एक साथ तालिका में शामिल होते हैं प्राथमिक नोट (और संभवतः केवल डेटा) के रूप में "नोटआईडी", "listId"। यहां समस्या यह है कि अधिकांश एक्सएमएल आधारित समाधान ऐसी चीजों को क्वेरी करने में कठोर बना देंगे जो एक संबंधपरक डेटाबेस होगा। अगर मुझे एक्सएमएल का उपयोग करने के लिए मजबूर किया गया था तो मैं "note_ref" दृष्टिकोण से चिपकेगा (यह मानते हुए कि सूचियां डिस्प्ले ड्राइव करती हैं और नोट्स कुछ ऐसी चीज हैं जो आप स्मृति में रख सकते हैं)। अन्यथा मैं डेटाबेस में स्विच और टेबल में शामिल हो जाऊंगा। एक्सएमएल कुछ चीजों के लिए बहुत अच्छा है, लेकिन हर चीज नहीं। – Godeke

+0

@Godeke डेटा पहले से ही एक संबंधपरक डेटाबेस में संग्रहीत है। यह बस एक निर्यातित फ़ाइल प्रारूप है। – CodeFusionMobile

+0

@CSharperWithJava उस स्थिति में 99% मेरी टिप्पणी को हल किया गया है और मैं बस सहमत हूं कि उपरोक्त नोट_आरफ दृष्टिकोण आपको यह सुनिश्चित करने की अनुमति देगा कि आप मूल की विस्तृत संरचना खो नहीं पाएंगे (तथ्य नोट एकवचन इकाइयां थीं जो कि उससे जुड़ी थीं)। – Godeke

0

एक ही रास्ता मैं के बारे में सोच सकते हैं सही मायने में एक एक्सएमएल, या किसी अन्य सौपानिक संरचना में अनेक-से-अनेक संबंध का प्रतिनिधित्व करने के लिए, कई एक-से-कई रिश्तों को उपयोग करने के लिए है ।

<list name="listA"> 
    <notes name="noteA" /> 
    <notes name="noteB" /> 
    <notes name="noteC" /> 
</list> 
<list name="listB"> 
    <notes name="noteB" /> 
    <notes name="noteC" /> 
    <notes name="noteD" /> 
</list> 

दूसरे शब्दों में, प्रत्येक सूची बच्चे नोड्स के रूप में अपने नोट्स होगा:

यहाँ एक सरल उदाहरण है।

कई नोट्स बच्चे नोड्स को XML फ़ाइल में डुप्लिकेट किया जाएगा। XML फ़ाइल से डेटाबेस को पॉप्युलेट करने वाली प्रक्रिया को बच्चे नोड्स को डुप्लिकेट नोट्स लेना होगा।

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

+0

यह वही है जो मैं पहले से ही करता हूं। मेरे पास प्रत्येक सूची है और फिर उस सूची में प्रत्येक नोट उस सूची के तत्व के रूप में है। मेरी समस्या डुप्लिकेट नोट्स नहीं है, जब मैं कई से अधिक रिश्तों को खो देता हूं तो यह जानकारी का नुकसान होता है। – CodeFusionMobile

+0

@CSharperWithJava: मुझे नहीं पता कि आप कौन सी जानकारी खो रहे हैं। किसी भी नोट में बच्चे के एक से अधिक सूची माता-पिता हो सकते हैं। यह नोट करता है कि बच्चे को उन सभी सूचियों के बच्चे के रूप में सूचीबद्ध किया जाएगा जिनके साथ इसका रिश्ता है। –

+0

मैं यह नहीं मान सकता कि दो समान नोट तत्व वास्तव में एक ही नोट हैं। आपके उदाहरण में, नोटबुक दोनों सूचियों में एक ही नोट हो सकता है, जबकि नोटसी वास्तव में दो अलग-अलग नोट्स हैं। – CodeFusionMobile

0

मेरा पहला कदम कुछ सरल हो सकता है?

3

डेटाबेस में, कई से अधिक रिश्तों का प्रतिनिधित्व करने के लिए टूल एक एसोसिएशन टेबल है। तालिका में प्रत्येक पंक्ति दो वस्तुओं के बीच एक एसोसिएशन का प्रतिनिधित्व करता है।इस प्रकार यदि 1, 2, और 3 की आईडी के साथ सूची में 1 प्रकट होता है की एक आईडी के साथ एक नोट, वहाँ संघ तालिका में तीन पंक्तियों होगा:

ID NoteID ListID 
-- ------ ------ 
    1  1  1 
    2  1  2 
    3  1  3 

आप एक नोट और इससे संबंधित सभी सूचियों को प्राप्त कर सकते हैं इस तरह एक प्रश्न के साथ:

SELECT [columns] FROM Association 
    JOIN Notes ON Note.ID = Association.NoteID 
    JOIN Lists ON List.ID = Association.ListID 
WHERE Association.NoteID = @NoteID 

और यह सब एक सूची के लिए नोट:

SELECT [columns] FROM Association 
    JOIN Notes ON Note.ID = Association.NoteID 
    JOIN Lists ON List.ID = Association.ListID 
WHERE Association.ListID = @ListID 

है यही कारण है कि आप इसे कैसे एक्सएमएल में प्रतिनिधित्व चाहते हैं:

<Lists> 
    <List ID='1'>...</List> 
    <List ID='2'>...</List> 
    <List ID='3'>...</List> 
    ... 
<Lists> 
<Notes> 
    <Note ID='1'>...</Note> 
</Notes> 
<Associations> 
    <Association ID='1' NoteID='1' ListID='1'/> 
    <Association ID='2' NoteID='1' ListID='2'/> 
    <Association ID='3' NoteID='1' ListID='3'/> 
</Associations> 

में, XSLT, तो आप इस तरह इस संघ पहुंच सकता है:

<xsl:template match="List" mode="AssociatedNotes"> 
    <xsl:variable name="Associations" select="/*/Associations/Association[@ListID=current()/@ID]"/> 
    <xsl:apply-templates select="/*/Notes[@ID=$Associations/@NoteID]"/> 
</xsl:template> 

<xsl:template match="Note" mode="AssociatedLists"> 
    <xsl:variable name="Associations" select="/*/Associations/Association[@NoteID=current()/@ID]"/> 
    <xsl:apply-templates select="/*/Lists[@ID=$Associations/@ListID]"/> 
</xsl:template> 

(mode विशेषता के उपयोग के लिए एक दूसरे को कॉल करने से इन खाकों रखने के लिए ध्यान दें जब तक आप एक ढेर अतिप्रवाह मिलता है।)

0

बस इसे इस तरह करें:

<notes> 
    <note id="1"> 
     <name>George</name> 
     <text>1984</text> 
     <notesLinks> 
      <listId id="1"/> 
     </notesLinks> 
    </note> 
    <note id="2"> 
     <name>George</name> 
     <text>animal farm</text> 
     <notesLinks></notesLinks> 
    </note> 
</notes> 
<lists> 
    <list id="1"> 
     <notesLinks> 
      <noteId id="1"/> 
      <noteId id="2"/> 
     </notesLinks> 
     <name>some info</name> 
    </list> 
</lists> 
संबंधित मुद्दे