-- Migration 018: 分组-Key 号池(一对多关系) -- 一个分组可以有多个key,形成号池 SET search_path TO crawl; -- 分组-Key关联表 CREATE TABLE IF NOT EXISTS group_keys ( id BIGSERIAL PRIMARY KEY, group_id BIGINT NOT NULL REFERENCES model_groups(id) ON DELETE CASCADE, api_key_id BIGINT NOT NULL REFERENCES api_keys(id) ON DELETE CASCADE, priority INT NOT NULL DEFAULT 0, -- 优先级(越大越高) weight INT NOT NULL DEFAULT 1, -- 权重(负载均衡用) is_active BOOLEAN NOT NULL DEFAULT TRUE, -- 是否启用 status VARCHAR(20) NOT NULL DEFAULT 'active', -- active/rate_limited/banned/failed status_msg TEXT, -- 状态说明 last_used_at TIMESTAMPTZ, -- 最后使用时间 total_tokens BIGINT NOT NULL DEFAULT 0, -- 该key在该分组下使用的token总数 request_count BIGINT NOT NULL DEFAULT 0, -- 请求次数 error_count BIGINT NOT NULL DEFAULT 0, -- 错误次数 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(group_id, api_key_id) -- 同一分组不能重复添加同一个key ); CREATE INDEX IF NOT EXISTS idx_group_keys_group ON group_keys(group_id); CREATE INDEX IF NOT EXISTS idx_group_keys_key ON group_keys(api_key_id); CREATE INDEX IF NOT EXISTS idx_group_keys_status ON group_keys(status); COMMENT ON TABLE group_keys IS '分组-Key号池关系表,一个分组可以有多个key'; COMMENT ON COLUMN group_keys.priority IS '优先级,数值越大越优先使用'; COMMENT ON COLUMN group_keys.weight IS '权重,用于加权负载均衡'; COMMENT ON COLUMN group_keys.status IS '状态: active=正常, rate_limited=限流, banned=禁用, failed=失败';