51 lines
2.0 KiB
SQL
51 lines
2.0 KiB
SQL
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(); |