多租户系统设计方案及实践示例

内容纲要

在现代应用开发中,多租户(Multi-Tenant)架构已成为 SaaS(Software as a Service)解决方案的核心。它允许多个独立的客户(租户)共享同一个应用实例,同时确保数据隔离和安全性。本文将详细介绍一个全面的多租户系统设计方案,包括数据库表设计、外部租户集成以及实践中的经典示例。

目录

  1. 多租户架构模式
  2. 数据库设计
  3. 外部租户集成设计
  4. 身份验证和授权
  5. 性能与扩展性
  6. 安全性和隔离性
  7. 租户生命周期管理
  8. 日志与监控
  9. 实践示例:经典的项目管理系统
  10. 总结

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 集成流程

  1. 注册外部租户:租户在多租户系统中注册时,系统会在 external_tenants 表中创建相应的记录,记录外部系统中的租户标识。
  2. 身份验证集成:系统通过 OAuth 或 SAML 等协议与外部身份提供者集成,实现用户的单点登录和统一授权。
  3. 数据同步:根据需要,系统定期或实时与外部系统同步数据,通过 sync_tasks 表记录同步任务的状态和日志。
  4. API 调用:系统根据业务需求,通过存储在 api_integrations 表中的配置信息调用外部 API,实现功能集成。

4. 身份验证和授权

多租户系统的身份验证和授权设计至关重要,确保租户间的严格隔离和安全性。

4.1 租户上下文管理

用户登录后,系统需要记录该用户所属的租户。常见做法是通过 JWT(JSON Web Token)或 OAuth 生成包含 tenant_id 的 Token,供后续 API 请求使用。

4.2 基于租户的权限控制

不同租户可能拥有不同的权限,系统需支持基于租户的权限管理。通常为每个租户提供独立的权限策略或角色模型,通过 rolespermissions 表实现。

4.3 多租户用户登录流程

  1. 用户登录
    • 用户输入用户名和密码进行登录。
    • 系统校验用户凭证,并识别其所属租户。
  2. 生成 Token
    • 生成包含 tenant_id 和用户信息的 JWT Token。
    • 返回 Token 给客户端。
  3. 后续请求
    • 客户端在 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:记录用户信息,关联到特定租户。
  • rolespermissions:定义角色和权限,实现权限管理。
  • projectsproject_users:管理项目及其成员。
  • external_tenants:记录与外部 CRM 系统的集成信息。

9.3 集成外部 CRM 系统

假设每个租户都使用 Salesforce 作为其 CRM 系统。我们需要将 Salesforce 中的客户数据同步到项目管理系统中,以便在项目中引用客户信息。

9.3.1 集成步骤
  1. 注册外部租户
    • 当租户注册项目管理系统时,管理员在系统中配置 Salesforce 集成信息,系统在 external_tenants 表中记录 external_id(Salesforce 中的租户标识)和 external_system("Salesforce")。
  2. 身份验证
    • 系统通过 OAuth 与 Salesforce 进行身份验证,获取访问令牌,并存储在 api_integrations 表中。
  3. 数据同步
    • 定期或实时同步 Salesforce 中的客户数据,通过 sync_tasks 表记录同步任务状态。
    • 同步后的客户数据存储在项目管理系统的 customers 表中(假设存在此表),关联到对应的租户。
  4. 使用客户数据
    • 在项目创建时,用户可以选择关联 Salesforce 中的客户信息,系统通过 tenant_id 确保数据隔离。
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 角色与权限配置
  1. 创建角色
INSERT INTO roles (tenant_id, name, description) VALUES 
(1, 'Admin', '系统管理员,拥有所有权限'),
(1, 'Project Manager', '项目经理,管理项目'),
(1, 'Member', '项目成员,管理个人任务');
  1. 定义权限
INSERT INTO permissions (name, description) VALUES 
('CREATE_PROJECT', '创建项目'),
('DELETE_PROJECT', '删除项目'),
('MANAGE_USERS', '管理用户'),
('VIEW_TASKS', '查看任务'),
('UPDATE_TASKS', '更新任务');
  1. 分配权限给角色
-- 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 集成
  1. 存储 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"}');
  1. 实现数据同步逻辑

系统定期读取 sync_tasks 表中的待处理任务,调用 Salesforce API 获取最新的项目数据,并更新本地数据库中的 projects 表。

  1. 记录同步任务

每次同步任务的状态和结果通过 sync_tasks 表记录,便于监控和故障排查。


10. 总结

本文详细介绍了一个多租户系统的设计方案,包括架构模式选择、数据库表设计、外部租户集成、身份验证与授权、性能优化、安全性措施、租户生命周期管理以及日志与监控。通过实践中的经典项目管理系统示例,展示了多租户设计在实际应用中的具体实现。

多租户系统的设计不仅需考虑当前的业务需求,还需具备良好的扩展性和灵活性,以应对未来的变化和增长。在实施过程中,务必确保数据隔离和安全性,同时通过有效的监控和管理机制,保障系统的稳定运行和高效服务。

通过本文提供的设计方案和实践示例,开发者可以构建一个健壮、安全且高效的多租户系统,满足现代 SaaS 应用的复杂需求。

参考资料

结束语

多租户系统的设计是一项复杂但极具挑战性的任务,需要综合考虑架构、数据库、性能、安全等多方面因素。希望本文能够为开发者提供有价值的参考,助力构建高效、可靠的多租户应用。

附录:完整的数据库表结构

-- 租户表
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)
);

版权声明

本文为原创内容,版权所有。未经许可,不得转载或引用。如需转载请联系作者获取授权。

联系方式

如有任何问题或建议,请通过以下方式联系:


© 2024 林清扬。

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward