CREATE TABLE posts ( id BIGINT PRIMARY KEY, author_id BIGINT NOT NULL, author_role VARCHAR(20) NOT NULL, title VARCHAR(500) NOT NULL, content TEXT NOT NULL, images TEXT[] DEFAULT ARRAY[]::TEXT[], tags TEXT[] DEFAULT ARRAY[]::TEXT[], linked_order_id BIGINT, quoted_post_id BIGINT REFERENCES posts(id), like_count INT DEFAULT 0, comment_count INT DEFAULT 0, pinned BOOLEAN DEFAULT FALSE, search_text TEXT GENERATED ALWAYS AS ( title || ' ' || content ) STORED, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), deleted_at TIMESTAMPTZ ); -- 基础索引 CREATE INDEX idx_posts_author ON posts(author_id, created_at DESC) WHERE deleted_at IS NULL; CREATE INDEX idx_posts_created ON posts(created_at DESC) WHERE deleted_at IS NULL; -- 三元组索引用于帖子内容搜索 CREATE INDEX idx_posts_search_trgm ON posts USING gin(search_text gin_trgm_ops) WHERE deleted_at IS NULL; -- 全文搜索索引 CREATE INDEX idx_posts_fulltext ON posts USING gin( to_tsvector('simple', title || ' ' || content) ) WHERE deleted_at IS NULL; -- 标签 GIN 索引 CREATE INDEX idx_posts_tags_gin ON posts USING gin(tags) WHERE deleted_at IS NULL; -- 复合索引优化热门排序 CREATE INDEX idx_posts_hot_score ON posts( (like_count * 2 + comment_count) DESC, created_at DESC ) WHERE deleted_at IS NULL; -- 置顶+时间索引 CREATE INDEX idx_posts_pinned_created ON posts(author_id, pinned DESC, created_at DESC) WHERE deleted_at IS NULL; -- 关联订单索引 CREATE INDEX idx_posts_linked_order ON posts(linked_order_id) WHERE linked_order_id IS NOT NULL AND deleted_at IS NULL; -- 图片数组索引 CREATE INDEX idx_posts_images ON posts USING gin(images) WHERE deleted_at IS NULL; CREATE TRIGGER trigger_posts_updated_at BEFORE UPDATE ON posts FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();