94 lines
3.3 KiB
SQL
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')
|