CREATE TABLE player_services ( id BIGINT PRIMARY KEY, player_id BIGINT NOT NULL REFERENCES players (id), game_id BIGINT NOT NULL, title VARCHAR(200) NOT NULL, description TEXT, price DECIMAL(10, 2) NOT NULL, unit VARCHAR(20) NOT NULL, rank_range VARCHAR(100), availability TEXT[] DEFAULT ARRAY []::TEXT[], rating DECIMAL(3, 2) DEFAULT 5.00, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT chk_price_positive CHECK (price > 0), CONSTRAINT chk_service_rating CHECK (rating >= 0 AND rating <= 5) ); -- 基础索引 CREATE INDEX idx_services_player ON player_services (player_id) WHERE is_active = TRUE; CREATE INDEX idx_services_game ON player_services (game_id) WHERE is_active = TRUE; CREATE INDEX idx_services_price ON player_services (price); -- 三元组索引用于服务标题模糊搜索 CREATE INDEX idx_services_title_trgm ON player_services USING gin (title gin_trgm_ops) WHERE is_active = TRUE; -- 全文搜索索引 CREATE INDEX idx_services_fulltext ON player_services USING gin ( to_tsvector('simple', title || ' ' || coalesce(description, '')) ) WHERE is_active = TRUE; -- 复合索引优化价格区间查询 CREATE INDEX idx_services_game_price ON player_services (game_id, price, rating DESC) WHERE is_active = TRUE; -- 打手+游戏复合索引 CREATE INDEX idx_services_player_game ON player_services (player_id, game_id) WHERE is_active = TRUE; -- GIN 索引优化时间段查询 CREATE INDEX idx_services_availability ON player_services USING gin (availability) WHERE is_active = TRUE; CREATE TRIGGER trigger_services_updated_at BEFORE UPDATE ON player_services FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();