From 106d3e4b4abfd542b2fc0e922bce6594e36319be Mon Sep 17 00:00:00 2001 From: fengsilin Date: Mon, 30 Mar 2026 09:18:06 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=A1=A8=E7=BB=93=E6=9E=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 详细记录 27 个数据库表的字段说明,包括用户、令牌、渠道、日志、订阅、定价等核心表结构。 Co-Authored-By: Claude --- docs/DATABASE_SCHEMA.md | 719 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 719 insertions(+) create mode 100644 docs/DATABASE_SCHEMA.md diff --git a/docs/DATABASE_SCHEMA.md b/docs/DATABASE_SCHEMA.md new file mode 100644 index 0000000..fb541ff --- /dev/null +++ b/docs/DATABASE_SCHEMA.md @@ -0,0 +1,719 @@ +# New-API 数据库表结构文档 + +本文档记录了 New-API 项目中所有数据库表及其字段的详细说明。 + +--- + +## 目录 + +1. [users - 用户表](#1-users---用户表) +2. [tokens - 令牌表](#2-tokens---令牌表) +3. [channels - 渠道表](#3-channels---渠道表) +4. [logs - 日志表](#4-logs---日志表) +5. [options - 系统配置表](#5-options---系统配置表) +6. [redemptions - 兑换码表](#6-redemptions---兑换码表) +7. [top_ups - 充值记录表](#7-top_ups---充值记录表) +8. [tasks - 异步任务表](#8-tasks---异步任务表) +9. [midjourneys - Midjourney任务表](#9-midjourneys---midjourney任务表) +10. [abilities - 渠道能力表](#10-abilities---渠道能力表) +11. [setups - 系统初始化表](#11-setups---系统初始化表) +12. [two_fas - 双因素认证表](#12-two_fas---双因素认证表) +13. [two_fa_backup_codes - 2FA备用码表](#13-two_fa_backup_codes---2fa备用码表) +14. [checkins - 签到记录表](#14-checkins---签到记录表) +15. [passkey_credentials - Passkey凭证表](#15-passkey_credentials---passkey凭证表) +16. [quota_data - 额度数据统计表](#16-quota_data---额度数据统计表) +17. [subscription_plans - 订阅计划表](#17-subscription_plans---订阅计划表) +18. [subscription_orders - 订阅订单表](#18-subscription_orders---订阅订单表) +19. [user_subscriptions - 用户订阅表](#19-user_subscriptions---用户订阅表) +20. [subscription_pre_consume_records - 订阅预消费记录表](#20-subscription_pre_consume_records---订阅预消费记录表) +21. [custom_oauth_providers - 自定义OAuth提供商表](#21-custom_oauth_providers---自定义oauth提供商表) +22. [user_oauth_bindings - 用户OAuth绑定表](#22-user_oauth_bindings---用户oauth绑定表) +23. [vendors - 供应商表](#23-vendors---供应商表) +24. [models - 模型元数据表](#24-models---模型元数据表) +25. [prefill_groups - 预填充组表](#25-prefill_groups---预填充组表) +26. [channel_pricings - 渠道定价表](#26-channel_pricings---渠道定价表) +27. [pricing_tags - 定价标签表](#27-pricing_tags---定价标签表) +28. [表关系图](#表关系图) + +--- + +## 1. users - 用户表 + +存储系统用户信息。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| username | string | 用户名,唯一索引 | +| password | string | 密码(哈希存储) | +| display_name | string | 显示名称 | +| role | int | 角色:1=普通用户,10=管理员,100=超级管理员 | +| status | int | 状态:1=启用 | +| email | string | 邮箱 | +| github_id | string | GitHub OAuth ID | +| discord_id | string | Discord OAuth ID | +| oidc_id | string | OIDC OAuth ID | +| wechat_id | string | 微信 OAuth ID | +| telegram_id | string | Telegram OAuth ID | +| access_token | *string | 系统管理访问令牌(32字符,唯一) | +| quota | int | 用户配额/额度 | +| used_quota | int | 已使用的配额 | +| request_count | int | 请求次数 | +| group | string | 用户分组(默认 'default') | +| aff_code | string | 邀请码(唯一) | +| aff_count | int | 邀请人数 | +| aff_quota | int | 邀请剩余额度 | +| aff_history_quota | int | 邀请历史总额度 | +| inviter_id | int | 邀请人ID | +| linux_do_id | string | LinuxDO OAuth ID | +| setting | string | 用户设置(JSON格式) | +| remark | string | 备注 | +| stripe_customer | string | Stripe客户ID | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 2. tokens - 令牌表 + +存储用户的 API 令牌。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| key | string | 令牌密钥(48字符,唯一) | +| status | int | 状态:1=启用 | +| name | string | 令牌名称 | +| created_time | int64 | 创建时间(Unix时间戳) | +| accessed_time | int64 | 最后访问时间 | +| expired_time | int64 | 过期时间(-1表示永不过期) | +| remain_quota | int | 剩余额度 | +| unlimited_quota | bool | 是否无限额度 | +| model_limits_enabled | bool | 是否启用模型限制 | +| model_limits | string | 模型限制列表(逗号分隔) | +| allow_ips | *string | 允许的IP列表 | +| used_quota | int | 已使用额度 | +| group | string | 令牌分组 | +| cross_group_retry | bool | 跨分组重试 | +| bound_channel_id | int | 绑定的渠道ID(指定令牌只能使用该渠道) | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 3. channels - 渠道表 + +存储 API 服务商渠道配置。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| type | int | 渠道类型(OpenAI=1, Azure=2等) | +| key | string | API密钥 | +| openai_organization | *string | OpenAI组织ID | +| test_model | *string | 测试模型 | +| status | int | 状态:1=启用 | +| name | string | 渠道名称 | +| weight | *uint | 权重(负载均衡用) | +| created_time | int64 | 创建时间 | +| test_time | int64 | 最后测试时间 | +| response_time | int | 响应时间(毫秒) | +| base_url | *string | 基础URL | +| other | string | 其他信息 | +| balance | float64 | 余额(美元) | +| balance_updated_time | int64 | 余额更新时间 | +| models | string | 支持的模型列表 | +| group | string | 渠道分组 | +| used_quota | int64 | 已使用额度 | +| model_mapping | *string | 模型映射(JSON) | +| status_code_mapping | *string | 状态码映射 | +| priority | *int64 | 优先级 | +| auto_ban | *int | 是否自动封禁 | +| other_info | string | 其他信息(JSON) | +| tag | *string | 标签 | +| setting | *string | 渠道额外设置(JSON) | +| param_override | *string | 参数覆盖(JSON) | +| header_override | *string | 请求头覆盖(JSON) | +| remark | *string | 备注 | +| channel_info | ChannelInfo | 渠道信息(JSON,多Key模式配置) | +| settings | string | 其他设置 | + +--- + +## 4. logs - 日志表 + +记录用户请求日志和系统日志。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| created_at | int64 | 创建时间(Unix时间戳) | +| type | int | 日志类型:0=未知,1=充值,2=消费,3=管理,4=系统,5=错误,6=退款 | +| content | string | 日志内容 | +| username | string | 用户名 | +| token_name | string | 令牌名称 | +| model_name | string | 模型名称 | +| quota | int | 消耗额度 | +| prompt_tokens | int | 提示词Token数 | +| completion_tokens | int | 完成Token数 | +| use_time | int | 使用时间 | +| is_stream | bool | 是否流式请求 | +| channel_id | int | 渠道ID(索引) | +| token_id | int | 令牌ID(索引) | +| group | string | 分组 | +| ip | string | 请求IP | +| request_id | string | 请求ID(唯一) | +| other | string | 其他信息(JSON) | + +--- + +## 5. options - 系统配置表 + +存储系统级配置项。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| key | string | 配置键(主键) | +| value | string | 配置值 | + +--- + +## 6. redemptions - 兑换码表 + +存储额度兑换码。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 创建者用户ID | +| key | string | 兑换码(32字符,唯一) | +| status | int | 状态:1=启用,2=已使用,3=已禁用 | +| name | string | 兑换码名称 | +| quota | int | 额度值 | +| created_time | int64 | 创建时间 | +| redeemed_time | int64 | 兑换时间 | +| used_user_id | int | 使用者用户ID | +| expired_time | int64 | 过期时间(0=永不过期) | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 7. top_ups - 充值记录表 + +记录用户充值订单。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| amount | int64 | 充值额度 | +| money | float64 | 支付金额 | +| trade_no | string | 交易号(唯一,索引) | +| payment_method | string | 支付方式 | +| create_time | int64 | 创建时间 | +| complete_time | int64 | 完成时间 | +| status | string | 状态:pending/success/failed | + +--- + +## 8. tasks - 异步任务表 + +存储异步任务(如视频生成等)。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int64 | 主键,自增ID | +| created_at | int64 | 创建时间(索引) | +| updated_at | int64 | 更新时间 | +| task_id | string | 任务ID(对外暴露,索引) | +| platform | string | 平台类型(索引) | +| user_id | int | 用户ID(索引) | +| group | string | 分组 | +| channel_id | int | 渠道ID(索引) | +| quota | int | 消耗额度 | +| action | string | 任务类型(索引) | +| status | string | 任务状态(索引) | +| fail_reason | string | 失败原因 | +| submit_time | int64 | 提交时间(索引) | +| start_time | int64 | 开始时间(索引) | +| finish_time | int64 | 完成时间(索引) | +| progress | string | 进度(索引) | +| properties | json | 任务属性 | +| private_data | json | 私有数据(含Key、计费上下文等) | +| data | json | 任务数据 | + +--- + +## 9. midjourneys - Midjourney任务表 + +存储 Midjourney 图片生成任务。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| code | int | 响应码 | +| user_id | int | 用户ID(索引) | +| action | string | 动作类型(索引) | +| mj_id | string | Midjourney ID(索引) | +| prompt | string | 提示词 | +| prompt_en | string | 英文提示词 | +| description | string | 描述 | +| state | string | 状态 | +| submit_time | int64 | 提交时间(索引) | +| start_time | int64 | 开始时间(索引) | +| finish_time | int64 | 完成时间(索引) | +| image_url | string | 图片URL | +| video_url | string | 视频URL | +| video_urls | string | 多个视频URL | +| status | string | 状态(索引) | +| progress | string | 进度(索引) | +| fail_reason | string | 失败原因 | +| channel_id | int | 渠道ID | +| quota | int | 消耗额度 | +| buttons | string | 操作按钮(JSON) | +| properties | string | 属性(JSON) | + +--- + +## 10. abilities - 渠道能力表 + +记录各渠道对不同模型的支持能力。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| group | string | 分组(主键之一) | +| model | string | 模型名称(主键之一) | +| channel_id | int | 渠道ID(主键之一,索引) | +| enabled | bool | 是否启用 | +| priority | *int64 | 优先级(索引) | +| weight | uint | 权重(索引) | +| tag | *string | 标签(索引) | + +--- + +## 11. setups - 系统初始化表 + +记录系统初始化状态。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | uint | 主键 | +| version | string | 系统版本号 | +| initialized_at | int64 | 初始化时间 | + +--- + +## 12. two_fas - 双因素认证表 + +存储用户的双因素认证设置。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(唯一,索引) | +| secret | string | TOTP密钥 | +| is_enabled | bool | 是否启用 | +| failed_attempts | int | 失败尝试次数 | +| locked_until | *time.Time | 锁定截止时间 | +| last_used_at | *time.Time | 最后使用时间 | +| created_at | time.Time | 创建时间 | +| updated_at | time.Time | 更新时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 13. two_fa_backup_codes - 2FA备用码表 + +存储双因素认证的备用恢复码。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| code_hash | string | 备用码哈希 | +| is_used | bool | 是否已使用 | +| used_at | *time.Time | 使用时间 | +| created_at | time.Time | 创建时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 14. checkins - 签到记录表 + +记录用户每日签到。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(联合唯一索引) | +| checkin_date | string | 签到日期 YYYY-MM-DD(联合唯一索引) | +| quota_awarded | int | 奖励额度 | +| created_at | int64 | 创建时间 | + +--- + +## 15. passkey_credentials - Passkey凭证表 + +存储用户的 Passkey/WebAuthn 凭证。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(唯一索引) | +| credential_id | string | 凭证ID(base64,唯一) | +| public_key | string | 公钥(base64) | +| attestation_type | string | 证明类型 | +| aaguid | string | AAGUID(base64) | +| sign_count | uint32 | 签名计数 | +| clone_warning | bool | 克隆警告 | +| user_present | bool | 用户在场标志 | +| user_verified | bool | 用户已验证标志 | +| backup_eligible | bool | 备份资格 | +| backup_state | bool | 备份状态 | +| transports | string | 传输方式(JSON) | +| attachment | string | 附件类型 | +| last_used_at | *time.Time | 最后使用时间 | +| created_at | time.Time | 创建时间 | +| updated_at | time.Time | 更新时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 16. quota_data - 额度数据统计表 + +用于统计分析用户的额度使用情况。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| username | string | 用户名 | +| model_name | string | 模型名称 | +| created_at | int64 | 创建时间(Unix时间戳) | +| token_used | int | Token使用量 | +| count | int | 请求次数 | +| quota | int | 消耗额度 | + +--- + +## 17. subscription_plans - 订阅计划表 + +存储可购买的订阅套餐。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| title | string | 套餐标题 | +| subtitle | string | 副标题 | +| price_amount | float64 | 价格金额 | +| currency | string | 货币(默认USD) | +| duration_unit | string | 时长单位:year/month/day/hour/custom | +| duration_value | int | 时长数值 | +| custom_seconds | int64 | 自定义秒数 | +| enabled | bool | 是否启用 | +| sort_order | int | 排序顺序 | +| stripe_price_id | string | Stripe价格ID | +| creem_product_id | string | Creem产品ID | +| max_purchase_per_user | int | 每用户最大购买次数 | +| upgrade_group | string | 升级到的用户组 | +| total_amount | int64 | 总额度 | +| quota_reset_period | string | 额度重置周期 | +| quota_reset_custom_seconds | int64 | 自定义重置秒数 | +| created_at | int64 | 创建时间 | +| updated_at | int64 | 更新时间 | + +--- + +## 18. subscription_orders - 订阅订单表 + +记录订阅购买订单。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| plan_id | int | 计划ID(索引) | +| money | float64 | 支付金额 | +| trade_no | string | 交易号(唯一,索引) | +| payment_method | string | 支付方式 | +| status | string | 状态 | +| create_time | int64 | 创建时间 | +| complete_time | int64 | 完成时间 | +| provider_payload | string | 支付提供商数据 | + +--- + +## 19. user_subscriptions - 用户订阅表 + +记录用户购买的订阅。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| plan_id | int | 计划ID(索引) | +| amount_total | int64 | 总额度 | +| amount_used | int64 | 已使用额度 | +| start_time | int64 | 开始时间 | +| end_time | int64 | 结束时间(索引) | +| status | string | 状态 | +| source | string | 来源:order/admin | +| last_reset_time | int64 | 上次重置时间 | +| next_reset_time | int64 | 下次重置时间(索引) | +| upgrade_group | string | 升级到的分组 | +| prev_user_group | string | 之前用户分组 | +| created_at | int64 | 创建时间 | +| updated_at | int64 | 更新时间 | + +--- + +## 20. subscription_pre_consume_records - 订阅预消费记录表 + +记录订阅的预消费额度,用于流式请求的额度控制。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| request_id | string | 请求ID(唯一索引) | +| user_id | int | 用户ID(索引) | +| user_subscription_id | int | 用户订阅ID(索引) | +| pre_consumed | int64 | 预消费额度 | +| status | string | 状态:consumed/refunded | +| created_at | int64 | 创建时间 | +| updated_at | int64 | 更新时间(索引) | + +--- + +## 21. custom_oauth_providers - 自定义OAuth提供商表 + +存储自定义的 OAuth 登录提供商配置。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| name | string | 显示名称 | +| slug | string | URL标识符(唯一) | +| icon | string | 图标名称 | +| enabled | bool | 是否启用 | +| client_id | string | OAuth客户端ID | +| client_secret | string | OAuth客户端密钥 | +| authorization_endpoint | string | 授权URL | +| token_endpoint | string | Token交换URL | +| user_info_endpoint | string | 用户信息URL | +| scopes | string | OAuth权限范围 | +| user_id_field | string | 用户ID字段路径 | +| username_field | string | 用户名字段路径 | +| display_name_field | string | 显示名称字段路径 | +| email_field | string | 邮箱字段路径 | +| well_known | string | OIDC发现端点 | +| auth_style | int | 认证样式 | +| access_policy | string | 访问控制策略(JSON) | +| access_denied_message | string | 访问拒绝消息 | +| created_at | time.Time | 创建时间 | +| updated_at | time.Time | 更新时间 | + +--- + +## 22. user_oauth_bindings - 用户OAuth绑定表 + +记录用户与第三方 OAuth 账号的绑定关系。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| user_id | int | 用户ID(索引) | +| provider_id | int | 提供商ID(索引) | +| provider_user_id | string | 提供商用户ID(索引) | +| created_at | time.Time | 创建时间 | +| updated_at | time.Time | 更新时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 23. vendors - 供应商表 + +存储 AI 模型供应商信息。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| name | string | 供应商名称 | +| description | string | 描述 | +| icon | string | 图标 | +| status | int | 状态:1=启用,0=禁用 | +| created_time | int64 | 创建时间 | +| updated_time | int64 | 更新时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 24. models - 模型元数据表 + +存储 AI 模型的元数据信息(**注意:不存储价格,价格在 channel_pricings 表或全局配置中**)。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| model_name | string | 模型名称 | +| description | string | 描述 | +| icon | string | 图标 | +| tags | string | 标签 | +| type | int | 模型类型:1=Chat, 2=Image, 3=Audio, 4=Video, 5=Embedding, 6=Rerank, 7=Vision, 8=Other | +| vendor_id | int | 供应商ID | +| endpoints | string | 支持的端点(JSON) | +| status | int | 状态:1=启用,0=禁用 | +| sync_official | int | 是否同步官方 | +| name_rule | int | 名称匹配规则:0=精确匹配,1=前缀匹配,2=包含匹配,3=后缀匹配 | +| created_time | int64 | 创建时间 | +| updated_time | int64 | 更新时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 25. prefill_groups - 预填充组表 + +存储预设的提示词/内容组。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| name | string | 组名称(唯一,索引) | +| type | string | 组类型(索引) | +| items | json | 组项目列表 | +| description | string | 描述 | +| created_time | int64 | 创建时间 | +| updated_time | int64 | 更新时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 26. channel_pricings - 渠道定价表 + +存储各渠道的模型定价配置。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| model_name | string | 模型名称(联合唯一索引) | +| channel_id | int | 渠道ID(联合唯一索引,索引) | +| quota_type | int | 计费类型:0=按Token,1=按次 | +| model_ratio | float64 | 模型倍率 | +| completion_ratio | float64 | 完成倍率 | +| model_price | float64 | 模型价格 | +| tag_ids | string | 关联的定价标签ID列表(逗号分隔) | +| created_time | int64 | 创建时间(Unix时间戳) | +| updated_time | int64 | 更新时间(Unix时间戳) | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 27. pricing_tags - 定价标签表 + +存储定价分类标签。 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | int | 主键,自增ID | +| name | string | 标签名称(唯一) | +| color | string | 颜色(默认#1890ff) | +| description | string | 描述 | +| sort_order | int | 排序顺序 | +| created_time | int64 | 创建时间 | +| deleted_at | gorm.DeletedAt | 软删除时间 | + +--- + +## 表关系图 + +### 核心关系 + +``` +┌─────────────┐ ┌─────────────┐ +│ users │───1:N─│ tokens │ +└─────────────┘ └─────────────┘ + │ + │ 1:N + ▼ +┌─────────────┐ ┌─────────────┐ +│ logs │ │ top_ups │ +└─────────────┘ └─────────────┘ + +┌─────────────┐ ┌─────────────┐ +│ channels │───1:N─│ abilities │ +└─────────────┘ └─────────────┘ + │ + │ 1:N + ▼ +┌──────────────────┐ +│ channel_pricings │ +└──────────────────┘ +``` + +### 订阅系统关系 + +``` +┌───────────────────┐ +│ subscription_plans│ +└─────────┬─────────┘ + │ + ┌─────┴─────┐ + │ 1:N │ 1:N + ▼ ▼ +┌───────────────┐ ┌──────────────────┐ +│subscription_ │ │ user_subscriptions│ +│ orders │ └───────────────────┘ +└───────────────┘ │ + │ 1:N + ▼ + ┌──────────────────────────┐ + │ subscription_pre_consume │ + │ _records │ + └──────────────────────────┘ +``` + +### OAuth 系统关系 + +``` +┌────────────────────────┐ +│ custom_oauth_providers │ +└───────────┬────────────┘ + │ 1:N + ▼ +┌───────────────────────┐ ┌─────────────┐ +│ user_oauth_bindings │─────│ users │ +└───────────────────────┘ └─────────────┘ +``` + +### 模型元数据关系 + +``` +┌─────────────┐ ┌─────────────┐ +│ vendors │───1:N─│ models │ +└─────────────┘ └─────────────┘ +``` + +--- + +## 完整关系列表 + +| 主表 | 从表 | 关系 | 说明 | +|------|------|------|------| +| users | tokens | 1:N | 一个用户可有多个令牌 | +| users | logs | 1:N | 一个用户可有多条日志 | +| users | top_ups | 1:N | 一个用户可有多条充值记录 | +| users | redemptions | 1:N | 一个用户创建的兑换码 | +| users | tasks | 1:N | 一个用户可有多个任务 | +| users | midjourneys | 1:N | 一个用户可有多个MJ任务 | +| users | checkins | 1:N | 一个用户可有多条签到记录 | +| users | two_fas | 1:1 | 一个用户可有一个2FA设置 | +| users | passkey_credentials | 1:1 | 一个用户可有一个Passkey | +| users | user_subscriptions | 1:N | 一个用户可有多个订阅 | +| users | user_oauth_bindings | 1:N | 一个用户可绑定多个OAuth | +| channels | abilities | 1:N | 一个渠道可有多个能力记录 | +| channels | channel_pricings | 1:N | 一个渠道可有多个模型定价 | +| channels | tokens | 1:N | 一个渠道可被多个令牌绑定(可选,通过 bound_channel_id) | +| subscription_plans | subscription_orders | 1:N | 一个计划可有多个订单 | +| subscription_plans | user_subscriptions | 1:N | 一个计划可有多个用户订阅 | +| custom_oauth_providers | user_oauth_bindings | 1:N | 一个提供商可有多个绑定 | +| vendors | models | 1:N | 一个供应商可有多个模型 | +| pricing_tags | channel_pricings | N:M | 定价标签与渠道定价多对多(通过 tag_ids) |