3. 医疗SaaS多租户架构模式选型

医疗SaaS平台的多租户架构选型,本质上是在“隔离强度”与“资源效率”之间寻找平衡点。医疗行业受《个人信息保护法》《数据安全法》及等保2.0约束,患者身份信息、诊疗记录、检验结果等属于敏感个人信息,一旦发生跨租户数据泄露,后果远高于普通商业SaaS。因此,多租户模式不能只按“省钱”来选,而要先确定每个租户数据的隔离边界,再评估运维复杂度与成本是否可接受。

三种主流多租户数据隔离模式

独立数据库(Database per Tenant):每个租户拥有独立的数据库实例或独立物理库,连接串、账号、备份策略均按租户独立管理。租户A的查询在物理上不可能触达租户B的数据,隔离级别最高。适合三级医院、区域医疗集团、对数据主权有强要求的客户。代价是实例数量随租户线性增长,连接池、备份、升级、监控都要按租户维度展开。

共享数据库、独立Schema(Shared Database, Schema per Tenant):所有租户共用一个数据库实例,但每个租户拥有独立Schema(如MySQL中可理解为独立database,PostgreSQL/Oracle中为独立schema)。表结构相同,数据按Schema隔离。它保留了较强的逻辑隔离,同时把实例级运维成本摊薄。适合中型诊所、连锁门诊、体检中心等租户数量中等、单租户数据量不大的场景。

共享数据库、共享Schema(Shared Database, Shared Schema):所有租户共用同一套表,通过tenant_id字段区分数据行。隔离完全依赖应用层SQL过滤、行级安全策略或数据访问中间件。资源利用率最高、扩容最平滑,但一旦SQL漏写租户条件、缓存键未带租户标识、异步任务未传递租户上下文,就会发生越权读写。适合小微机构、互联网医疗轻量租户、SaaS试用版或标准化程度极高的业务模块。

多租户数据隔离模式:隔离强度 vs 资源效率 独立数据库 租户A DB-A · 独立账号/连接串 租户B DB-B · 独立账号/连接串 租户C DB-C · 独立账号/连接串 隔离级别:物理级 ★★★★★ 成本:高 · 运维:复杂 适用:三级医院/医疗集团 共享库 · 独立Schema 同一数据库实例 Schema_A 租户A表结构 Schema_B 租户B表结构 Schema_C 租户C表结构 隔离级别:逻辑级 ★★★★ 成本:中 · 运维:中等 适用:连锁门诊/体检中心 共享库 · 共享Schema 同一数据库 · 同一套表 patient 表 tenant_id = A / B / C visit 表 tenant_id = A / B / C order 表 tenant_id = A / B / C 隔离级别:行级 ★★★ 成本:低 · 运维:简单 适用:小微机构/试用版 隔离强 / 成本高 隔离弱 / 成本低

隔离级别、成本与运维的真实权衡

隔离级别不是抽象概念,它直接决定“故障半径”和“合规举证方式”。独立数据库模式下,租户A的慢查询、锁等待、磁盘写满不会影响租户B,备份恢复可以按租户粒度执行,等保测评时也更容易界定边界。共享Schema模式下,一个租户的慢SQL可能拖垮整个实例,一次误删可能波及所有租户,因此必须配合资源组、SQL限流、租户级连接池和审计日志。

成本方面,独立数据库的实例费用、备份存储、连接数授权随租户数线性上升;共享库独立Schema的实例成本被摊薄,但Schema数量过多时,元数据管理、DDL变更、跨Schema统计会变复杂;共享库共享Schema的存储和计算利用率最高,但需要额外投入租户上下文传递、SQL拦截、缓存隔离、异步任务隔离等中间件能力,这部分研发与测试成本不能忽略。

运维维度上,独立数据库的升级需要逐租户执行,适合灰度但耗时长;共享Schema的升级一次完成,但风险集中,必须先在预发环境用多租户数据做回归。医疗业务还有一条硬约束:患者数据删除请求、数据导出请求、审计追溯请求,在共享Schema下都要靠tenant_id精确定位,任何遗漏都会造成合规风险。

选型决策矩阵

实际选型不建议“一刀切”,可以按租户等级、数据敏感度、业务模块三个维度组合。下面给出一个可直接用于评审的决策矩阵示例,其中评分1~5分,分数越高表示该模式在该维度越合适。

决策维度 独立数据库 共享库独立Schema 共享库共享Schema
数据隔离强度 5 4 2
单租户资源成本 2 4 5
运维复杂度(越低分越高) 2 3 5
合规举证便利性 5 4 2
弹性扩容能力 3 4 5
适合租户规模 大型/少量 中型/中等 小微/大量

一个可落地的混合策略是:核心诊疗数据(患者主索引、电子病历、处方、检验结果)采用共享库独立Schema,保证逻辑隔离与合规可解释;平台级配置、字典、消息、日志等低敏感数据采用共享Schema,降低公共表维护成本;对三级医院或区域平台等战略租户,单独部署独立数据库,并在网关层做租户路由。这样既避免全部独立库带来的成本失控,也避免全部共享Schema带来的合规与故障风险。

选型评审时,建议把“租户数据删除能否在24小时内完成并留痕”“单租户故障是否影响其他租户”“新增一个租户需要多少人工操作”作为三个必答问题,它们比单纯比较数据库数量更能暴露架构真实代价。

落地时的关键检查点

  • 租户上下文传递:HTTP请求头、JWT声明、线程变量、异步任务、消息队列、定时任务都必须携带tenant_id,并在数据访问层强制注入,禁止业务代码手写过滤条件。
  • 连接与资源隔离:共享实例下按租户配置连接池上限、慢SQL阈值和并发限制,防止单租户打满数据库。
  • DDL变更策略:独立Schema模式需批量执行并校验每个Schema版本一致;共享Schema模式需评估大表加字段的锁表时间,医疗业务应安排在低峰窗口。
  • 审计与追溯:所有跨租户查询、数据导出、删除操作必须记录操作人、租户、时间、SQL指纹,满足等保与内部审计要求。
  • 迁移预留:初期采用共享Schema的租户,一旦升级为战略客户,应能通过数据导出与Schema拆分迁移到独立库,避免架构锁死。

多租户选型没有绝对最优解,只有与租户结构、合规要求、团队运维能力匹配的解。把隔离级别、成本、运维三者的关系量化成矩阵,再结合混合部署策略,才能在医疗SaaS的长期演进中既守住安全底线,又保持商业可持续性。