# 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 | 兑换码名称 |
| remark | 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） |
