在应用程序中处理自然JOINed结果的良好实践

时间:2015-06-06 00:02:29

标签: php mysql database join database-design

我正在使用一些现有的应用程序,它使用一些JOIN语句来创建" immutable"对象(即结果总是JOIN来创建一个可处理的对象 - 只有一个表的结果将毫无意义)。

例如:

SELECT r.*,u.user_username,u.user_pic FROM articles r INNER JOIN users u ON u.user_id=r.article_author WHERE ...

会产生类型的结果,让我们说,ArticleWithUser是显示带有作者详细信息的文章所必需的(如博客文章)。

现在,我需要制作一个包含featured_items列(文章,文件,评论等)和item_type列的item_id表(文章' s,文件& #39; s或评论的ID),并查询它以获取某种类型的特色项目列表。

假设articles以外的表包含不需要与其他表一起使用的整个对象,我可以使用动态生成的查询来拉动它们,例如

SELECT some_table.* FROM featured_items RIGHT JOIN some_table ON some_table.id = featured_items.item_id WHERE featured_items.type = X

但是,如果我需要从上述类型ArticleWithUser中获取特色项目,该怎么办?我不能使用动态生成的查询,因为语法不适合两个JOIN。

所以,我的问题是:有没有更好的做法来检索总是组合在一起的结果?也许在应用程序端进行第二次JOIN?

或者我是否必须为每种组合结果类型编写特殊代码?

谢谢!

2 个答案:

答案 0 :(得分:1)

一个视图可以像一张胆小的人的桌子一样。

https://dev.mysql.com/doc/refman/5.0/en/create-view.html

观看次数可以包含joins。和other views。请记住,在创建时,他们会在基础表上拍摄当时存在的列的快照,因此Alter Table stmts向这些表中添加列{select>在{*}}中选择。

答案 1 :(得分:1)

我认为需要阅读MySQL视图主题的旧文章: By Peter Zaitsev

要回答关于它们是否被广泛使用的问题,它们是数据库开发人员工具包的主要部分,并且在某些情况下提供了显着的好处,这些好处与索引有关,而不是与视图的性质有关,本身