Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
81 lines
2.5 KiB
SQL
81 lines
2.5 KiB
SQL
-- 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);
|