Trong cơ sở dữ liệu, công cụ để biểu diễn các mối quan hệ nhiều-nhiều là bảng kết hợp. Mỗi hàng trong bảng biểu diễn một liên kết giữa hai đối tượng.Vì vậy, nếu một lưu ý với một ID trong tổng số 1 xuất hiện trong danh sách với ID trong tổng số 1, 2, và 3, sẽ có ba hàng trong bảng hiệp hội:
ID NoteID ListID
-- ------ ------
1 1 1
2 1 2
3 1 3
Bạn có thể nhận được một lưu ý và tất cả các danh sách liên quan của nó với một truy vấn như thế này:
SELECT [columns] FROM Association
JOIN Notes ON Note.ID = Association.NoteID
JOIN Lists ON List.ID = Association.ListID
WHERE Association.NoteID = @NoteID
Và tất cả các ghi chú cho một danh sách:
SELECT [columns] FROM Association
JOIN Notes ON Note.ID = Association.NoteID
JOIN Lists ON List.ID = Association.ListID
WHERE Association.ListID = @ListID
đó là cách bạn muốn thể hiện nó trong 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>
Trong, XSLT, bạn có thể truy cập liên kết này như thế này:
<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>
(Lưu ý việc sử dụng các thuộc tính mode
để giữ những mẫu này từ gọi nhau cho đến khi bạn có được một stack overflow).
Nguồn
2010-06-18 19:07:37
Đề xuất cuối cùng ở đây là cơ sở dữ liệu quan hệ sẽ làm như thế nào: bạn xác định hai bảng, "ghi chú" và "danh sách" và sau đó tham gia bảng "noteId", "listId" làm khóa chính (và chỉ có thể là dữ liệu). Vấn đề ở đây là hầu hết các giải pháp dựa trên XML sẽ làm cho những điều khó khăn hơn để truy vấn rằng một cơ sở dữ liệu quan hệ sẽ. Nếu tôi bị buộc phải sử dụng XML, tôi sẽ gắn bó với cách tiếp cận "note_ref" (giả sử rằng danh sách lái xe màn hình và ghi chú là thứ bạn có thể giữ trong bộ nhớ). Nếu không, tôi sẽ chuyển sang cơ sở dữ liệu và tham gia các bảng. XML là tuyệt vời cho một số thứ, nhưng không phải mọi thứ. – Godeke
@Godeke Dữ liệu được lưu trữ trong cơ sở dữ liệu quan hệ. Đây chỉ là định dạng tệp đã xuất. – CodeFusionMobile
@CSharperWithJava Trong trường hợp đó 99% nhận xét của tôi là mooted và tôi sẽ đơn giản đồng ý rằng phương pháp Note_Ref ở trên sẽ cho phép bạn đảm bảo rằng bạn không bị mất cấu trúc chi tiết của bản gốc (ghi chú thực tế là các thực thể đơn lẻ có liên quan đến). – Godeke