43 lines
1.5 KiB
SQL
43 lines
1.5 KiB
SQL
-- RAG vector DB schema for Postgres (pgvector).
|
|
-- Run once against an empty DB. If RAG_EMBEDDINGS_DIM is not 1536, change vector(1536) below.
|
|
-- Usage: psql "$RAG_DB_DSN" -f scripts/schema.sql
|
|
|
|
CREATE EXTENSION IF NOT EXISTS vector;
|
|
|
|
CREATE TABLE IF NOT EXISTS stories (
|
|
id SERIAL PRIMARY KEY,
|
|
slug TEXT UNIQUE NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT (NOW() AT TIME ZONE 'utc'),
|
|
indexed_base_ref TEXT,
|
|
indexed_head_ref TEXT,
|
|
indexed_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS documents (
|
|
id SERIAL PRIMARY KEY,
|
|
story_id INTEGER NOT NULL REFERENCES stories(id) ON DELETE CASCADE,
|
|
path TEXT NOT NULL,
|
|
version TEXT NOT NULL,
|
|
updated_at TIMESTAMPTZ NOT NULL,
|
|
UNIQUE(story_id, path)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS chunks (
|
|
id SERIAL PRIMARY KEY,
|
|
document_id INTEGER NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
|
|
chunk_index INTEGER NOT NULL,
|
|
hash TEXT NOT NULL,
|
|
content TEXT NOT NULL,
|
|
embedding vector(1536) NOT NULL,
|
|
start_line INTEGER,
|
|
end_line INTEGER,
|
|
change_type TEXT NOT NULL DEFAULT 'added'
|
|
CHECK (change_type IN ('added', 'modified', 'unchanged')),
|
|
previous_content TEXT
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_documents_story_id ON documents(story_id);
|
|
CREATE INDEX IF NOT EXISTS idx_chunks_document_id ON chunks(document_id);
|
|
CREATE INDEX IF NOT EXISTS idx_chunks_embedding ON chunks USING ivfflat (embedding vector_cosine_ops);
|
|
CREATE INDEX IF NOT EXISTS idx_chunks_change_type ON chunks(change_type);
|