-- TrendRadar RSS 数据库表结构 -- 用于存储 RSS/Atom 订阅源数据 -- ============================================ -- RSS 源配置表 -- 存储订阅源的基本信息 -- ============================================ CREATE TABLE IF NOT EXISTS rss_feeds ( id TEXT PRIMARY KEY, -- 源 ID(如 "hacker-news") name TEXT NOT NULL, -- 显示名称(如 "Hacker News") feed_url TEXT DEFAULT '', -- RSS/Atom URL(可选,配置文件中已有) is_active INTEGER DEFAULT 1, -- 是否启用 last_fetch_time TEXT, -- 最后抓取时间 last_fetch_status TEXT, -- 最后抓取状态(success/failed) item_count INTEGER DEFAULT 0, -- 当日条目数 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ============================================ -- RSS 条目表 -- 以 URL + feed_id 为唯一标识,支持去重存储 -- ============================================ CREATE TABLE IF NOT EXISTS rss_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, -- 标题 feed_id TEXT NOT NULL, -- 所属 RSS 源 url TEXT NOT NULL, -- 文章链接 guid TEXT DEFAULT '', -- GUID/ID(RSS guid 或 Atom id) published_at TEXT, -- RSS 发布时间(ISO 格式) summary TEXT, -- 摘要/描述 author TEXT, -- 作者 first_crawl_time TEXT NOT NULL, -- 首次抓取时间 last_crawl_time TEXT NOT NULL, -- 最后抓取时间 crawl_count INTEGER DEFAULT 1, -- 抓取次数 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (feed_id) REFERENCES rss_feeds(id) ); -- ============================================ -- 抓取记录表 -- 记录每次抓取的时间和数量 -- ============================================ CREATE TABLE IF NOT EXISTS rss_crawl_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, crawl_time TEXT NOT NULL UNIQUE, -- 抓取时间(HH:MM) total_items INTEGER DEFAULT 0, -- 总条目数 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ============================================ -- 抓取来源状态表 -- 记录每次抓取各 RSS 源的成功/失败状态 -- ============================================ CREATE TABLE IF NOT EXISTS rss_crawl_status ( crawl_record_id INTEGER NOT NULL, feed_id TEXT NOT NULL, status TEXT NOT NULL CHECK(status IN ('success', 'failed')), error_message TEXT, -- 失败时的错误信息 PRIMARY KEY (crawl_record_id, feed_id), FOREIGN KEY (crawl_record_id) REFERENCES rss_crawl_records(id), FOREIGN KEY (feed_id) REFERENCES rss_feeds(id) ); -- ============================================ -- 推送记录表 -- 用于 push_window once_per_day 功能 -- 以及 ai_analysis analysis_window once_per_day 功能 -- ============================================ CREATE TABLE IF NOT EXISTS rss_push_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL UNIQUE, -- 日期(YYYY-MM-DD) pushed INTEGER DEFAULT 0, -- 是否已推送 push_time TEXT, -- 推送时间 ai_analyzed INTEGER DEFAULT 0, -- 是否已进行 AI 分析 ai_analysis_time TEXT, -- AI 分析时间 ai_analysis_mode TEXT, -- AI 分析模式 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ============================================ -- 索引定义 -- ============================================ -- RSS 源索引 CREATE INDEX IF NOT EXISTS idx_rss_feed ON rss_items(feed_id); -- 发布时间索引(用于按时间排序) CREATE INDEX IF NOT EXISTS idx_rss_published ON rss_items(published_at DESC); -- 抓取时间索引(用于查询最新数据) CREATE INDEX IF NOT EXISTS idx_rss_crawl_time ON rss_items(last_crawl_time); -- 标题索引(用于标题搜索) CREATE INDEX IF NOT EXISTS idx_rss_title ON rss_items(title); -- URL + feed_id 唯一索引(实现去重) CREATE UNIQUE INDEX IF NOT EXISTS idx_rss_url_feed ON rss_items(url, feed_id); -- GUID + feed_id 部分唯一索引(guid 非空时优先用 guid 去重) CREATE UNIQUE INDEX IF NOT EXISTS idx_rss_guid_feed ON rss_items(guid, feed_id) WHERE guid != ''; -- 抓取状态索引 CREATE INDEX IF NOT EXISTS idx_rss_crawl_status_record ON rss_crawl_status(crawl_record_id);