我发现这方面的信息/意见少得惊人。
序列化是否最好直接发生在 sql(在本例中为 postgresql)层(选择特定列),还是首先获取整个记录(所有列)然后在应用程序中格式化数据在性能方面是否完美层?
在 NodeJS 打字稿场景中,我个人喜欢通过简单的功能 util 函数在应用程序层上进行序列化,并使用某些 TS 接口准确定义最终数据的样子。在我看来,这种方法非常轻量级和模块化,但是,我想知道是否存在不建议这样做的情况?
如果我们获取 100 条记录有什么关系吗?如果每行有 100 列,这会重要吗?我的理解是,数据库的主要负担是实际获取数据、基于复杂过滤器的查询和连接,或者它是否也会对每条记录查询多少列产生明显的影响?
给出一个易于理解的代码示例:
const user = await User.findOne({ where: { email }, attributes: ['email', 'username', 'id'] });
// which will be converted to:
SELECT email, username, id FROM users WHERE email = 'some email';
与
const user = await User.findOne({ where: { email } });
// which will be converted to:
SELECT * FROM users WHERE email = 'some email';
// serialization happens afterwards on the backend app layer
const serializedUser = serializeUser(user);
我猜当你说“序列化”时你的意思是“项目”。
如果您始终获取所有列而不是仅获取所需的列,则会对数据库性能产生负面影响。这有几个原因:
需要通过网络传输更多数据
PostgreSQL 必须分解(“变形”)整个表行,并且在最后一个所需列之后无法停止
PostgreSQL 无法跳过 de-toast 压缩或存储脱线的大型属性
PostgreSQL 没有机会消除不必要的连接(如果您的查询中有任何连接)