66 lines
2.9 KiB
SQL
66 lines
2.9 KiB
SQL
-- C Nostr Relay Database Schema
|
|
-- Simplified schema with just event and tag tables
|
|
-- SQLite database for storing Nostr events
|
|
|
|
-- ============================================================================
|
|
-- DATABASE SETTINGS
|
|
-- ============================================================================
|
|
|
|
PRAGMA encoding = "UTF-8";
|
|
PRAGMA journal_mode = WAL;
|
|
PRAGMA auto_vacuum = FULL;
|
|
PRAGMA synchronous = NORMAL;
|
|
PRAGMA foreign_keys = ON;
|
|
|
|
-- ============================================================================
|
|
-- EVENT TABLE
|
|
-- ============================================================================
|
|
|
|
-- Main event table - stores all Nostr events
|
|
CREATE TABLE IF NOT EXISTS event (
|
|
id TEXT PRIMARY KEY, -- Nostr event ID (hex string)
|
|
pubkey TEXT NOT NULL, -- Public key of event author (hex string)
|
|
created_at INTEGER NOT NULL, -- Event creation timestamp (Unix timestamp)
|
|
kind INTEGER NOT NULL, -- Event kind (0-65535)
|
|
content TEXT NOT NULL, -- Event content (text content only)
|
|
sig TEXT NOT NULL -- Event signature (hex string)
|
|
);
|
|
|
|
-- Event indexes for performance
|
|
CREATE INDEX IF NOT EXISTS event_pubkey_index ON event(pubkey);
|
|
CREATE INDEX IF NOT EXISTS event_created_at_index ON event(created_at);
|
|
CREATE INDEX IF NOT EXISTS event_kind_index ON event(kind);
|
|
CREATE INDEX IF NOT EXISTS event_pubkey_created_at_index ON event(pubkey, created_at);
|
|
CREATE INDEX IF NOT EXISTS event_kind_created_at_index ON event(kind, created_at);
|
|
|
|
-- ============================================================================
|
|
-- TAG TABLE
|
|
-- ============================================================================
|
|
|
|
-- Tag table for storing event tags
|
|
CREATE TABLE IF NOT EXISTS tag (
|
|
id TEXT NOT NULL, -- Nostr event ID (references event.id)
|
|
name TEXT NOT NULL, -- Tag name (e.g., "e", "p", "d")
|
|
value TEXT NOT NULL, -- Tag value
|
|
parameters TEXT, -- Additional tag parameters (JSON string)
|
|
FOREIGN KEY(id) REFERENCES event(id) ON UPDATE CASCADE ON DELETE CASCADE
|
|
);
|
|
|
|
-- Tag indexes for performance
|
|
CREATE INDEX IF NOT EXISTS tag_id_index ON tag(id);
|
|
CREATE INDEX IF NOT EXISTS tag_name_index ON tag(name);
|
|
CREATE INDEX IF NOT EXISTS tag_name_value_index ON tag(name, value);
|
|
CREATE INDEX IF NOT EXISTS tag_id_name_index ON tag(id, name);
|
|
|
|
-- ============================================================================
|
|
-- PERFORMANCE OPTIMIZATIONS
|
|
-- ============================================================================
|
|
|
|
-- Enable query planner optimizations
|
|
PRAGMA optimize;
|
|
|
|
-- Set recommended pragmas for performance
|
|
PRAGMA main.synchronous = NORMAL;
|
|
PRAGMA foreign_keys = ON;
|
|
PRAGMA temp_store = 2; -- use memory for temp tables
|
|
PRAGMA main.cache_size = 10000; -- 40MB cache per connection |