独家合作CubenceAI 中转平台立减 10%访问

参考文档

数据库 Schema 参考

数据库 Schema 参考

本文档详细说明 Claude Code Hub 的数据库结构设计,包括所有表定义、字段说明、索引策略和表关系。适合需要理解系统数据模型或进行二次开发的开发者参考。


概述

数据库设计原则

Claude Code Hub 采用 PostgreSQL 作为主数据库,使用 Drizzle ORM 管理 Schema 和迁移。数据库设计遵循以下原则:

  1. 软删除模式:所有主要业务表都包含 deletedAt 字段,删除操作仅设置此字段而非物理删除
  2. 时间戳追踪:每个表包含 createdAt 和 updatedAt 字段,自动记录创建和更新时间
  3. 类型安全:使用 Drizzle ORM 的 TypeScript 类型推导,确保代码与数据库结构一致
  4. 索引优化:针对高频查询场景设计复合索引,部分索引使用条件过滤提升效率
  5. JSON 扩展:使用 JSONB 类型存储灵活的配置数据(如模型重定向、决策链)

技术栈

组件说明
数据库PostgreSQL 14+
ORMDrizzle ORM
Schema 位置src/drizzle/schema.ts
迁移文件drizzle/ 目录

表结构总览

Claude Code Hub 包含以下 9 个数据表:

表名说明软删除
users用户信息和配额配置是
keysAPI Key 及其限制配置是
providers上游供应商配置是
message_request请求日志记录是
error_rules错误处理规则否
sensitive_words敏感词过滤规则否
model_prices模型价格数据否
system_settings系统全局设置否
notification_settings通知配置否

users 表

用户表存储系统中所有用户的基本信息和配额配置。

字段定义

字段名类型可空默认值说明
idserial否自增主键
namevarchar否-用户名称
descriptiontext是null用户描述
rolevarchar是'user'角色(user/admin)
rpmLimitinteger是60每分钟请求数限制
dailyLimitUsdnumeric(10,2)是'100.00'每日消费限制(美元)
providerGroupvarchar(50)是null供应商分组标签
limit5hUsdnumeric(10,2)是null5 小时消费限制(美元)
limitWeeklyUsdnumeric(10,2)是null每周消费限制(美元)
limitMonthlyUsdnumeric(10,2)是null每月消费限制(美元)
limitConcurrentSessionsinteger是null并发 Session 限制
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间
deletedAttimestamp(tz)是null软删除时间

索引

索引名字段类型条件说明
idx_users_active_role_sortdeletedAt, role, id复合deletedAt IS NULL优化用户列表查询
idx_users_created_atcreatedAt基础-创建时间查询
idx_users_deleted_atdeletedAt基础-软删除过滤

Schema 代码片段

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: varchar('name').notNull(),
  description: text('description'),
  role: varchar('role').default('user'),
  rpmLimit: integer('rpm_limit').default(60),
  dailyLimitUsd: numeric('daily_limit_usd', { precision: 10, scale: 2 }).default('100.00'),
  providerGroup: varchar('provider_group', { length: 50 }),
  limit5hUsd: numeric('limit_5h_usd', { precision: 10, scale: 2 }),
  limitWeeklyUsd: numeric('limit_weekly_usd', { precision: 10, scale: 2 }),
  limitMonthlyUsd: numeric('limit_monthly_usd', { precision: 10, scale: 2 }),
  limitConcurrentSessions: integer('limit_concurrent_sessions'),
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow(),
  updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow(),
  deletedAt: timestamp('deleted_at', { withTimezone: true }),
}, (table) => ({
  usersActiveRoleSortIdx: index('idx_users_active_role_sort')
    .on(table.deletedAt, table.role, table.id)
    .where(sql`${table.deletedAt} IS NULL`),
  usersCreatedAtIdx: index('idx_users_created_at').on(table.createdAt),
  usersDeletedAtIdx: index('idx_users_deleted_at').on(table.deletedAt),
}));

keys 表

API Key 表存储用户的 API 密钥及其独立的限制配置。

字段定义

