← 中文资源

简体中文版本

以每租户一个 Schema 隔离租户

为每个租户提供独立数据库 schema,按租户路由连接,并对所有 schema 执行迁移,使隔离不成为迁移负担。

阅读英文原文

概述

每租户一个 Schema 以比租户列更少的应用代码获得强隔离,代价是大量 schema 待迁移和连接待管理。必须从第一天就自动化这两件事,否则模型将难以维护。

关键步骤

  1. 为每个租户创建一个 schema,并把映射存入注册表。
  2. 在连接取出时按解析出的租户设置 search_path。
  3. 在受控循环中为每个 schema 各跑一次迁移。
  4. 用测试验证隔离:以一个租户身份查询并断言读不到他人数据。

验证

  • 每个租户恰好一个 schema。
  • 一个连接只能读取自身租户的 schema。
  • 所有 schema 处于同一迁移版本。
  • 缺少 WHERE 的查询会因隔离测试而失败。

注意事项

  • 租户增多后,schema 模式会放大迁移与连接开销。
  • 数据库对 schema 与连接数的上限决定了该模型的可扩展边界。

适用范围

本条目围绕「以每租户一个 Schema 隔离租户」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

SELECT set_config('search_path', 'tenant_acme, public', false);
-- all unqualified queries now resolve to tenant_acme