Article
GORM 使用边界:预加载、N+1 与事务
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」 一切。