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

Good practice for handling naturally JOINed results across an application

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

例如:

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

将产生一个类型的结果,比方说,ArticleWithUser 是显示带有作者详细信息的文章所必需的(例如博客 post)。

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

假设除 articles 之外的 table 包含不需要与其他 table 连接的整个对象,我可以简单地使用像 [=18 这样的动态生成的查询来提取它们=]

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?

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

谢谢!

对于胆小的人来说,一个视图可以像 table 一样。

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

视图可以包含 joins。和 other views。请记住,在创建时,它们会对当时在基础 table 上存在的列进行快照,因此 Alter Table 向这些 table 添加列的 stmts 是 not 在 select *.

中获得

一篇我认为需要阅读的旧文章 MySQL 观点: By Peter Zaitsev

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