数据模型
说明
新词雷达以本地 SQLite 为真相源(radar/schema.sql → data/radar.db),再静态导出 HTML。下列为本站实际 schema;文末列出公开扫站实践里常见、但本 MVP 尚未建表的概念表,避免和 aihusk 库表一一对应造成误解。
当前标签与排序
当前标签取 words.latest_tag(由 score.py 写入),并同步追加 word_status_history。首页计数、词卡片、静态页与搜索复用同一标签。空值显示为「未分级」。
词分组依次为:抢先、可跟、观察、已晚、未分级;组内 priority 降序、last_seen 降序。站点列表优先监控站 / 聚合站,再按关联词数与域名排序。
实时行数(生成站点时写入)
| 表 | 行数 |
|---|---|
meta | 3 |
runs | 3 |
words | 1,126 |
signals | 1,126 |
word_status_history | 5,458 |
sites | 124 |
word_sites | 715 |
domain_availability | 240 |
sitemap_slugs | 614 |
SQL Schema(本站)
-- 新词雷达 / keyword-radar lean SQLite schema (inspired by aihusk data-model; not a fork)
CREATE TABLE IF NOT EXISTS meta (
key TEXT PRIMARY KEY NOT NULL,
value TEXT
);
INSERT INTO meta(key, value) VALUES ('schema_version', '1')
ON CONFLICT(key) DO NOTHING;
INSERT INTO meta(key, value) VALUES ('brand_zh', '新词雷达')
ON CONFLICT(key) DO NOTHING;
INSERT INTO meta(key, value) VALUES ('brand_en', 'keyword-radar')
ON CONFLICT(key) DO NOTHING;
CREATE TABLE IF NOT EXISTS runs (
run_at TEXT PRIMARY KEY NOT NULL,
kind TEXT,
sec REAL,
net_req INTEGER DEFAULT 0,
new_words INTEGER DEFAULT 0,
words_window INTEGER DEFAULT 0,
steps_json TEXT,
by_json TEXT
);
CREATE TABLE IF NOT EXISTS words (
word TEXT PRIMARY KEY NOT NULL,
slug TEXT UNIQUE,
cat TEXT,
kind TEXT,
first_seen TEXT,
last_seen TEXT,
first_src TEXT,
n_sources INTEGER DEFAULT 0,
sources_json TEXT,
detail_json TEXT,
is_model_word INTEGER DEFAULT 0,
latest_tag TEXT,
latest_run TEXT,
priority REAL DEFAULT 0,
zh TEXT,
has_page INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS signals (
word TEXT NOT NULL,
source TEXT NOT NULL,
seen_at TEXT,
detail TEXT,
PRIMARY KEY (word, source)
);
CREATE TABLE IF NOT EXISTS word_status_history (
word TEXT NOT NULL,
run_at TEXT NOT NULL,
tag TEXT,
hours REAL,
n_sources INTEGER,
new_domains INTEGER,
n_available INTEGER,
scan_score REAL,
PRIMARY KEY (word, run_at)
);
CREATE TABLE IF NOT EXISTS sites (
domain TEXT PRIMARY KEY NOT NULL,
first_seen TEXT,
is_watch INTEGER DEFAULT 0,
is_aggregator INTEGER DEFAULT 0,
live INTEGER,
source TEXT,
has_page INTEGER DEFAULT 0,
note TEXT
);
CREATE TABLE IF NOT EXISTS word_sites (
word TEXT NOT NULL,
domain TEXT NOT NULL,
relation TEXT NOT NULL,
first_seen TEXT,
PRIMARY KEY (word, domain, relation)
);
CREATE TABLE IF NOT EXISTS domain_availability (
domain TEXT NOT NULL,
checked_at TEXT NOT NULL,
status TEXT,
PRIMARY KEY (domain, checked_at)
);
CREATE TABLE IF NOT EXISTS sitemap_slugs (
domain TEXT NOT NULL,
slug TEXT NOT NULL,
lastmod TEXT,
first_seen TEXT,
PRIMARY KEY (domain, slug)
);
CREATE INDEX IF NOT EXISTS words_last_seen ON words(last_seen);
CREATE INDEX IF NOT EXISTS words_priority ON words(priority DESC, word);
CREATE INDEX IF NOT EXISTS words_latest_tag ON words(latest_tag);
CREATE INDEX IF NOT EXISTS signals_seen_at ON signals(seen_at);
CREATE INDEX IF NOT EXISTS history_run_at ON word_status_history(run_at, word);
CREATE INDEX IF NOT EXISTS sites_watch ON sites(is_watch);
CREATE INDEX IF NOT EXISTS word_sites_domain ON word_sites(domain, word);
CREATE INDEX IF NOT EXISTS sitemap_first_seen ON sitemap_slugs(first_seen);
概念表(公开实践常见 / 本站未建或未启用)
下列名称出现在社区方法讨论中,便于对照矩阵「待做 / 需积分」格子;不是本库已有表:
matrix_cells/matrix_hits— 矩阵按日快照与命中明细(本站用页面热力即时聚合信号,未落这两张表)scan_scores/gpt_visibility/intitle_history— 更细的 GPT / intitle 探针ct_certs/nrd_files— CT 与新注册域文件semrush_kw/semrush_site— 付费 SEO 辅助指标decisions/credits/xsignals— 人工决策、积分记账、X 查询日志
扩展时优先加表并改 schema_version,不做破坏性迁移。