跨应用程序处理自然 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
为了回答您关于它们是否被广泛使用的问题,它们是数据库开发人员工具包的主要部分,并且在某些情况下提供了显着的好处,这更多地与索引有关,而不是与视图的性质有关, 本身。
我正在开发一个现有的应用程序,该应用程序使用一些 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
为了回答您关于它们是否被广泛使用的问题,它们是数据库开发人员工具包的主要部分,并且在某些情况下提供了显着的好处,这更多地与索引有关,而不是与视图的性质有关, 本身。