字段名类型可空默认值说明
idserial否自增主键
userIdinteger否-关联用户 ID(外键)
keyvarchar否-API Key(SHA-256 哈希存储)
namevarchar否-Key 名称
isEnabledboolean是true是否启用
expiresAttimestamp是null过期时间
canLoginWebUiboolean是true是否允许 Web UI 登录
limit5hUsdnumeric(10,2)是null5 小时消费限制
limitDailyUsdnumeric(10,2)是null每日消费限制
dailyResetModeenum否'fixed'每日重置模式(fixed/rolling)
dailyResetTimevarchar(5)否'00:00'每日重置时间(HH:mm)
limitWeeklyUsdnumeric(10,2)是null每周消费限制
limitMonthlyUsdnumeric(10,2)是null每月消费限制
limitConcurrentSessionsinteger是0并发 Session 限制
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间
deletedAttimestamp(tz)是null软删除时间

枚举类型

export const dailyResetModeEnum = pgEnum('daily_reset_mode', ['fixed', 'rolling']);
值说明
fixed固定时间重置(由 dailyResetTime 指定)
rolling滚动 24 小时窗口

索引

索引名字段类型说明
idx_keys_user_iduserId基础外键查询优化
idx_keys_created_atcreatedAt基础创建时间查询
idx_keys_deleted_atdeletedAt基础软删除过滤

与 users 表的关系

export const keysRelations = relations(keys, ({ one, many }) => ({
  user: one(users, {
    fields: [keys.userId],
    references: [users.id],
  }),
  messageRequests: many(messageRequest),
}));
  • 每个 Key 属于一个 User(多对一)
  • 一个 Key 可以关联多条请求日志(一对多)

providers 表

供应商表存储上游 AI API 供应商的完整配置信息。

基础字段

字段名类型可空默认值说明
idserial否自增主键
namevarchar否-供应商名称
descriptiontext是null描述信息
urlvarchar否-API 端点地址
keyvarchar否-API 密钥
isEnabledboolean否true是否启用
providerTypevarchar(20)否'claude'供应商类型

供应商类型(providerType)

值说明认证方式
claudeAnthropic 官方 APIx-api-key + Bearer
claude-authClaude 中转服务仅 Bearer Token
codexOpenAI Codex/Response APIBearer Token
geminiGoogle Gemini APIAPI Key
gemini-cliGemini CLI 格式API Key
openai-compatibleOpenAI 兼容 APIBearer Token

调度相关字段

字段名类型可空默认值说明
weightinteger否1权重(1-100)
priorityinteger否0优先级(越小越优先)
costMultipliernumeric(10,4)是'1.0'成本系数
groupTagvarchar(50)是null分组标签

限制字段

字段名类型可空默认值说明
limit5hUsdnumeric(10,2)是null5 小时消费限制
limitDailyUsdnumeric(10,2)是null每日消费限制
dailyResetModeenum否'fixed'每日重置模式
dailyResetTimevarchar(5)否'00:00'每日重置时间
limitWeeklyUsdnumeric(10,2)是null每周消费限制
limitMonthlyUsdnumeric(10,2)是null每月消费限制
limitConcurrentSessionsinteger是0并发 Session 限制

熔断器字段

字段名类型可空默认值说明
circuitBreakerFailureThresholdinteger是5触发熔断的失败次数
circuitBreakerOpenDurationinteger是1800000熔断持续时间(毫秒,默认 30 分钟)
circuitBreakerHalfOpenSuccessThresholdinteger是2恢复需要的成功次数

超时配置字段

字段名类型可空默认值说明
firstByteTimeoutStreamingMsinteger否0流式首字节超时(毫秒,0=不限制)
streamingIdleTimeoutMsinteger否0流式空闲超时(毫秒,0=不限制)
requestTimeoutNonStreamingMsinteger否0非流式总超时(毫秒,0=不限制)

代理配置字段

字段名类型可空默认值说明
proxyUrlvarchar(512)是null代理服务器地址
proxyFallbackToDirectboolean是false代理失败时降级直连

模型配置字段

字段名类型可空默认值说明
modelRedirectsjsonb是null模型名称重定向映射
allowedModelsjsonb是null允许的模型列表
joinClaudePoolboolean是false加入 Claude 调度池

特性配置字段

