在一个数据库中,代表许多一对多的关系,该工具是一个关联表。表中的每一行代表两个对象之间的关联。因此,如果在列表中的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