代码之家  ›  专栏  ›  技术社区  ›  mattstuehler

用于从具有1:many关系的数据库查询创建XML文档的设计模式

  •  0
  • mattstuehler  · 技术社区  · 16 年前

    全部,

    提前为这个模棱两可的标题道歉。

    这就是我想做的。。。

    我正在开发一个需要查询数据库以获取项目列表的应用程序。该项列表将被格式化为XML文档,并返回到查询前端。

    为了简化,假设这些项目是书。每本书都有以下属性:ISBN、书名、作者、价格。每本书也有0到n个评论

    我希望返回的XML如下所示:

    <books>
        <book isbn='xxxxxx' title='abcde' author='xzy' price='99.99'>
            <review>blah, blah, blah</review>
        </book>
        <book isbn='xxxxxx' title='abcde' author='xzy' price='99.99'>
            <review>blah, blah, blah</review>
            <review>blah, blah, blah</review>
            <review>blah, blah, blah</review>
        </book>
        <book isbn='xxxxxx' title='abcde' author='xzy' price='99.99' />
    </books>
    

    如你所见,第一本书有一篇评论,第二本有三篇,第三本没有。

    例如,我可以得到如下书籍列表:

    Select isbn, title, author, price from book_info where title like "%learn to%"
    

    通过遍历结果集,我可以构建XML文档。但是我怎样才能得到评论呢?

    select review from book_review where book_review.isbn = [the current isbn]
    

    通过迭代这个“sub”结果集,我可以将子“review”节点添加到当前book节点。

    问题是,如果初始结果集中有100本书,我必须运行100个SQL命令来查找所有的评论。

    1. 选择与一个查询匹配的所有书籍
    2. 构建XML文档
    3. 对“book\u reviews”执行一个查询,以检索步骤1中所有书籍的所有评论(例如,“select review from book\u reviews where isbn in([isbn列表])”)

    这意味着只需要两个SQL查询,但要搜索XML文档。

    最终,这两个似乎都有点不雅。既然这似乎是一个常见的问题,我希望有一个很好的,优雅的解决方案。

    值得一提的是,我使用sqlserver和PHP执行查询并组装XML文档。

    非常感谢您的指导和洞察。

    干杯, 马特

    1 回复  |  直到 16 年前
        1
  •  2
  •   Tom H zenazn    16 年前

    如果您使用的是microsoftsqlserver,那么可以使用forxml子句让它为您生成XML。如果您试图获得精确的格式,那么使用方法可能会有点棘手,但它的用途相当广泛。

    如果你真的,真的需要自己生成它,那么只需使用一个单一的选择,并加入书评。如果有人还没有用PHP中的结果集功能编写某种XML生成器,我会有点惊讶。

    SELECT
        BI.isbn,
        BI.title,
        BI.author,
        BI.price,
        BR.review
    FROM
        Book_Info BI    -- It's usually considered bad form to name a table suffixed with "Info" or "Data". Just "Books" would be better
    LEFT OUTER JOIN Book_Reviews BR ON BR.isbn = BI.isbn
    WHERE
        BI.title LIKE '%learn to%'
    ORDER BY
        BI.isbn