字段名类型可空默认值说明
codexInstructionsStrategyvarchar(20)是'auto'Codex instructions 策略
mcpPassthroughTypevarchar(20)否'none'MCP 透传类型
mcpPassthroughUrlvarchar(512)是nullMCP 服务 URL

元数据字段

字段名类型可空默认值说明
websiteUrltext是null供应商官网地址
faviconUrltext是null网站图标 URL
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间
deletedAttimestamp(tz)是null软删除时间

废弃字段(保留向后兼容)

字段名类型说明
tpmintegerTokens Per Minute(已废弃)
rpmintegerRequests Per Minute(已废弃)
rpdintegerRequests Per Day(已废弃)
ccintegerConcurrent Connections(已废弃)

索引

索引名字段类型条件说明
idx_providers_enabled_priorityisEnabled, priority, weight复合deletedAt IS NULL优化供应商选择查询
idx_providers_groupgroupTag基础deletedAt IS NULL分组查询优化
idx_providers_created_atcreatedAt基础-创建时间查询
idx_providers_deleted_atdeletedAt基础-软删除过滤

message_request 表

请求日志表记录所有经过代理的 API 请求详情。

字段定义

字段名类型可空默认值说明
idserial否自增主键
providerIdinteger否-供应商 ID(外键)
userIdinteger否-用户 ID(外键)
keyvarchar否-使用的 API Key
modelvarchar(128)是null实际使用的模型
originalModelvarchar(128)是null原始请求模型(重定向前)
sessionIdvarchar(64)是nullSession ID
durationMsinteger是null请求耗时(毫秒)
costUsdnumeric(21,15)是'0'消费金额(美元)
costMultipliernumeric(10,4)是null使用的成本系数
statusCodeinteger是nullHTTP 状态码
apiTypevarchar(20)是nullAPI 类型(response/openai)
endpointvarchar(256)是null请求端点路径
inputTokensinteger是null输入 Token 数
outputTokensinteger是null输出 Token 数
cacheCreationInputTokensinteger是null缓存创建 Token 数
cacheReadInputTokensinteger是null缓存读取 Token 数
errorMessagetext是null错误信息
blockedByvarchar(50)是null拦截类型
blockedReasontext是null拦截原因
userAgentvarchar(512)是null客户端 User-Agent
messagesCountinteger是null消息数量
providerChainjsonb是null决策链记录
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间
deletedAttimestamp(tz)是null软删除时间

providerChain JSON 字段

providerChain 字段记录请求的供应商决策链,格式为 JSON 数组:

type ProviderChain = Array<{
  id: number;    // 供应商 ID
  name: string;  // 供应商名称
}>;

示例:

[
  { "id": 1, "name": "主力 Claude API" },
  { "id": 2, "name": "备用 Claude API" }
]

这表示请求首先尝试了供应商 1,失败后自动切换到供应商 2。

索引

索引名字段类型条件说明
idx_message_request_user_date_costuserId, createdAt, costUsd复合deletedAt IS NULL统计查询优化
idx_message_request_user_queryuserId, createdAt复合deletedAt IS NULL用户日志查询
idx_message_request_session_idsessionId基础deletedAt IS NULLSession 聚合查询
idx_message_request_endpointendpoint基础deletedAt IS NULL端点过滤查询
idx_message_request_provider_idproviderId基础-供应商关联查询
idx_message_request_user_iduserId基础-用户关联查询
idx_message_request_keykey基础-Key 关联查询
idx_message_request_created_atcreatedAt基础-时间范围查询
idx_message_request_deleted_atdeletedAt基础-软删除过滤

error_rules 表

错误规则表定义错误响应的匹配和处理规则。

字段定义

字段名类型可空默认值说明
idserial否自增主键
patterntext否-匹配模式
matchTypevarchar(20)否'regex'匹配类型(regex/contains/exact)
categoryvarchar(50)否-规则分类
descriptiontext是null规则描述
overrideResponsejsonb是null覆写响应体
overrideStatusCodeinteger是null覆写状态码
isEnabledboolean否true是否启用
isDefaultboolean否false是否为默认规则
priorityinteger否0优先级
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间

匹配类型(matchType)

值说明
regex正则表达式匹配
contains包含匹配
exact精确匹配

overrideResponse JSON 字段

覆写响应体格式参考 Claude API 错误格式:

