[TOC] ## 一、方案说明 项目选用第三种方案即`共享数据库,共享 Schema,共享数据表`来实现,每个需要隔离的数据表都要增加一个租户标识`tenant_id` 1. 目前数据库中需要添加该字段的表包括:`sys_menu`、`sys_role`、`file_info` 2. 业务的`curd`不需要关注租户标识,通过动态修改SQL的手段实现业务无感知 > 在该方案的基础上只需要增加`Sharding-jdbc`、`MyCat`等中间件即可实现第一种隔离方案 ## 二、实体关系图 ![](https://img.kancloud.cn/1e/e6/1ee6fea0f3481ebe95cc7db0107a51a6_674x645.png) > 1. 本项目因为主要设计面向的是中台架构,所以用户数据是共享的并不会隔离,以实现多应用共享同一用户 > 2. 菜单、角色管理和token管理这3个功能(能看到所有租户的数据),由管理员统一为各个租户维护数据,其他租户不需要看到这3个菜单 ## 三、流程图 动态修改SQL实现数据隔离的流程图如下: ![](https://img.kancloud.cn/13/0e/130e584acc4f8a39cfa7b4359d72090c_1132x551.png) ## 四、配置说明 该功能默认关闭,添加以下配置到需要数据隔离的服务上即可开启 ~~~ pigframe: tenant: enable: true ignoreTables: - sys_user - sys_role_user - sys_role_menu ignoreSqls: - com.central.user.mapper.SysUserMapper.findList ~~~ > pigframe.tenant.enable 是否开启多租户(动态修改sql),默认`false` > pigframe.tenant.ignoreTables 配置不需要隔离的表名 > pigframe.tenant.ignoreSqls 配置不需要隔离的语句,直接配置MyBatic的Mapper全路径+sqlId