SAAS租户表结构设计
请关注公众号【碳硅化合物AI】
设计说明
本文档定义SAAS多租户平台的核心表结构,遵循数据库规范,包含认证、租户、组织、用户、角色、权限、菜单、按钮、日志、配置等表的设计。
基础表结构
0. 认证用户表 (auth_user)
认证用户表用于存储全局认证用户主体,作为OAuth2认证的基础。租户用户通过auth_user_id关联到认证用户,实现一人多租映射。
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| username | VARCHAR | 128 | NOT NULL | 登录用户名(全局唯一) |
| password | VARCHAR | 256 | NOT NULL | 密码(加密存储,遵循加密规范) |
| display_name | VARCHAR | 256 | NULL | 显示名称 |
| VARCHAR | 256 | NULL | 邮箱 | |
| phone | VARCHAR | 64 | NULL | 手机号 |
| account_status | VARCHAR | 32 | NOT NULL | 账户状态(ON/OFF/LOCKED) |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- UNIQUE KEY uk_auth_username (username)
说明:
- 此表用于OAuth2认证,存储全局认证用户主体
tenant_user表通过auth_user_id字段关联此表- 一个
auth_user可以关联多个tenant_user,实现一人多租映射 account_status字段支持账户锁定(LOCKED)状态,用于安全控制
1. 租户表 (tenant)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_code | VARCHAR | 64 | NOT NULL | 租户编码 |
| tenant_name | VARCHAR | 256 | NOT NULL | 租户名称 |
| tenant_description | VARCHAR | 256 | NULL | 租户描述 |
| enable_status | VARCHAR | 32 | NOT NULL | 租户状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- UNIQUE KEY uk_tenant_code (tenant_code)
2. 组织表 (organization)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| parent_id | BIGINT | - | NULL | 父组织ID |
| org_code | VARCHAR | 64 | NOT NULL | 组织编码 |
| org_name | VARCHAR | 256 | NOT NULL | 组织名称 |
| org_description | VARCHAR | 256 | NULL | 组织描述 |
| org_sequence | INT | - | NULL | 排序 |
| enable_status | VARCHAR | 32 | NOT NULL | 组织状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_parent_id (parent_id)
3. 租户用户表 (tenant_user)
租户用户表用于存储租户内的用户信息,通过auth_user_id关联到全局认证用户主体,实现一人多租映射。用户在某个租户内的角色、权限等信息通过此表与其他租户隔离。
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| org_id | BIGINT | - | NULL | 组织ID |
| user_code | VARCHAR | 64 | NOT NULL | 用户编码 |
| user_name | VARCHAR | 256 | NOT NULL | 用户名 |
| auth_user_id | BIGINT | - | NULL | 认证用户ID(关联 auth_user.id) |
| VARCHAR | 256 | NULL | 邮箱 | |
| phone | VARCHAR | 64 | NULL | 手机号 |
| enable_status | VARCHAR | 32 | NOT NULL | 用户状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_org_id (org_id)
- KEY idx_auth_user_id (auth_user_id)
- UNIQUE KEY uk_tenant_user_code (tenant_id, user_code)
说明:
- 此表存储租户内的用户信息,按租户隔离
auth_user_id关联到auth_user表,实现一人多租映射:一个认证用户可以在多个租户中有不同的租户用户记录org_id可选,用于组织级别的数据隔离user_code在租户内唯一,不同租户可以有相同的user_code- 用户在租户内的角色、权限等信息通过
tenant_user_role等关联表管理
4. 租户角色表 (tenant_role)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| role_code | VARCHAR | 64 | NOT NULL | 角色编码 |
| role_name | VARCHAR | 256 | NOT NULL | 角色名称 |
| role_description | VARCHAR | 256 | NULL | 角色描述 |
| enable_status | VARCHAR | 32 | NOT NULL | 角色状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- UNIQUE KEY uk_tenant_role_code (tenant_id, role_code)
5. 租户权限表 (tenant_permission)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| permission_code | VARCHAR | 64 | NOT NULL | 权限编码 |
| permission_name | VARCHAR | 256 | NOT NULL | 权限名称 |
| permission_description | VARCHAR | 256 | NULL | 权限描述 |
| resource_type | VARCHAR | 32 | NOT NULL | 资源类型(MENU/BUTTON/API) |
| resource_id | BIGINT | - | NULL | 资源ID(关联菜单/按钮/API) |
| enable_status | VARCHAR | 32 | NOT NULL | 权限状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_resource (resource_type, resource_id)
- UNIQUE KEY uk_tenant_permission_code (tenant_id, permission_code)
6. 租户菜单表 (tenant_menu)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| parent_id | BIGINT | - | NULL | 父菜单ID |
| menu_code | VARCHAR | 64 | NOT NULL | 菜单编码 |
| menu_name | VARCHAR | 256 | NOT NULL | 菜单名称 |
| menu_description | VARCHAR | 256 | NULL | 菜单描述 |
| menu_icon | VARCHAR | 256 | NULL | 菜单图标 |
| menu_url | VARCHAR | 256 | NULL | 菜单URL |
| menu_sequence | INT | - | NULL | 排序 |
| enable_status | VARCHAR | 32 | NOT NULL | 菜单状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_parent_id (parent_id)
7. 租户按钮表 (tenant_button)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| menu_id | BIGINT | - | NULL | 所属菜单ID |
| button_code | VARCHAR | 64 | NOT NULL | 按钮编码 |
| button_name | VARCHAR | 256 | NOT NULL | 按钮名称 |
| button_description | VARCHAR | 256 | NULL | 按钮描述 |
| button_icon | VARCHAR | 256 | NULL | 按钮图标 |
| button_sequence | INT | - | NULL | 排序 |
| enable_status | VARCHAR | 32 | NOT NULL | 按钮状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_menu_id (menu_id)
- UNIQUE KEY uk_tenant_button_code (tenant_id, button_code)
8. 租户日志表 (tenant_log)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| user_id | BIGINT | - | NULL | 用户ID |
| log_type | VARCHAR | 32 | NOT NULL | 日志类型(LOGIN/AUTH/RESOURCE等) |
| log_code | VARCHAR | 64 | NOT NULL | 日志编码 |
| log_name | VARCHAR | 256 | NOT NULL | 日志名称 |
| log_description | VARCHAR | 1024 | NULL | 日志描述 |
| log_content | TEXT | - | NULL | 日志内容 |
| ip_address | VARCHAR | 64 | NULL | IP地址 |
| enable_status | VARCHAR | 32 | NOT NULL | 日志状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_user_id (user_id)
- KEY idx_log_type (log_type)
- KEY idx_create_time (create_time)
9. 租户配置表 (tenant_config)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| config_code | VARCHAR | 64 | NOT NULL | 配置编码 |
| config_name | VARCHAR | 256 | NOT NULL | 配置名称 |
| config_description | VARCHAR | 256 | NULL | 配置描述 |
| config_value | TEXT | - | NULL | 配置值(JSON格式) |
| config_type | VARCHAR | 32 | NOT NULL | 配置类型 |
| enable_status | VARCHAR | 32 | NOT NULL | 配置状态(ON/OFF) |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- UNIQUE KEY uk_tenant_config_code (tenant_id, config_code)
关联关系表
10. 用户角色关联表 (tenant_user_role)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| user_id | BIGINT | - | NOT NULL | 用户ID |
| role_id | BIGINT | - | NOT NULL | 角色ID |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_user_id (user_id)
- KEY idx_role_id (role_id)
- UNIQUE KEY uk_user_role (tenant_id, user_id, role_id)
11. 角色权限关联表 (tenant_role_permission)
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| tenant_id | BIGINT | - | NOT NULL | 租户ID |
| role_id | BIGINT | - | NOT NULL | 角色ID |
| permission_id | BIGINT | - | NOT NULL | 权限ID |
| create_user | VARCHAR | 64 | NOT NULL | 创建人 |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_user | VARCHAR | 64 | NOT NULL | 更新人 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- KEY idx_tenant_id (tenant_id)
- KEY idx_role_id (role_id)
- KEY idx_permission_id (permission_id)
- UNIQUE KEY uk_role_permission (tenant_id, role_id, permission_id)
12. OAuth2 客户端表 (oauth_client)
OAuth2客户端表用于管理OAuth2客户端配置,支持多客户端(web、mobile等)的认证需求。支持密钥轮换和吊销策略。
| 字段名 | 类型 | 长度 | 是否为空 | 说明 |
|---|---|---|---|---|
| id | BIGINT | - | NOT NULL | 业务主键ID |
| client_id | VARCHAR | 128 | NOT NULL | 客户端ID(唯一) |
| client_secret | VARCHAR | 256 | NULL | 客户端密钥(加密/哈希) |
| grant_types | VARCHAR | 256 | NULL | 授权类型(逗号分隔,如:password,refresh_token,client_credentials) |
| redirect_uris | VARCHAR | 1024 | NULL | 重定向URI(逗号分隔,用于授权码流) |
| scopes | VARCHAR | 256 | NULL | 范围(逗号分隔,如:read,write) |
| access_token_ttl | INT | - | NULL | 访问令牌有效期(秒) |
| refresh_token_ttl | INT | - | NULL | 刷新令牌有效期(秒) |
| enable_status | VARCHAR | 32 | NOT NULL | 状态(ON/OFF) |
| create_time | DATETIME | - | NOT NULL | 创建时间 |
| update_time | DATETIME | - | NOT NULL | 更新时间 |
| version | INT | - | NOT NULL | 版本,从1累加 |
| deleted | TINYINT | - | NOT NULL | 未删除0、已删除1 |
索引:
- PRIMARY KEY (id)
- UNIQUE KEY uk_client_id (client_id)
说明:
- 此表用于OAuth2客户端管理,支持多客户端(web、mobile等)
grant_types支持多种授权类型:password(密码模式)、client_credentials(客户端凭证)、refresh_token(刷新令牌)等client_secret应加密或哈希存储,遵循加密规范- 支持密钥轮换:通过版本控制实现新旧密钥过渡期并存
enable_status为OFF时,该客户端无法使用- 注意:此表不包含
tenant_id字段,因为客户端是全局配置,不按租户隔离
设计说明
- 字符集:所有表使用 utf8mb4 字符集,utf8mb4_bin 排序
- 主键:所有表使用 BIGINT 类型的业务主键 id,不设置自增
- 审计字段:所有表包含 create_user、create_time、update_user、update_time、version、deleted 字段(auth_user 和 oauth_client 表包含部分审计字段)
- 租户隔离:所有业务表包含 tenant_id 字段,用于数据隔离;认证相关表(auth_user、oauth_client)不包含 tenant_id,因为它们是全局配置
- 组织关联:根据业务需要,部分表包含 org_id 字段
- 软删除:使用 deleted 字段实现软删除(0-未删除,1-已删除)
- 状态字段:使用 enable_status 字段,值为 ON/OFF
- 认证用户与租户用户关联:
tenant_user.auth_user_id关联auth_user.id,实现一人多租映射