{
  "type": "error",
  "error": {
    "type": "overloaded_error",
    "message": "供应商繁忙,请稍后重试"
  }
}

索引

索引名字段类型说明
idx_error_rules_enabledisEnabled, priority复合启用规则查询
unique_patternpattern唯一模式唯一性约束
idx_categorycategory基础分类查询
idx_match_typematchType基础类型查询

sensitive_words 表

敏感词表存储内容过滤规则。

字段定义

字段名类型可空默认值说明
idserial否自增主键
wordvarchar(255)否-敏感词/模式
matchTypevarchar(20)否'contains'匹配类型
descriptiontext是null规则描述
isEnabledboolean否true是否启用
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间

索引

索引名字段类型说明
idx_sensitive_words_enabledisEnabled, matchType复合启用规则查询
idx_sensitive_words_created_atcreatedAt基础时间查询

model_prices 表

模型价格表存储各模型的计费信息。

字段定义

字段名类型可空默认值说明
idserial否自增主键
modelNamevarchar否-模型名称
priceDatajsonb否-价格数据
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间

priceData JSON 字段

价格数据为 JSON 对象,包含输入/输出 Token 价格:

{
  "input_cost_per_token": 0.000003,
  "output_cost_per_token": 0.000015,
  "cache_creation_input_token_cost": 0.00000375,
  "cache_read_input_token_cost": 0.0000003
}

索引

索引名字段类型说明
idx_model_prices_latestmodelName, createdAt DESC复合获取最新价格
idx_model_prices_model_namemodelName基础模型查询
idx_model_prices_created_atcreatedAt DESC基础时间排序

system_settings 表

系统设置表存储全局配置项(单行记录)。

字段定义

字段名类型可空默认值说明
idserial否自增主键
siteTitlevarchar(128)否'Claude Code Hub'站点标题
allowGlobalUsageViewboolean否false允许查看全局使用统计
currencyDisplayvarchar(10)否'USD'货币显示单位
billingModelSourcevarchar(20)否'original'计费模型来源(original/redirected)
enableAutoCleanupboolean是false启用自动清理
cleanupRetentionDaysinteger是30日志保留天数
cleanupSchedulevarchar(50)是'0 2 * * *'清理 Cron 表达式
cleanupBatchSizeinteger是10000清理批次大小
enableClientVersionCheckboolean否false启用客户端版本检查
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间

notification_settings 表

通知设置表存储企业微信机器人通知配置(单行记录)。

字段定义

字段名类型可空默认值说明
idserial否自增主键
enabledboolean否false全局通知开关
circuitBreakerEnabledboolean否false熔断器告警开关
circuitBreakerWebhookvarchar(512)是null熔断器告警 Webhook
dailyLeaderboardEnabledboolean否false每日排行榜开关
dailyLeaderboardWebhookvarchar(512)是null排行榜 Webhook
dailyLeaderboardTimevarchar(10)是'09:00'发送时间(HH:mm)
dailyLeaderboardTopNinteger是5显示前 N 名
costAlertEnabledboolean否false成本预警开关
costAlertWebhookvarchar(512)是null成本预警 Webhook
costAlertThresholdnumeric(5,2)是'0.80'预警阈值(0-1)
costAlertCheckIntervalinteger是60检查间隔(分钟)
createdAttimestamp(tz)是now()创建时间
updatedAttimestamp(tz)是now()更新时间

表关系图

ER 图(Mermaid)

