Files
air-watcher/playground_schema.sql
2026-03-05 11:00:45 +09:00

94 lines
3.3 KiB
SQL

-- Multi-project playground schema (MySQL)
-- Purpose: keep many small projects in one database using project_key namespace.
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS projects (
project_key VARCHAR(100) NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT NULL,
meta_json LONGTEXT NULL,
created_at DATETIME(3) NOT NULL,
updated_at DATETIME(3) NOT NULL,
PRIMARY KEY (project_key),
KEY idx_projects_updated_at (updated_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS project_documents (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
project_key VARCHAR(100) NOT NULL,
doc_type VARCHAR(100) NOT NULL,
doc_key VARCHAR(191) NOT NULL,
data_json LONGTEXT NOT NULL,
meta_json LONGTEXT NULL,
created_at DATETIME(3) NOT NULL,
updated_at DATETIME(3) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uq_project_documents_namespace (project_key, doc_type, doc_key),
KEY idx_project_documents_project_type_updated (project_key, doc_type, updated_at),
KEY idx_project_documents_project_updated (project_key, updated_at),
CONSTRAINT fk_project_documents_project_key
FOREIGN KEY (project_key) REFERENCES projects(project_key)
ON UPDATE CASCADE
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS project_events (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
project_key VARCHAR(100) NOT NULL,
stream VARCHAR(100) NOT NULL,
event_type VARCHAR(100) NOT NULL,
payload_json LONGTEXT NOT NULL,
observed_at DATETIME(3) NOT NULL,
created_at DATETIME(3) NOT NULL,
PRIMARY KEY (id),
KEY idx_project_events_project_stream_created (project_key, stream, created_at),
KEY idx_project_events_project_created (project_key, created_at),
CONSTRAINT fk_project_events_project_key
FOREIGN KEY (project_key) REFERENCES projects(project_key)
ON UPDATE CASCADE
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS project_settings (
project_key VARCHAR(100) NOT NULL,
setting_key VARCHAR(191) NOT NULL,
setting_value LONGTEXT NOT NULL,
updated_at DATETIME(3) NOT NULL,
PRIMARY KEY (project_key, setting_key),
KEY idx_project_settings_updated_at (updated_at),
CONSTRAINT fk_project_settings_project_key
FOREIGN KEY (project_key) REFERENCES projects(project_key)
ON UPDATE CASCADE
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Seed one project namespace for this repository (optional)
INSERT INTO projects (
project_key,
name,
description,
meta_json,
created_at,
updated_at
)
VALUES (
'air-watcher',
'Air Watcher',
'Flight price watcher dashboard and alerts',
JSON_OBJECT('owner', 'team', 'status', 'active'),
UTC_TIMESTAMP(3),
UTC_TIMESTAMP(3)
)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
description = VALUES(description),
meta_json = VALUES(meta_json),
updated_at = VALUES(updated_at);
-- Mapping guide for Air-Watcher:
-- 1) watch row -> project_documents (doc_type='watch', doc_key=watch_id)
-- 2) app settings -> project_settings (setting_key='global_controls' etc.)
-- 3) user profiles -> project_settings (setting_key='user_profiles')
-- 4) watch alert events -> project_events (stream='watch_events')