假设我有两个表:users
和tweets
。我想显示完整的用户个人资料,以及按 ID 列出的最新推文。
在两个单独的、可能并发/并行的调用中获取它们是否更好?在 JS 中将是:
const result = await Promise.all(
query(`SELECT * FROM users WHERE id = 1`),
query(`SELECT * FROM tweets WHERE user_id = 1`)
);
const profile = result[0];
const tweets = result[1];
或者
进行一个查询,简单连接并从数组的第一个元素检索用户数据?例如
// pseudo code
const tweets = await query(`
SELECT * FROM users
JOIN tweets
ON users.id = tweets.id
WHERE users.id = 1`)
if (tweets.length > 0) {
const { username, avatar } = tweets[0]; // reading any column to get user data
}
第二个查询是否只是浪费带宽,因为用户数据是在每一列上复制的?
不知何故,我一直认为进行多个 sql 调用是不好的做法,即使在如此简单的场景中,我也不知道我是否使事情变得过于复杂。
如果您计划在数据库外部将数据连接在一起,那么通常让数据库进行连接会更有效,因为数据库非常擅长确定处理数据操作的最佳方式。
相反,如果您计划在应用程序上将数据分开,那么并行运行两个查询可能会更快(从应用程序的角度来看)。特别是如果您将应用程序的 UI 设计为异步显示数据,则页面的一部分会在等待其余数据的同时开始加载。
您的
users
表可能没有很多大的数据类型字段,因此在这种特定情况下带宽可能几乎可以忽略不计。User Profile
听起来您的数据将在/页面上彼此分开Tweets
,因此后一种设计可能会稍微好一些,特别是对于User
有很多Tweets
. 但是,如果您开始实现需要将数据连接在一起的其他页面和功能(例如User
每行重复信息的 CSV 导出Tweet
),那么从性能角度甚至只是简化的代码角度来看,这可能是有意义的在数据库层进行连接。