-- Migración inicial de la base osint.duckdb. -- -- Tres categorías de datos: -- 1. Tablas maestras con referencia a notas (schema main): índice del vault -- (notes) + entidades estructuradas (persons, organizations, domains, -- cases, places). Cada una lleva note_path: el path relativo de la nota -- dentro del vault de Obsidian. -- 2. Tablas maestras DAV (schema main): contacts y events importados del -- servidor Xandikos (CardDAV/CalDAV) — fuente de verdad. -- 3. Tablas derivadas (schema derived): SOLO datos computados. Regla dura: -- ninguna tabla de derived lleva columna que referencie notas. Se -- reconstruyen completas en cada ingest, por eso esta migración solo crea -- el schema, no las tablas. -- Índice completo del vault: una fila por nota .md. CREATE TABLE IF NOT EXISTS notes ( note_path TEXT PRIMARY KEY, slug TEXT, tipo TEXT, title TEXT, mtime TIMESTAMP, frontmatter JSON ); -- Fichas de persona (personas/.md), esquema canónico de CONVENTIONS.md 3b. CREATE TABLE IF NOT EXISTS persons ( slug TEXT PRIMARY KEY, note_path TEXT, nombre TEXT, aliases JSON, sexo TEXT, fecha_nacimiento TEXT, dni TEXT, telefono TEXT, email TEXT, direccion TEXT, pais TEXT, contexto TEXT, fuente TEXT, dav_uid TEXT, tags JSON, updated_at TIMESTAMP ); -- Resto de entidades del vault: organizaciones, dominios, casos y lugares. CREATE TABLE IF NOT EXISTS organizations ( slug TEXT PRIMARY KEY, note_path TEXT, nombre TEXT, tags JSON, frontmatter JSON, updated_at TIMESTAMP ); CREATE TABLE IF NOT EXISTS domains ( slug TEXT PRIMARY KEY, note_path TEXT, nombre TEXT, tags JSON, frontmatter JSON, updated_at TIMESTAMP ); CREATE TABLE IF NOT EXISTS cases ( slug TEXT PRIMARY KEY, note_path TEXT, nombre TEXT, tags JSON, frontmatter JSON, updated_at TIMESTAMP ); CREATE TABLE IF NOT EXISTS places ( slug TEXT PRIMARY KEY, note_path TEXT, nombre TEXT, tags JSON, frontmatter JSON, updated_at TIMESTAMP ); -- Maestras DAV: contactos del addressbook CardDAV. note_path enlaza el -- contacto con su ficha del vault cuando el matching lo consigue. CREATE TABLE IF NOT EXISTS contacts ( uid TEXT PRIMARY KEY, collection TEXT, etag TEXT, fn TEXT, tels JSON, emails JSON, raw TEXT, note_path TEXT, updated_at TIMESTAMP ); -- Maestras DAV: eventos de las colecciones CalDAV. CREATE TABLE IF NOT EXISTS events ( uid TEXT PRIMARY KEY, calendar TEXT, etag TEXT, dtstart TEXT, dtend TEXT, all_day BOOLEAN, summary TEXT, location TEXT, rrule TEXT, raw TEXT, updated_at TIMESTAMP ); -- Schema para las tablas derivadas (solo datos computados, sin note_path). CREATE SCHEMA IF NOT EXISTS derived;