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

时间:2010-06-15 13:57:57

标签: php sql xml

所有

提前抱歉这个含糊不清的标题。

这就是我要做的......

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

为了简化,我们假设这些项目是书籍。每本书都有以下属性:ISBN,标题,作者,价格。每本书也有0到n条评论

因此,数据存储在2个表中:“book_info”和“book_reviews”。每本书在“book_info”中有一行,在“book_reviews”中有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文档。但是如何获得评论呢?

一个显而易见的解决方案是:每次交互,在该行中获取isbn for book,然后再次查询数据库:

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

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

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

所以,第二个想法就是:

  1. 使用一个查询选择与搜索匹配的所有图书
  2. 构建XML文档
  3. 对“book_reviews”执行一个查询以检索步骤1中所有图书的所有评论(例如,“从book_reviews中选择评论isbn in([isbn]列表”))
  4. 遍历该结果集;对于每次审核,找到它对应的书籍的XML节点,并附加子节点
  5. 这意味着只需要两个SQL查询,但需要搜索XML文档。

    最终,这些看起来都有点不雅观。由于这似乎是一个常见的问题,我希望它有一个很好的,优雅的解决方案。

    对于它的价值,我使用SQL Server和PHP来执行查询并组装XML文档。

    非常感谢任何指导和见解。

    干杯, 马特

1 个答案:

答案 0 :(得分:2)

如果您使用的是Microsoft SQL Server,则可以使用FOR XML子句为您生成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