268 lines
No EOL
10 KiB
Markdown
268 lines
No EOL
10 KiB
Markdown
# LLM API 转发平台数据库规格书
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
1. [简介](#1-简介)
|
||
2. [数据库概览](#2-数据库概览)
|
||
3. [MySQL 数据库设计](#3-mysql-数据库设计)
|
||
- [3.1 管理员表(admins)](#31-管理员表admins)
|
||
- [3.2 客户用户表(clients)](#32-客户用户表clients)
|
||
- [3.3 LLM 提供商表(llm_providers)](#33-llm-提供商表llm_providers)
|
||
- [3.4 认证令牌表(auth_tokens)](#34-认证令牌表auth_tokens)
|
||
- [3.5 管理员与客户用户关联表(admin_client)](#35-管理员与客户用户关联表admin_client)
|
||
- [3.6 操作日志表(operation_logs)](#36-操作日志表operation_logs)
|
||
4. [Redis 缓存设计](#4-redis-缓存设计)
|
||
- [4.1 访问令牌存储](#41-访问令牌存储)
|
||
- [4.2 令牌注销机制](#42-令牌注销机制)
|
||
5. [数据库关系图](#5-数据库关系图)
|
||
6. [总结](#6-总结)
|
||
|
||
---
|
||
|
||
## 1. 简介
|
||
|
||
本规格书旨在基于之前的系统设计,详细设计 LLM API 转发平台的数据库结构。数据库采用 **MySQL** 作为主要的数据存储,**Redis** 用于缓存短期有效的访问令牌和支持动态注销功能。
|
||
|
||
---
|
||
|
||
## 2. 数据库概览
|
||
|
||
- **MySQL**:持久化存储管理员、客户用户、LLM 提供商、认证令牌等信息。
|
||
- **Redis**:缓存短期访问令牌,实现高效验证和支持令牌的动态注销。
|
||
|
||
---
|
||
|
||
## 3. MySQL 数据库设计
|
||
|
||
### 3.1 管理员表(`admins`)
|
||
|
||
**描述**:存储超级管理员和管理员的信息。
|
||
|
||
**字段**:
|
||
|
||
| 字段名 | 数据类型 | 允许为空 | 默认值 | 描述 |
|
||
|-----------------|-----------------|----------|--------|----------------------|
|
||
| `id` | BIGINT UNSIGNED | 否 | 自增 | 主键 |
|
||
| `username` | VARCHAR(50) | 否 | | 用户名 |
|
||
| `password` | VARCHAR(255) | 否 | | 加密后的密码 |
|
||
| `email` | VARCHAR(100) | 是 | NULL | 邮箱 |
|
||
| `role` | ENUM('super', 'admin') | 否 | 'admin' | 角色,'super'为超级管理员,'admin'为管理员 |
|
||
| `created_at` | TIMESTAMP | 否 | 当前时间 | 创建时间 |
|
||
| `updated_at` | TIMESTAMP | 否 | 当前时间 | 更新时间 |
|
||
|
||
**索引**:
|
||
|
||
- `UNIQUE INDEX`:`username`
|
||
- `INDEX`:`email`
|
||
|
||
### 3.2 客户用户表(`clients`)
|
||
|
||
**描述**:存储客户用户的信息。
|
||
|
||
**字段**:
|
||
|
||
| 字段名 | 数据类型 | 允许为空 | 默认值 | 描述 |
|
||
|-----------------------|-----------------|----------|--------|------------------------------|
|
||
| `id` | BIGINT UNSIGNED | 否 | 自增 | 主键 |
|
||
| `name` | VARCHAR(100) | 否 | | 客户用户名称 |
|
||
| `llm_provider_id` | BIGINT UNSIGNED | 否 | | 外键,关联到 `llm_providers.id` |
|
||
| `created_at` | TIMESTAMP | 否 | 当前时间 | 创建时间 |
|
||
| `updated_at` | TIMESTAMP | 否 | 当前时间 | 更新时间 |
|
||
|
||
**索引**:
|
||
|
||
- `INDEX`:`llm_provider_id`
|
||
|
||
**外键约束**:
|
||
|
||
- `llm_provider_id` 引用 `llm_providers.id`,级联更新和删除。
|
||
|
||
### 3.3 LLM 提供商表(`llm_providers`)
|
||
|
||
**描述**:存储 LLM 提供商的信息。
|
||
|
||
**字段**:
|
||
|
||
| 字段名 | 数据类型 | 允许为空 | 默认值 | 描述 |
|
||
|------------------|-----------------|----------|--------|------------------------------|
|
||
| `id` | BIGINT UNSIGNED | 否 | 自增 | 主键 |
|
||
| `name` | VARCHAR(100) | 否 | | 提供商名称 |
|
||
| `service_name` | VARCHAR(100) | 否 | | 服务名称,用于后端调用逻辑 |
|
||
| `api_url` | VARCHAR(255) | 否 | | 提供商的 API 接口地址 |
|
||
| `api_token` | VARCHAR(255) | 否 | | 调用提供商 API 所需的令牌 |
|
||
| `created_at` | TIMESTAMP | 否 | 当前时间 | 创建时间 |
|
||
| `updated_at` | TIMESTAMP | 否 | 当前时间 | 更新时间 |
|
||
|
||
**索引**:
|
||
|
||
- `UNIQUE INDEX`:`name`
|
||
- `INDEX`:`service_name`
|
||
|
||
### 3.4 认证令牌表(`auth_tokens`)
|
||
|
||
**描述**:存储客户用户的长期认证令牌。
|
||
|
||
**字段**:
|
||
|
||
| 字段名 | 数据类型 | 允许为空 | 默认值 | 描述 |
|
||
|-----------------|-----------------|----------|--------|--------------------------------|
|
||
| `id` | BIGINT UNSIGNED | 否 | 自增 | 主键 |
|
||
| `client_id` | BIGINT UNSIGNED | 否 | | 外键,关联到 `clients.id` |
|
||
| `token` | CHAR(64) | 否 | | 认证令牌,随机生成的64位字符串 |
|
||
| `expires_at` | TIMESTAMP | 是 | NULL | 过期时间,NULL表示永久有效 |
|
||
| `created_at` | TIMESTAMP | 否 | 当前时间 | 创建时间 |
|
||
| `updated_at` | TIMESTAMP | 否 | 当前时间 | 更新时间 |
|
||
|
||
**索引**:
|
||
|
||
- `UNIQUE INDEX`:`token`
|
||
- `INDEX`:`client_id`
|
||
|
||
**外键约束**:
|
||
|
||
- `client_id` 引用 `clients.id`,级联删除。
|
||
|
||
### 3.5 管理员与客户用户关联表(`admin_client`)
|
||
|
||
**描述**:存储管理员与客户用户的多对多关系。
|
||
|
||
**字段**:
|
||
|
||
| 字段名 | 数据类型 | 允许为空 | 默认值 | 描述 |
|
||
|--------------|-----------------|----------|--------|-----------------------------|
|
||
| `admin_id` | BIGINT UNSIGNED | 否 | | 外键,关联到 `admins.id` |
|
||
| `client_id` | BIGINT UNSIGNED | 否 | | 外键,关联到 `clients.id` |
|
||
| `assigned_at`| TIMESTAMP | 否 | 当前时间 | 分配时间 |
|
||
|
||
**索引**:
|
||
|
||
- `PRIMARY KEY`:(`admin_id`, `client_id`)
|
||
- `INDEX`:`client_id`
|
||
|
||
**外键约束**:
|
||
|
||
- `admin_id` 引用 `admins.id`,级联删除。
|
||
- `client_id` 引用 `clients.id`,级联删除。
|
||
|
||
### 3.6 操作日志表(`operation_logs`)
|
||
|
||
**描述**:记录管理员和客户用户的操作日志。
|
||
|
||
**字段**:
|
||
|
||
| 字段名 | 数据类型 | 允许为空 | 默认值 | 描述 |
|
||
|-----------------|-----------------|----------|--------|------------------------------|
|
||
| `id` | BIGINT UNSIGNED | 否 | 自增 | 主键 |
|
||
| `user_type` | ENUM('admin', 'client') | 否 | | 用户类型 |
|
||
| `user_id` | BIGINT UNSIGNED | 否 | | 用户ID,关联管理员或客户用户 |
|
||
| `operation` | VARCHAR(255) | 否 | | 操作描述 |
|
||
| `ip_address` | VARCHAR(45) | 是 | NULL | IP地址(支持IPv6) |
|
||
| `created_at` | TIMESTAMP | 否 | 当前时间 | 操作时间 |
|
||
|
||
**索引**:
|
||
|
||
- `INDEX`:`user_type`, `user_id`
|
||
|
||
---
|
||
|
||
## 4. Redis 缓存设计
|
||
|
||
### 4.1 访问令牌存储
|
||
|
||
**描述**:存储客户用户的短期访问令牌,实现高效的令牌验证和自动过期。
|
||
|
||
- **Key 格式**:`access_token:{token}`
|
||
- **Value 内容**:序列化的令牌信息,包括`client_id`、`expires_at`等。
|
||
|
||
**示例**:
|
||
|
||
- **Key**:`access_token:a1b2c3d4e5f6...`
|
||
- **Value**:
|
||
```json
|
||
{
|
||
"client_id": 12345,
|
||
"expires_at": "2023-10-01T12:00:00Z"
|
||
}
|
||
```
|
||
- **过期策略**:设置 `TTL`,令牌将在 `expires_at` 到达时自动过期。
|
||
|
||
### 4.2 令牌注销机制
|
||
|
||
**描述**:支持访问令牌的即时注销,防止被滥用。
|
||
|
||
- **方案**:当需要注销令牌时,直接从 Redis 中删除对应的 `access_token:{token}` 键。
|
||
|
||
- **实现步骤**:
|
||
1. 调用 Redis 的 `DEL` 命令删除指定的令牌键。
|
||
2. 后续的令牌验证中,如令牌不存在或已过期,则拒绝访问。
|
||
|
||
---
|
||
|
||
## 5. 数据库关系图
|
||
|
||
```
|
||
+----------------+ +----------------+ +----------------+
|
||
| admins | | clients | | llm_providers |
|
||
+----------------+ +----------------+ +----------------+
|
||
| id |<----->| id | | id |
|
||
| username | | name | | name |
|
||
| password | | llm_provider_id|<----->| service_name |
|
||
| role | | | | api_url |
|
||
+----------------+ +----------------+ | api_token |
|
||
^ ^ +----------------+
|
||
| |
|
||
| +---------------+
|
||
| |
|
||
+-----------------+
|
||
| admin_client |
|
||
+-----------------+
|
||
| admin_id |
|
||
| client_id |
|
||
+-----------------+
|
||
|
||
+----------------+
|
||
| auth_tokens |
|
||
+----------------+
|
||
| id |
|
||
| client_id |
|
||
| token |
|
||
+----------------+
|
||
|
||
```
|
||
|
||
**说明**:
|
||
|
||
- `admins` 与 `clients` 之间是多对多关系,通过 `admin_client` 关联。
|
||
- `clients` 与 `llm_providers` 是多对一关系,`clients.llm_provider_id` 外键引用 `llm_providers.id`。
|
||
- `clients` 与 `auth_tokens` 是一对多关系,一个客户用户可以有多个认证令牌。
|
||
|
||
---
|
||
|
||
## 6. 总结
|
||
|
||
以上是基于系统设计的数据库规格书,详细描述了 MySQL 中的表结构和 Redis 中的缓存设计。
|
||
|
||
- **MySQL**:
|
||
|
||
- **管理员表**:存储超级管理员和管理员的信息。
|
||
- **客户用户表**:存储客户用户的信息,并绑定 LLM 提供商。
|
||
- **LLM 提供商表**:存储 LLM 提供商的配置和调用信息。
|
||
- **认证令牌表**:存储客户用户的长期认证令牌。
|
||
- **管理员与客户用户关联表**:实现管理员和客户用户的多对多关系。
|
||
- **操作日志表**:记录系统的操作日志,便于审计和追踪。
|
||
|
||
- **Redis**:
|
||
|
||
- **访问令牌存储**:高效存储和验证短期访问令牌,支持自动过期和动态注销。
|
||
|
||
**注意事项**:
|
||
|
||
- 所有涉及敏感信息的字段(如密码、令牌、API Token)在存储时应进行加密或哈希处理,确保数据安全。
|
||
- 数据库的外键约束和索引设计应充分考虑性能和数据完整性。
|
||
- Redis 中的令牌管理应注意内存占用和过期策略,防止缓存过期造成的认证问题。
|
||
|
||
---
|
||
|
||
如有任何疑问或需要进一步的修改和完善,请随时联系数据库设计团队。 |