-- Notara initial schema (see PLAN.md — Data Model) CREATE TABLE workspace_meta ( id INTEGER PRIMARY KEY CHECK (id = 1), name TEXT NOT NULL DEFAULT 'My Workspace', theme TEXT NOT NULL DEFAULT 'system', accent TEXT NOT NULL DEFAULT '#2383e2', onboarded INTEGER NOT NULL DEFAULT 0, last_page_id TEXT, settings JSON NOT NULL DEFAULT '{}' ); INSERT INTO workspace_meta (id) VALUES (1); CREATE TABLE pages ( id TEXT PRIMARY KEY, parent_id TEXT REFERENCES pages(id) ON DELETE CASCADE, title TEXT NOT NULL DEFAULT '', icon TEXT, cover TEXT, sort_order REAL NOT NULL DEFAULT 0, is_favorite INTEGER NOT NULL DEFAULT 0, in_trash INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); CREATE INDEX idx_pages_parent ON pages(parent_id); CREATE INDEX idx_pages_trash ON pages(in_trash); -- Page body as a Yjs document (CRDT): Y.encodeStateAsUpdate(doc) CREATE TABLE page_docs ( page_id TEXT PRIMARY KEY REFERENCES pages(id) ON DELETE CASCADE, ydoc BLOB NOT NULL ); CREATE TABLE databases ( id TEXT PRIMARY KEY, page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE, name TEXT NOT NULL DEFAULT '' ); CREATE TABLE db_properties ( id TEXT PRIMARY KEY, database_id TEXT NOT NULL REFERENCES databases(id) ON DELETE CASCADE, name TEXT NOT NULL, type TEXT NOT NULL, config JSON NOT NULL DEFAULT '{}', sort_order REAL NOT NULL DEFAULT 0 ); CREATE INDEX idx_props_db ON db_properties(database_id); CREATE TABLE db_rows ( id TEXT PRIMARY KEY, database_id TEXT NOT NULL REFERENCES databases(id) ON DELETE CASCADE, page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE, sort_order REAL NOT NULL DEFAULT 0 ); CREATE INDEX idx_rows_db ON db_rows(database_id); CREATE TABLE db_values ( row_id TEXT NOT NULL REFERENCES db_rows(id) ON DELETE CASCADE, property_id TEXT NOT NULL REFERENCES db_properties(id) ON DELETE CASCADE, value JSON, PRIMARY KEY (row_id, property_id) ); CREATE TABLE db_views ( id TEXT PRIMARY KEY, database_id TEXT NOT NULL REFERENCES databases(id) ON DELETE CASCADE, name TEXT NOT NULL, type TEXT NOT NULL, filters JSON NOT NULL DEFAULT '[]', sorts JSON NOT NULL DEFAULT '[]', groups JSON NOT NULL DEFAULT 'null', visible_props JSON NOT NULL DEFAULT 'null', sort_order REAL NOT NULL DEFAULT 0 ); CREATE INDEX idx_views_db ON db_views(database_id); -- Full-text search mirror (title + plain-text body extracted from the Y.Doc) CREATE VIRTUAL TABLE pages_fts USING fts5(page_id UNINDEXED, title, body);