db_schema.sql

scripts/analytics/db_schema.sql(168 行)

db_schema.sql
-- アクセス解析パイプライン SQLite スキーマ
-- 全テーブルに site カラムを持たせ、複合主キーで INSERT OR REPLACE(upsert)を効かせる。
-- すべて CREATE TABLE IF NOT EXISTS なので、何度流しても安全(冪等)。

-- 1. ページ別(ローリング期間の合計・上位N)。snapshot_date = 取得実行日
CREATE TABLE IF NOT EXISTS page_metrics (
  site TEXT NOT NULL,
  snapshot_date TEXT NOT NULL,      -- ローリング集計を取った日 (YYYY-MM-DD)
  page_path TEXT NOT NULL,          -- 正規化済みパス
  page_title TEXT,
  page_views INTEGER,
  active_users INTEGER,
  engagement_duration REAL,         -- 秒
  engagement_rate REAL,
  bounce_rate REAL,
  PRIMARY KEY (site, snapshot_date, page_path)
);

-- 2. 流入チャネル(日次)
CREATE TABLE IF NOT EXISTS channel_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  channel_group TEXT NOT NULL,
  source TEXT NOT NULL,
  medium TEXT NOT NULL,
  sessions INTEGER,
  active_users INTEGER,
  engaged_sessions INTEGER,
  PRIMARY KEY (site, date, channel_group, source, medium)
);

-- 3. ランディングページ(日次)
CREATE TABLE IF NOT EXISTS landing_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  landing_page TEXT NOT NULL,       -- 正規化済みパス
  sessions INTEGER,
  bounce_rate REAL,
  engagement_rate REAL,
  PRIMARY KEY (site, date, landing_page)
);

-- 4. 新規 vs リピーター(日次)
CREATE TABLE IF NOT EXISTS user_type_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  user_type TEXT NOT NULL,          -- new / returning / (not set) など
  active_users INTEGER,
  sessions INTEGER,
  PRIMARY KEY (site, date, user_type)
);

-- 5. デバイス・地域(日次)
CREATE TABLE IF NOT EXISTS device_geo_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  device_category TEXT NOT NULL,
  country TEXT NOT NULL,
  region TEXT NOT NULL,
  active_users INTEGER,
  sessions INTEGER,
  PRIMARY KEY (site, date, device_category, country, region)
);

-- 6. 時間別(日次)
CREATE TABLE IF NOT EXISTS hourly_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  hour INTEGER NOT NULL,            -- 0-23
  day_of_week INTEGER,              -- 0-6(GA4 の dayOfWeek。0=日曜)
  sessions INTEGER,
  active_users INTEGER,
  page_views INTEGER,
  PRIMARY KEY (site, date, hour)
);

-- 7. イベント / キーイベント(日次)
CREATE TABLE IF NOT EXISTS event_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  event_name TEXT NOT NULL,
  key_events REAL,
  event_count INTEGER,
  total_revenue REAL,
  PRIMARY KEY (site, date, event_name)
);

-- 8. アフィリエイトクリック(日次・ページ別×遷移先ホスト別)。任意。
-- 設定ファイルで ga4_affiliate_event を指定したサイトだけ行が入る。
-- サイト側が送るイベントパラメータ article_path / link_host を、GA4 のカスタム
-- ディメンション経由で取得する。article_path は正規化済み(page_metrics /
-- gsc_page_metrics と JOIN 可能)。
-- 注意: カスタムディメンションを登録する前の日付は "(not set)" になる
--       (GA4 は登録前のイベントに遡って値を付けない)。
CREATE TABLE IF NOT EXISTS affiliate_click_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  article_path TEXT NOT NULL,       -- クリック元ページの正規化済みパス。無しは (not set)
  link_host TEXT NOT NULL,          -- 遷移先ホスト名。無しは (not set)
  event_count INTEGER,
  PRIMARY KEY (site, date, article_path, link_host)
);

-- Search Console: クエリ別(日次)
CREATE TABLE IF NOT EXISTS gsc_query_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  query TEXT NOT NULL,
  clicks INTEGER,
  impressions INTEGER,
  ctr REAL,
  position REAL,
  PRIMARY KEY (site, date, query)
);

-- Search Console: ページ別(日次)。page_path は正規化済み(GA4 と JOIN 可能)
CREATE TABLE IF NOT EXISTS gsc_page_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  page_path TEXT NOT NULL,          -- 正規化済みパス
  clicks INTEGER,
  impressions INTEGER,
  ctr REAL,
  position REAL,
  PRIMARY KEY (site, date, page_path)
);

-- Search Console: ページ×クエリ別(日次)。ページごとの流入キーワードが分かる。
-- page_path は正規化済み(page_metrics / gsc_page_metrics と JOIN 可能)
CREATE TABLE IF NOT EXISTS gsc_page_query_metrics (
  site TEXT NOT NULL,
  date TEXT NOT NULL,
  page_path TEXT NOT NULL,          -- 正規化済みパス
  query TEXT NOT NULL,
  clicks INTEGER,
  impressions INTEGER,
  ctr REAL,
  position REAL,
  PRIMARY KEY (site, date, page_path, query)
);

-- URL Inspection API: インデックス状況(既定は週次)。sitemap の各URLを1本ずつ検査。
-- page_path は正規化済み(GA4 / GSC と JOIN 可能)。値は API が返す英語の文字列のまま。
CREATE TABLE IF NOT EXISTS inspect_metrics (
  site             TEXT NOT NULL,
  inspected_date   TEXT NOT NULL,   -- 検査実行日 (YYYY-MM-DD)
  page_path        TEXT NOT NULL,   -- 正規化済みパス
  coverage_state   TEXT,            -- 例: Submitted and indexed / Crawled - currently not indexed
  verdict          TEXT,            -- PASS / NEUTRAL / FAIL
  robots_state     TEXT,            -- 例: ALLOWED
  indexing_state   TEXT,            -- 例: INDEXING_ALLOWED
  last_crawl_time  TEXT,            -- API の lastCrawlTime(ISO8601/UTC の文字列のまま保存)
  google_canonical TEXT,
  user_canonical   TEXT,
  PRIMARY KEY (site, inspected_date, page_path)
);

-- バッチ実行ログ(サイト×実行日×ソースごとの成否)
CREATE TABLE IF NOT EXISTS batch_runs (
  site TEXT NOT NULL,
  run_date TEXT NOT NULL,
  source TEXT NOT NULL,             -- ga4 / ga4_affiliate / gsc / url_inspection / *_backfill
  status TEXT NOT NULL,             -- success / failed / skipped
  rows_written INTEGER,
  message TEXT,
  finished_at TEXT,
  PRIMARY KEY (site, run_date, source)
);

MIT ライセンスで配布しています。