| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- -- =====================================================
- -- 最终版模型表结构
- -- models_new : 模型主表
- -- model_price_new : 价格表(对应爬虫 parsed_prices / discounted_prices)
- -- crawler_sync_log: 爬虫同步版本记录
- -- =====================================================
- DROP TABLE IF EXISTS aigcspace.model_price_new CASCADE;
- DROP TABLE IF EXISTS aigcspace.models_new CASCADE;
- DROP TABLE IF EXISTS aigcspace.crawler_sync_log CASCADE;
- -- =====================================================
- -- 1. 模型主表
- -- =====================================================
- CREATE TABLE aigcspace.models_new (
- id SERIAL PRIMARY KEY,
- model_code VARCHAR(200) NOT NULL UNIQUE,
- -- 爬虫自动更新字段
- description TEXT,
- display_tags TEXT[],
- input_modalities TEXT[],
- output_modalities TEXT[],
- features JSONB,
- rate_limits JSONB,
- tool_call_prices JSONB,
- raw_prices JSONB, -- models[].prices 原始结构,供前端展示用
- source_url TEXT,
- crawled_at TIMESTAMP,
- -- 分类(由爬虫 input/output_modalities 自动推断,管理员可覆盖)
- -- 0=LLM,1=多模态,2=TTS,3=STT,4=图像生成,5=视频生成,6=图像编辑,7=Embedding,8=Rerank
- categories INTEGER[] NOT NULL DEFAULT '{}',
- -- 管理员手动配置字段(爬虫不覆盖)
- display_name VARCHAR(255),
- img TEXT,
- supplier VARCHAR(100) NOT NULL DEFAULT 'Qwen',
- tag1 VARCHAR(100),
- tag2 VARCHAR(100),
- keywords TEXT,
- custom_description TEXT,
- is_featured BOOLEAN NOT NULL DEFAULT false,
- is_show_enabled BOOLEAN NOT NULL DEFAULT true,
- is_api_enabled BOOLEAN NOT NULL DEFAULT false,
- is_search BOOLEAN NOT NULL DEFAULT false,
- is_thinking BOOLEAN NOT NULL DEFAULT false,
- source_keys TEXT[],
- normalized_keys TEXT[],
- -- 本地模型字段
- is_local BOOLEAN NOT NULL DEFAULT false,
- user_id VARCHAR(50) REFERENCES aigcspace.users(id),
- base_url VARCHAR(500),
- local_api_key VARCHAR(500),
- visibility VARCHAR(20) DEFAULT 'user',
- created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
- );
- COMMENT ON TABLE aigcspace.models_new IS '模型主表';
- COMMENT ON COLUMN aigcspace.models_new.raw_prices IS 'models[].prices 原始结构,供前端详情页展示完整价格子项';
- COMMENT ON COLUMN aigcspace.models_new.categories IS '多分类数组:0=LLM,1=多模态,2=TTS,3=STT,4=图像生成,5=视频生成,6=图像编辑,7=Embedding,8=Rerank';
- -- =====================================================
- -- 2. 价格表
- -- 直接对应爬虫 parsed_prices(原价)+ discounted_prices(折扣价)
- -- 每个 model_code + label 一条记录
- -- =====================================================
- CREATE TABLE aigcspace.model_price_new (
- id SERIAL PRIMARY KEY,
- model_code VARCHAR(200) NOT NULL,
- -- 对应 parsed_prices / discounted_prices 的 label 字段
- -- 例:'语音合成'、'input<=32k'、'视频生成(720P)'
- label VARCHAR(200) NOT NULL,
- -- 阶梯范围(来自 parsed_prices 的 tier_min/tier_max/tier_unit)
- tier_min NUMERIC(20, 2),
- tier_max NUMERIC(20, 2),
- tier_unit VARCHAR(50), -- tokens / seconds / images / characters
- -- 原价(来自 parsed_prices 的 input_price / output_price)
- input_price_original NUMERIC(20, 8) NOT NULL DEFAULT 0,
- output_price_original NUMERIC(20, 8) NOT NULL DEFAULT 0,
- -- 折扣价(来自 discounted_prices 的 input_price / output_price)
- input_price_discounted NUMERIC(20, 8) NOT NULL DEFAULT 0,
- output_price_discounted NUMERIC(20, 8) NOT NULL DEFAULT 0,
- -- 折扣率(来自 discounted_prices 的 discount 字段,如 0.8)
- discount_rate NUMERIC(5, 4) NOT NULL DEFAULT 1.0000,
- -- 折扣标签(由 discount_rate 计算,如 '8折',无折扣时为 NULL)
- discount_label VARCHAR(20),
- -- 单位信息
- currency VARCHAR(10) NOT NULL DEFAULT 'CNY',
- unit VARCHAR(100) NOT NULL DEFAULT '',
- -- 计价基数:元/百万tokens=1000000,元/秒或元/张=1
- display_multiplier INTEGER NOT NULL DEFAULT 1,
- source_url TEXT,
- crawled_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
- is_active BOOLEAN NOT NULL DEFAULT true,
- created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
- );
- COMMENT ON TABLE aigcspace.model_price_new IS '价格表:对应爬虫 parsed_prices(原价)+ discounted_prices(折扣价)';
- COMMENT ON COLUMN aigcspace.model_price_new.label IS '价格标签,对应爬虫 parsed_prices.label';
- COMMENT ON COLUMN aigcspace.model_price_new.input_price_original IS '原价输入,来自 parsed_prices.input_price';
- COMMENT ON COLUMN aigcspace.model_price_new.output_price_original IS '原价输出,来自 parsed_prices.output_price';
- COMMENT ON COLUMN aigcspace.model_price_new.input_price_discounted IS '折扣价输入,来自 discounted_prices.input_price';
- COMMENT ON COLUMN aigcspace.model_price_new.output_price_discounted IS '折扣价输出,来自 discounted_prices.output_price';
- COMMENT ON COLUMN aigcspace.model_price_new.discount_rate IS '折扣率 0~1,来自 discounted_prices.discount,如 0.8';
- COMMENT ON COLUMN aigcspace.model_price_new.discount_label IS '折扣标签,如 "8折",discount_rate=1 时为 NULL';
- COMMENT ON COLUMN aigcspace.model_price_new.display_multiplier IS '计价基数:元/百万tokens=1000000,元/秒或元/张=1';
- COMMENT ON COLUMN aigcspace.model_price_new.is_active IS '是否为当前生效版本';
- -- =====================================================
- -- 3. 爬虫同步版本记录表
- -- =====================================================
- CREATE TABLE aigcspace.crawler_sync_log (
- id SERIAL PRIMARY KEY,
- crawler_version INTEGER NOT NULL,
- synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
- model_count INTEGER NOT NULL DEFAULT 0,
- price_count INTEGER NOT NULL DEFAULT 0,
- status VARCHAR(20) NOT NULL DEFAULT 'success',
- error_message TEXT
- );
- COMMENT ON TABLE aigcspace.crawler_sync_log IS '爬虫同步版本记录';
- COMMENT ON COLUMN aigcspace.crawler_sync_log.crawler_version IS '爬虫全局版本号';
- -- =====================================================
- -- 4. 索引
- -- =====================================================
- CREATE INDEX idx_models_new_categories ON aigcspace.models_new USING GIN(categories);
- CREATE INDEX idx_models_new_supplier ON aigcspace.models_new(supplier);
- CREATE INDEX idx_models_new_is_show_enabled ON aigcspace.models_new(is_show_enabled);
- CREATE INDEX idx_models_new_is_api_enabled ON aigcspace.models_new(is_api_enabled);
- CREATE INDEX idx_models_new_is_local ON aigcspace.models_new(is_local);
- CREATE INDEX idx_models_new_crawled_at ON aigcspace.models_new(crawled_at);
- CREATE INDEX idx_models_new_display_tags ON aigcspace.models_new USING GIN(display_tags);
- CREATE INDEX idx_models_new_source_keys ON aigcspace.models_new USING GIN(source_keys);
- CREATE INDEX idx_model_price_model_code ON aigcspace.model_price_new(model_code);
- CREATE INDEX idx_model_price_label ON aigcspace.model_price_new(label);
- CREATE INDEX idx_model_price_active ON aigcspace.model_price_new(model_code, is_active) WHERE is_active = true;
- CREATE INDEX idx_crawler_sync_log_version ON aigcspace.crawler_sync_log(crawler_version);
|