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

参考文档

数据库 Schema 参考

数据库 Schema 参考

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


概述

数据库设计原则

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

  1. 软删除模式:所有主要业务表都包含 deletedAt 字段,删除操作仅设置此字段而非物理删除
  2. 时间戳追踪:每个表包含 createdAtupdatedAt 字段,自动记录创建和更新时间
  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-用户名称
descriptiontextnull用户描述
rolevarchar'user'角色(user/admin)
rpmLimitinteger60每分钟请求数限制
dailyLimitUsdnumeric(10,2)'100.00'每日消费限制(美元)
providerGroupvarchar(50)null供应商分组标签
limit5hUsdnumeric(10,2)null5 小时消费限制(美元)
limitWeeklyUsdnumeric(10,2)null每周消费限制(美元)
limitMonthlyUsdnumeric(10,2)null每月消费限制(美元)
limitConcurrentSessionsintegernull并发 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 名称
isEnabledbooleantrue是否启用
expiresAttimestampnull过期时间
canLoginWebUibooleantrue是否允许 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每月消费限制
limitConcurrentSessionsinteger0并发 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-供应商名称
descriptiontextnull描述信息
urlvarchar-API 端点地址
keyvarchar-API 密钥
isEnabledbooleantrue是否启用
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

调度相关字段

字段名类型可空默认值说明
weightinteger1权重(1-100)
priorityinteger0优先级(越小越优先)
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每月消费限制
limitConcurrentSessionsinteger0并发 Session 限制

熔断器字段

字段名类型可空默认值说明
circuitBreakerFailureThresholdinteger5触发熔断的失败次数
circuitBreakerOpenDurationinteger1800000熔断持续时间(毫秒,默认 30 分钟)
circuitBreakerHalfOpenSuccessThresholdinteger2恢复需要的成功次数

超时配置字段

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

代理配置字段

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

模型配置字段

字段名类型可空默认值说明
modelRedirectsjsonbnull模型名称重定向映射
allowedModelsjsonbnull允许的模型列表
joinClaudePoolbooleanfalse加入 Claude 调度池

特性配置字段

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

元数据字段

字段名类型可空默认值说明
websiteUrltextnull供应商官网地址
faviconUrltextnull网站图标 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
durationMsintegernull请求耗时(毫秒)
costUsdnumeric(21,15)'0'消费金额(美元)
costMultipliernumeric(10,4)null使用的成本系数
statusCodeintegernullHTTP 状态码
apiTypevarchar(20)nullAPI 类型(response/openai)
endpointvarchar(256)null请求端点路径
inputTokensintegernull输入 Token 数
outputTokensintegernull输出 Token 数
cacheCreationInputTokensintegernull缓存创建 Token 数
cacheReadInputTokensintegernull缓存读取 Token 数
errorMessagetextnull错误信息
blockedByvarchar(50)null拦截类型
blockedReasontextnull拦截原因
userAgentvarchar(512)null客户端 User-Agent
messagesCountintegernull消息数量
providerChainjsonbnull决策链记录
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)-规则分类
descriptiontextnull规则描述
overrideResponsejsonbnull覆写响应体
overrideStatusCodeintegernull覆写状态码
isEnabledbooleantrue是否启用
isDefaultbooleanfalse是否为默认规则
priorityinteger0优先级
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'匹配类型
descriptiontextnull规则描述
isEnabledbooleantrue是否启用
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'站点标题
allowGlobalUsageViewbooleanfalse允许查看全局使用统计
currencyDisplayvarchar(10)'USD'货币显示单位
billingModelSourcevarchar(20)'original'计费模型来源(original/redirected)
enableAutoCleanupbooleanfalse启用自动清理
cleanupRetentionDaysinteger30日志保留天数
cleanupSchedulevarchar(50)'0 2 * * *'清理 Cron 表达式
cleanupBatchSizeinteger10000清理批次大小
enableClientVersionCheckbooleanfalse启用客户端版本检查
createdAttimestamp(tz)now()创建时间
updatedAttimestamp(tz)now()更新时间

notification_settings 表

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

字段定义

字段名类型可空默认值说明
idserial自增主键
enabledbooleanfalse全局通知开关
circuitBreakerEnabledbooleanfalse熔断器告警开关
circuitBreakerWebhookvarchar(512)null熔断器告警 Webhook
dailyLeaderboardEnabledbooleanfalse每日排行榜开关
dailyLeaderboardWebhookvarchar(512)null排行榜 Webhook
dailyLeaderboardTimevarchar(10)'09:00'发送时间(HH:mm)
dailyLeaderboardTopNinteger5显示前 N 名
costAlertEnabledbooleanfalse成本预警开关
costAlertWebhookvarchar(512)null成本预警 Webhook
costAlertThresholdnumeric(5,2)'0.80'预警阈值(0-1)
costAlertCheckIntervalinteger60检查间隔(分钟)
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