在现代应用开发中,多租户(Multi-Tenant)架构已成为 SaaS(Software as a Service)解决方案的核心。它允许多个独立的客户(租户)共享同一个应用实例,同时确保数据隔离和安全性。本文将详细介绍一个全面的多租户系统设计方案,包括数据库表设计、外部租户集成以及实践中的经典示例。
目录
1. 多租户架构模式
多租户架构的实现方式主要有以下几种:
- 独立数据库模式:每个租户拥有自己的数据库,完全隔离。
- 共享数据库、独立 Schema 模式:租户共享同一个数据库,但每个租户拥有独立的 Schema。
- 共享数据库、共享 Schema 模式:租户共享同一数据库和 Schema,通过 tenant_id 进行数据隔离。
本文主要采用 共享数据库、共享 Schema 的模式,因为这种方式具备高效的资源利用率,同时可以通过合理的索引和设计,保证数据隔离和安全性。
每种方式在隔离性、成本和管理复杂度上也各有优劣:
1.1 独立数据库(每个租户一个数据库)
优点:
- 完全隔离,安全性高
- 每个租户可以单独备份和恢复数据
- 易于扩展,支持不同租户的数据结构
缺点:
- 数据库管理开销大
- 数据库成本较高
1.2 共享数据库、独立 Schema(每个租户一个 Schema)
优点:
- 数据库管理较简单
- 隔离性较好
- 数据库成本较低
缺点:
- Schema 管理复杂
- 数据库负载高可能影响性能
1.3 共享数据库、共享 Schema(所有租户共用一个 Schema)
优点:
- 成本最低,管理最简单
- 高效利用数据库资源
缺点:
- 隔离性差,安全性要求高
- 数据库性能瓶颈明显
- 数据结构变化需全面影响所有租户
2. 数据库设计
根据上述架构模式,本文采用“共享数据库、共享 Schema”的设计方案。所有租户的数据存储在相同的表中,通过 tenant_id
字段区分不同租户的数据。
2.1 租户表(tenants
)
存储每个租户的信息,如租户名称、域名、联系人邮箱等。
CREATE TABLE tenants (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
domain VARCHAR(255) UNIQUE,
contact_email VARCHAR(255),
status VARCHAR(50) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2.2 用户表(users
)
存储每个租户的用户信息,包含用户的角色和基本状态。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
role_id INT NOT NULL,
status VARCHAR(50) DEFAULT 'active',
last_login TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
2.3 角色表(roles
)
定义系统中的角色,不同租户可以拥有不同的角色定义。
CREATE TABLE roles (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
name VARCHAR(100) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
2.4 权限表(permissions
)
定义系统中具体的权限操作,如“创建用户”、“删除项目”。
CREATE TABLE permissions (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2.5 角色-权限关系表(role_permissions
)
定义每个角色可以执行的权限,实现角色与权限的多对多关系。
CREATE TABLE role_permissions (
role_id INT NOT NULL,
permission_id INT NOT NULL,
PRIMARY KEY (role_id, permission_id),
CONSTRAINT fk_role FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
CONSTRAINT fk_permission FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);
2.6 项目表(projects
)
存储每个租户的项目数据。
项目表作为业务数据的核心表之一,使用 tenant_id 来区分不同租户的数据。
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
status VARCHAR(50) DEFAULT 'active',
created_by INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
);
2.7 项目-用户关系表(project_users
)
记录用户参与的项目,实现项目与用户的多对多关系。
CREATE TABLE project_users (
project_id INT NOT NULL,
user_id INT NOT NULL,
role VARCHAR(50) NOT NULL,
PRIMARY KEY (project_id, user_id),
CONSTRAINT fk_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
2.8 审计日志表(audit_logs
)
记录租户在系统中的重要操作,便于后续审计和问题排查。
CREATE TABLE audit_logs (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
user_id INT NOT NULL,
action VARCHAR(255) NOT NULL,
details TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
2.9 设置表(settings
)
存储每个租户的个性化配置,如 UI 定制、系统参数等。
CREATE TABLE settings (
tenant_id INT PRIMARY KEY,
config JSONB NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
2.10 API Token 表(api_tokens
)
存储每个租户或用户的 API 访问 Token,用于第三方系统的集成。
CREATE TABLE api_tokens (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
user_id INT,
token VARCHAR(255) NOT NULL,
expires_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
2.11 外部租户集成表(external_tenants
)
为了与外部系统集成,记录外部租户的关联信息。
CREATE TABLE external_tenants (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
external_id VARCHAR(255) NOT NULL, -- 外部系统中的租户标识
external_system VARCHAR(100) NOT NULL, -- 外部系统名称
mapping_details JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
UNIQUE (external_system, external_id)
);
说明:
external_id
:外部系统中租户的唯一标识。external_system
:集成的外部系统名称(如 Salesforce、Azure AD)。mapping_details
:存储与外部系统相关的映射信息,如同步字段、配置参数等。
3. 外部租户集成设计
在实际应用中,可能需要与外部系统集成,如企业目录服务(Active Directory、Azure AD)、CRM 系统(Salesforce)、支付网关等。为此,需要设计相应的表和接口,以确保多租户系统能够顺利与外部系统进行数据交换和同步。
3.1 集成需求分析
- 身份验证与授权:与外部身份提供者集成,实现单点登录(SSO)和统一的用户管理。
- 数据同步:与外部业务系统同步数据,如客户信息、订单数据等。
- API 集成:与外部系统通过 API 进行交互,提供数据查询和操作接口。
3.2 数据表设计
上文中的 external_tenants
表用于记录与外部系统集成的租户信息。除此之外,可能还需要以下表:
- 同步任务表(sync_tasks):记录数据同步任务的状态和日志。
- API 集成配置表(api_integrations):存储与外部 API 集成的配置参数,如 API 密钥、回调 URL 等。
同步任务表(sync_tasks
)
CREATE TABLE sync_tasks (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
task_type VARCHAR(100) NOT NULL, -- 同步任务类型(如 "user_sync", "data_sync")
status VARCHAR(50) DEFAULT 'pending', -- 任务状态(pending, running, completed, failed)
details JSONB, -- 任务详情
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
API 集成配置表(api_integrations
)
CREATE TABLE api_integrations (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
api_name VARCHAR(100) NOT NULL, -- API 名称(如 "Salesforce", "Stripe")
api_key VARCHAR(255), -- API 密钥
api_secret VARCHAR(255), -- API 密钥
callback_url VARCHAR(255), -- 回调 URL
config JSONB, -- 其他配置参数
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
UNIQUE (tenant_id, api_name)
);
3.3 集成流程
- 注册外部租户:租户在多租户系统中注册时,系统会在
external_tenants
表中创建相应的记录,记录外部系统中的租户标识。 - 身份验证集成:系统通过 OAuth 或 SAML 等协议与外部身份提供者集成,实现用户的单点登录和统一授权。
- 数据同步:根据需要,系统定期或实时与外部系统同步数据,通过
sync_tasks
表记录同步任务的状态和日志。 - API 调用:系统根据业务需求,通过存储在
api_integrations
表中的配置信息调用外部 API,实现功能集成。
4. 身份验证和授权
多租户系统的身份验证和授权设计至关重要,确保租户间的严格隔离和安全性。
4.1 租户上下文管理
用户登录后,系统需要记录该用户所属的租户。常见做法是通过 JWT(JSON Web Token)或 OAuth 生成包含 tenant_id
的 Token,供后续 API 请求使用。
4.2 基于租户的权限控制
不同租户可能拥有不同的权限,系统需支持基于租户的权限管理。通常为每个租户提供独立的权限策略或角色模型,通过 roles
和 permissions
表实现。
4.3 多租户用户登录流程
- 用户登录:
- 用户输入用户名和密码进行登录。
- 系统校验用户凭证,并识别其所属租户。
- 生成 Token:
- 生成包含
tenant_id
和用户信息的 JWT Token。 - 返回 Token 给客户端。
- 生成包含
- 后续请求:
- 客户端在 API 请求中携带 Token。
- 服务器从 Token 中提取
tenant_id
,并应用租户隔离规则。
5. 性能与扩展性
随着租户数量和数据量的增长,系统需具备良好的性能和扩展性。
5.1 数据库优化
- 索引:为
tenant_id
字段建立索引,提高查询效率。 - 分片或分区:将数据按租户划分存储,减少单表的数据量,提升性能。
- 查询优化:使用高效的查询语句,避免全表扫描。
5.2 水平扩展
当单个数据库实例无法满足性能需求时,可以通过水平扩展将租户分配到不同的数据库实例中,实现负载均衡。
5.3 缓存
使用 Redis 等缓存机制,将租户的常用数据缓存起来,减少数据库压力,提升系统响应速度。
6. 安全性和隔离性
多租户系统的核心是确保数据的安全性和租户间的隔离性。以下措施可增强系统的安全性:
- 数据加密:对敏感数据进行加密存储,防止数据泄露。
- 逻辑隔离:通过
tenant_id
实现数据的逻辑隔离,确保用户只能访问自己租户的数据。 - 权限控制:严格的权限控制机制,确保用户只能执行其权限范围内的操作。
- 审计日志:记录用户的操作日志,便于后续审计和问题追查。
7. 租户生命周期管理
支持多租户环境需具备租户生命周期管理机制,包括:
- 租户注册:租户创建时,系统在
tenants
表中创建记录,并初始化相关配置。 - 租户更新:支持租户信息的修改,如联系人、状态等。
- 租户删除:删除租户时,级联删除其相关数据,确保数据不残留。
- 租户配额管理:限制每个租户的资源使用,如存储空间、API 调用次数等。
- 租户监控:实时监控租户的资源使用情况,提供报警和报告功能。
8. 日志与监控
为每个租户记录独立的日志和监控信息,确保可以对不同租户进行个性化的监控和运维管理。
8.1 日志记录
- 应用日志:记录系统运行时的关键事件和错误信息。
- 审计日志:记录用户的操作行为,便于审计和追溯。
- 访问日志:记录用户的访问请求,分析访问模式和流量情况。
8.2 监控指标
- 资源使用:监控 CPU、内存、存储等资源的使用情况。
- 性能指标:监控响应时间、吞吐量、错误率等性能指标。
- 业务指标:监控业务相关的数据,如用户增长、订单量等。
8.3 报警与通知
配置报警规则,当某些指标超过阈值时,及时通知运维人员,确保系统的稳定运行。
9. 实践示例:经典的项目管理系统
为了更好地理解多租户设计方案,以下通过一个经典的项目管理系统示例,展示多租户架构的实际应用。
9.1 系统概述
假设我们要设计一个支持多租户的项目管理系统,允许不同企业或团队创建和管理项目、任务、用户等。每个租户独立管理自己的项目和用户,同时系统支持与外部 CRM 系统集成,实现数据同步。
9.2 数据表设计回顾
根据前述设计,我们的数据库包含以下关键表:
tenants
:记录租户信息。users
:记录用户信息,关联到特定租户。roles
和permissions
:定义角色和权限,实现权限管理。projects
和project_users
:管理项目及其成员。external_tenants
:记录与外部 CRM 系统的集成信息。
9.3 集成外部 CRM 系统
假设每个租户都使用 Salesforce 作为其 CRM 系统。我们需要将 Salesforce 中的客户数据同步到项目管理系统中,以便在项目中引用客户信息。
9.3.1 集成步骤
- 注册外部租户:
- 当租户注册项目管理系统时,管理员在系统中配置 Salesforce 集成信息,系统在
external_tenants
表中记录external_id
(Salesforce 中的租户标识)和external_system
("Salesforce")。
- 当租户注册项目管理系统时,管理员在系统中配置 Salesforce 集成信息,系统在
- 身份验证:
- 系统通过 OAuth 与 Salesforce 进行身份验证,获取访问令牌,并存储在
api_integrations
表中。
- 系统通过 OAuth 与 Salesforce 进行身份验证,获取访问令牌,并存储在
- 数据同步:
- 定期或实时同步 Salesforce 中的客户数据,通过
sync_tasks
表记录同步任务状态。 - 同步后的客户数据存储在项目管理系统的
customers
表中(假设存在此表),关联到对应的租户。
- 定期或实时同步 Salesforce 中的客户数据,通过
- 使用客户数据:
- 在项目创建时,用户可以选择关联 Salesforce 中的客户信息,系统通过
tenant_id
确保数据隔离。
- 在项目创建时,用户可以选择关联 Salesforce 中的客户信息,系统通过
9.3.2 示例 SQL 查询
查询租户 A 的所有项目及其关联的客户信息:
SELECT
p.id AS project_id,
p.name AS project_name,
c.id AS customer_id,
c.name AS customer_name
FROM
projects p
JOIN
project_customers pc ON p.id = pc.project_id
JOIN
customers c ON pc.customer_id = c.id
WHERE
p.tenant_id = (SELECT id FROM tenants WHERE name = 'Tenant A');
9.4 用户角色与权限
假设租户 A 有以下角色:
- 管理员(Admin):拥有所有权限,可以管理项目、用户和设置。
- 项目经理(Project Manager):可以创建和管理项目,但无法管理用户。
- 成员(Member):只能查看和更新自己参与的项目任务。
9.4.1 角色与权限配置
- 创建角色:
INSERT INTO roles (tenant_id, name, description) VALUES
(1, 'Admin', '系统管理员,拥有所有权限'),
(1, 'Project Manager', '项目经理,管理项目'),
(1, 'Member', '项目成员,管理个人任务');
- 定义权限:
INSERT INTO permissions (name, description) VALUES
('CREATE_PROJECT', '创建项目'),
('DELETE_PROJECT', '删除项目'),
('MANAGE_USERS', '管理用户'),
('VIEW_TASKS', '查看任务'),
('UPDATE_TASKS', '更新任务');
- 分配权限给角色:
-- Admin 角色拥有所有权限
INSERT INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.name = 'Admin' AND r.tenant_id = 1;
-- Project Manager 角色拥有创建和删除项目权限
INSERT INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.name = 'Project Manager' AND p.name IN ('CREATE_PROJECT', 'DELETE_PROJECT') AND r.tenant_id = 1;
-- Member 角色拥有查看和更新任务权限
INSERT INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.name = 'Member' AND p.name IN ('VIEW_TASKS', 'UPDATE_TASKS') AND r.tenant_id = 1;
9.5 API 集成与数据同步
假设项目管理系统需要将项目数据同步到 Salesforce,以便在 CRM 系统中跟踪项目进展。
9.5.1 配置 API 集成
- 存储 API 配置信息:
INSERT INTO api_integrations (tenant_id, api_name, api_key, api_secret, callback_url, config) VALUES
(1, 'Salesforce', 'your_salesforce_api_key', 'your_salesforce_api_secret', 'https://yourapp.com/callback', '{"sync_frequency": "daily"}');
- 实现数据同步逻辑:
系统定期读取 sync_tasks
表中的待处理任务,调用 Salesforce API 获取最新的项目数据,并更新本地数据库中的 projects
表。
- 记录同步任务:
每次同步任务的状态和结果通过 sync_tasks
表记录,便于监控和故障排查。
10. 总结
本文详细介绍了一个多租户系统的设计方案,包括架构模式选择、数据库表设计、外部租户集成、身份验证与授权、性能优化、安全性措施、租户生命周期管理以及日志与监控。通过实践中的经典项目管理系统示例,展示了多租户设计在实际应用中的具体实现。
多租户系统的设计不仅需考虑当前的业务需求,还需具备良好的扩展性和灵活性,以应对未来的变化和增长。在实施过程中,务必确保数据隔离和安全性,同时通过有效的监控和管理机制,保障系统的稳定运行和高效服务。
通过本文提供的设计方案和实践示例,开发者可以构建一个健壮、安全且高效的多租户系统,满足现代 SaaS 应用的复杂需求。
参考资料
- Multi-Tenant Architecture
- Designing Multi-Tenant Applications for the Cloud
- Database Normalization
- JSON Web Token (JWT)
结束语
多租户系统的设计是一项复杂但极具挑战性的任务,需要综合考虑架构、数据库、性能、安全等多方面因素。希望本文能够为开发者提供有价值的参考,助力构建高效、可靠的多租户应用。
附录:完整的数据库表结构
-- 租户表
CREATE TABLE tenants (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
domain VARCHAR(255) UNIQUE,
contact_email VARCHAR(255),
status VARCHAR(50) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 用户表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
role_id INT NOT NULL,
status VARCHAR(50) DEFAULT 'active',
last_login TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
-- 角色表
CREATE TABLE roles (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
name VARCHAR(100) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
-- 权限表
CREATE TABLE permissions (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 角色-权限关系表
CREATE TABLE role_permissions (
role_id INT NOT NULL,
permission_id INT NOT NULL,
PRIMARY KEY (role_id, permission_id),
CONSTRAINT fk_role FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
CONSTRAINT fk_permission FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);
-- 项目表
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
status VARCHAR(50) DEFAULT 'active',
created_by INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
);
-- 项目-用户关系表
CREATE TABLE project_users (
project_id INT NOT NULL,
user_id INT NOT NULL,
role VARCHAR(50) NOT NULL,
PRIMARY KEY (project_id, user_id),
CONSTRAINT fk_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 审计日志表
CREATE TABLE audit_logs (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
user_id INT NOT NULL,
action VARCHAR(255) NOT NULL,
details TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 设置表
CREATE TABLE settings (
tenant_id INT PRIMARY KEY,
config JSONB NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
-- API Token 表
CREATE TABLE api_tokens (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
user_id INT,
token VARCHAR(255) NOT NULL,
expires_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 外部租户集成表
CREATE TABLE external_tenants (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
external_id VARCHAR(255) NOT NULL,
external_system VARCHAR(100) NOT NULL,
mapping_details JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
UNIQUE (external_system, external_id)
);
-- 同步任务表
CREATE TABLE sync_tasks (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
task_type VARCHAR(100) NOT NULL,
status VARCHAR(50) DEFAULT 'pending',
details JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
);
-- API 集成配置表
CREATE TABLE api_integrations (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
api_name VARCHAR(100) NOT NULL,
api_key VARCHAR(255),
api_secret VARCHAR(255),
callback_url VARCHAR(255),
config JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
UNIQUE (tenant_id, api_name)
);
版权声明
本文为原创内容,版权所有。未经许可,不得转载或引用。如需转载请联系作者获取授权。
联系方式
如有任何问题或建议,请通过以下方式联系:
- 邮箱:linqingyang@datagov.top
- 网站:linqingyang.com
© 2024 林清扬。