10 KiB
10 KiB
LLM API 转发平台数据库规格书
目录
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:usernameINDEX: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:nameINDEX: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:tokenINDEX: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:
{ "client_id": 12345, "expires_at": "2023-10-01T12:00:00Z" } - 过期策略:设置
TTL,令牌将在expires_at到达时自动过期。
4.2 令牌注销机制
描述:支持访问令牌的即时注销,防止被滥用。
-
方案:当需要注销令牌时,直接从 Redis 中删除对应的
access_token:{token}键。 -
实现步骤:
- 调用 Redis 的
DEL命令删除指定的令牌键。 - 后续的令牌验证中,如令牌不存在或已过期,则拒绝访问。
- 调用 Redis 的
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 中的令牌管理应注意内存占用和过期策略,防止缓存过期造成的认证问题。
如有任何疑问或需要进一步的修改和完善,请随时联系数据库设计团队。