erDiagram
    users ||--o{ keys : "has"
    users ||--o{ message_request : "creates"
    keys ||--o{ message_request : "used_in"
    providers ||--o{ message_request : "handles"

    users {
        serial id PK
        varchar name
        varchar role
        numeric dailyLimitUsd
        varchar providerGroup
        timestamp deletedAt
    }

    keys {
        serial id PK
        integer userId FK
        varchar key
        varchar name
        boolean isEnabled
        timestamp expiresAt
        timestamp deletedAt
    }

    providers {
        serial id PK
        varchar name
        varchar url
        varchar key
        boolean isEnabled
        integer weight
        integer priority
        varchar providerType
        timestamp deletedAt
    }

    message_request {
        serial id PK
        integer providerId FK
        integer userId FK
        varchar key
        varchar model
        numeric costUsd
        varchar sessionId
        jsonb providerChain
        timestamp deletedAt
    }

    error_rules {
        serial id PK
        text pattern
        varchar matchType
        varchar category
        boolean isEnabled
    }

    sensitive_words {
        serial id PK
        varchar word
        varchar matchType
        boolean isEnabled
    }

    model_prices {
        serial id PK
        varchar modelName
        jsonb priceData
    }

    system_settings {
        serial id PK
        varchar siteTitle
        boolean enableAutoCleanup
    }

    notification_settings {
        serial id PK
        boolean enabled
        varchar circuitBreakerWebhook
    }

ASCII 关系图

┌─────────────────┐     ┌─────────────────┐
│     users       │     │    providers    │
├─────────────────┤     ├─────────────────┤
│ id (PK)         │     │ id (PK)         │
│ name            │     │ name            │
│ role            │     │ url             │
│ dailyLimitUsd   │     │ key             │
│ providerGroup   │     │ weight          │
│ deletedAt       │     │ priority        │
└────────┬────────┘     │ providerType    │
         │              │ deletedAt       │
         │              └────────┬────────┘
         │                       │
         │ 1:N                   │ 1:N
         ▼                       ▼
┌─────────────────┐     ┌─────────────────┐
│      keys       │     │ message_request │
├─────────────────┤     ├─────────────────┤
│ id (PK)         │     │ id (PK)         │
│ userId (FK)     │────▶│ userId (FK)     │
│ key             │     │ providerId (FK) │◀────┘
│ name            │     │ key             │
│ isEnabled       │     │ model           │
│ deletedAt       │     │ sessionId       │
└─────────────────┘     │ costUsd         │
                        │ providerChain   │
                        │ deletedAt       │
                        └─────────────────┘

关系说明

关系类型说明
users → keys一对多一个用户可以有多个 API Key
users → message_request一对多一个用户可以有多条请求记录
keys → message_request一对多一个 Key 可以有多条请求记录
providers → message_request一对多一个供应商可以处理多条请求

索引策略

索引设计原则

  1. 条件索引:对于软删除表,大部分索引添加 WHERE deletedAt IS NULL 条件,减少索引体积
  2. 复合索引:针对高频查询组合设计复合索引,遵循最左前缀原则
  3. 降序索引:时间相关字段使用降序索引,优化"最新记录"查询

核心索引汇总

表索引用途
usersidx_users_active_role_sort用户列表分页查询
providersidx_providers_enabled_priority供应商选择算法
message_requestidx_message_request_user_date_cost用户消费统计
message_requestidx_message_request_session_idSession 会话聚合
model_pricesidx_model_prices_latest获取最新价格

索引维护建议

  • 定期运行 ANALYZE 更新统计信息
  • 监控慢查询日志,评估是否需要新增索引
  • 大表考虑使用 pg_repack 清理碎片

迁移管理

Drizzle 迁移文件

迁移文件位于 drizzle/ 目录,按序号命名:

drizzle/
├── 0000_legal_brother_voodoo.sql    # 初始 Schema
├── 0001_ambiguous_bromley.sql       # ...
├── 0002_fancy_preak.sql
├── ...
└── 0021_broad_black_panther.sql     # 最新迁移

迁移命令

# 生成新迁移(检测 Schema 变更)
bun run drizzle:generate

# 执行迁移
bun run drizzle:migrate

# 查看迁移状态
bun run drizzle:status

# 推送 Schema(开发环境,直接同步不生成迁移)
bun run drizzle:push

AUTO_MIGRATE 配置

值行为适用场景
true启动时自动执行迁移开发环境、首次部署
false跳过自动迁移生产环境(手动控制)

生产环境迁移

生产环境建议:

  1. 首次部署时设置 AUTO_MIGRATE=true 完成初始化
  2. 后续设置为 false,手动执行迁移并备份数据
  3. 重大迁移前务必进行数据备份

迁移最佳实践

  1. 版本控制:迁移文件纳入 Git 管理
  2. 原子迁移:每次迁移只做一件事
  3. 可回滚:复杂迁移提供回滚脚本
  4. 测试验证:迁移前在测试环境验证

相关文档

Previous
Server Actions API