首页/数据/NoSQL 速查/多租户隔离:独立库、独立集合与共享结构
选型与架构50 条

多租户隔离:独立库、独立集合与共享结构

三种隔离级别各有取舍:每租户独立库/索引隔离强但连接与运维开销大;独立集合/索引是折中;共享结构加 tenantId 成本低,但要全链路强制过滤并防噪音邻居。选择看租户数量、合规要求与租户间规模差异。

NoSQL 速查数据更新于 2026-10-12

隔离级别

方案隔离性代价
每租户独立库强,备份与恢复可按租户做连接池、监控与升级操作成倍增加
独立集合/索引中,按租户精细管理集合/索引数量随租户增长
共享 + tenantId靠过滤条件与权限兜底需要统一入口强制注入并防热点租户

共享结构(MongoDB 示例)

共享结构(MongoDB 示例)
// 查询必须带 tenantId,索引以 tenantId 为前缀
 db.orders.find({ tenantId: "t42", status: "open" }).sort({ createdAt: -1 })
db.orders.createIndex({ tenantId: 1, createdAt: -1 })

// 视图兜底:把租户过滤固化成视图供上层使用
// db.createView("orders_t42", "orders", [{ $match: { tenantId: "t42" } }])
搜索引擎侧常用 routing 参数把同租户文档路由到同一分片组,减少查询扇出;租户间规模差异大时给大租户单独开索引或独立集群。

易错点

  • 漏带 tenantId 的查询会跨租户读数据,接口层要强制注入并在评审中检查
  • 单租户流量过大会影响其他租户(噪音邻居),需要按租户限流与配额

数据来源与参考

  • MongoDB Manual: Multi-tenancy
  • Elasticsearch Guide: Routing
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