GORM 使用边界:预加载、N+1 与事务

Article

GORM 使用边界:预加载、N+1 与事务

管理员技术分享126 阅读

GORM 使用边界:预加载、N+1 与事务

GORM 很适合博客这种模型清晰的业务,但列表接口一旦 「Preload」 失控,延迟会悄悄爬升。

N+1 典型场景

文章列表循环里取标签 / 作者,若未预加载,就会变成 1 + N 次查询。

db.Preload("Tags").Preload("Author").
  Where("status = ?", "published").
  Order("published_at desc").
  Limit(pageSize).Find(&articles)

详情页可以多 Preload;列表页只加载展示所需字段。

事务

创建文章 + 绑定标签应在同一事务中,避免「文章成功、标签失败」的半成品数据。

软删除与唯一索引

若启用软删除,唯一索引要考虑 「deleted_at」,否则「删除后再建同 slug」会冲突。博客 slug 建议硬约束唯一,删除即释放或改名归档。

小结

把「这一页需要哪些关联」写进接口设计,而不是默认 「Preload」 一切。

评论

暂无评论,来聊聊这篇文章吧。