2010-06-17 33 views
5

我有一個列表管理應用程序,它將數據存儲在多對多關係數據庫中。如何用XML或其他簡單文件格式表示多對多關係?

I.E.記錄可以在任何數量的列表中,並且列表可以具有任意數量的記錄。

我還可以將此數據導出到與XML文件並導入它在我的應用程序的另一個實例,爲用戶之間共享列表。但是,這是基於遺留系統,其中列表關注是一對多(對於XML的理想選擇)。

現在需要注意的是在多個列表中esentially分成在DB兩個相同的行和它們之間的所有關係都將丟失。

問:我怎麼能代表一個簡單的,標準的文件格式,這許多一對多的關係? (最好使用XML來保持向後兼容性)

回答

6

我認爲你的XML格式必須使用某種「引用」。如果你喜歡該列表對票據關係是可見的,那麼像下面這樣可以適合:

<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> 

如果在另一方面,你希望看到輕鬆地與給定的音符相關聯的列表,然後你可以在我的示例中簡單地顛倒列表和筆記的角色。

或者,你可以更對稱代表許多一對多關係的數學關係:定義所有的筆記,定義所有的列表,然後定義包括一個映射[列表參考,請參考]對。

+1

這裏的最後一個建議是關係數據庫如何實現它:您定義兩個表,「註釋」和「列表」,然後定義一個連接表「noteId」,「listId」作爲主鍵(可能只有數據)。 這裏的問題是,大多數基於XML的解決方案都會使得查詢關係數據庫時遇到的困難。如果我被迫使用XML,我會堅持使用「note_ref」方法(假設列表驅動顯示器,並且註釋可以保存在內存中)。 否則我會切換到數據庫並連接表。 XML對於某些事情是很好的,但不是每一件事。 – Godeke 2010-06-17 22:45:26

+0

@Godeke數據已存儲在關係數據庫中。這只是一個導出的文件格式。 – CodeFusionMobile 2010-06-17 23:02:36

+0

@CSharperWithJava在這種情況下,我的評論中有99%被提出,我只是同意上面的Note_Ref方法可以讓你確保你不會丟失原始的細節結構(事實記錄是被鏈接到)。 – Godeke 2010-06-18 20:30:04

0

我能想到的真正代表XML或其他任何層次結構中的多對多關係的唯一方法是使用許多一對多關係。

這裏有一個簡單的例子:

<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文件填充數據庫的過程必須考慮到重複的子節點記錄。

另一種選擇是爲每個筆記選擇一個列表。一個便箋將只是其中一個清單的子節點。好處是沒有任何重複的筆記。缺點是XML文件不能正確表示關於列出關係的註釋,這可能也可能不重要。

+0

這就是我已經做的。我有每個列表,然後列表中的每個音符作爲該列表的一個元素。我的問題不是重複的筆記,而是當我失去多對多關係時丟失的信息。 – CodeFusionMobile 2010-06-17 23:04:37

+0

@CSharperWithJava:我不明白你輸的是什麼信息。任何便籤小孩都可以有多個列表父項。該筆記將被列爲與其有關係的所有列表中的孩子。 – 2010-06-17 23:34:27

+0

我不能認爲兩個相同的音符元素實際上是相同的音符。在你的例子中,兩個noteB都可以是兩個列表中的同一個音符,而noteC實際上是兩個不同的音符。 – CodeFusionMobile 2010-06-18 02:10:11

0

我的第一個步驟將是一些簡單:滿足您需求的

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

會?

3

在一個數據庫中,代表許多一對多的關係,該工具是一個關聯表。表中的每一行代表兩個對象之間的關聯。因此,如果在列表中的1次出現的ID爲1,2,3 ID的音符,將有三排的關聯表:

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 

這就是你如何代表它在XML:

<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> 
相關問題