在一個數據庫中,代表許多一對多的關係,該工具是一個關聯表。表中的每一行代表兩個對象之間的關聯。因此,如果在列表中的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
屬性,以保持這些模板從稱呼對方,直到你得到一個堆棧溢出。)
這裏的最後一個建議是關係數據庫如何實現它:您定義兩個表,「註釋」和「列表」,然後定義一個連接表「noteId」,「listId」作爲主鍵(可能只有數據)。 這裏的問題是,大多數基於XML的解決方案都會使得查詢關係數據庫時遇到的困難。如果我被迫使用XML,我會堅持使用「note_ref」方法(假設列表驅動顯示器,並且註釋可以保存在內存中)。 否則我會切換到數據庫並連接表。 XML對於某些事情是很好的,但不是每一件事。 – Godeke 2010-06-17 22:45:26
@Godeke數據已存儲在關係數據庫中。這只是一個導出的文件格式。 – CodeFusionMobile 2010-06-17 23:02:36
@CSharperWithJava在這種情況下,我的評論中有99%被提出,我只是同意上面的Note_Ref方法可以讓你確保你不會丟失原始的細節結構(事實記錄是被鏈接到)。 – Godeke 2010-06-18 20:30:04