Files
tech/8_сохранение_postgres/schema.sql
2026-02-01 17:01:21 +03:00

57 lines
2.2 KiB
SQL

-- Минимальная схема для этапа 8: книги, главы, анализы глав, теги, связи глава–тег.
-- Запускать один раз (например: psql -f schema.sql или через скрипт инициализации).
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE TABLE IF NOT EXISTS books (
id UUID PRIMARY KEY,
title VARCHAR(1024),
author VARCHAR(512),
metadata JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS chapters (
id UUID PRIMARY KEY,
book_id UUID NOT NULL REFERENCES books(id) ON DELETE CASCADE,
chapter_number INTEGER NOT NULL,
chapter_title VARCHAR(1024),
content TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS chapter_analyses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
chapter_id UUID NOT NULL UNIQUE REFERENCES chapters(id) ON DELETE CASCADE,
analysis_result JSONB NOT NULL,
validation_score FLOAT,
validated_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS tags (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(512) NOT NULL UNIQUE,
category VARCHAR(64),
description TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS chapter_tags (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
chapter_id UUID NOT NULL REFERENCES chapters(id) ON DELETE CASCADE,
tag_id UUID NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
confidence FLOAT,
validated BOOLEAN DEFAULT true,
source VARCHAR(64) DEFAULT 'ai_validation',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE (chapter_id, tag_id)
);
CREATE INDEX IF NOT EXISTS idx_chapters_book_id ON chapters(book_id);
CREATE INDEX IF NOT EXISTS idx_chapter_analyses_chapter_id ON chapter_analyses(chapter_id);
CREATE INDEX IF NOT EXISTS idx_chapter_tags_chapter_id ON chapter_tags(chapter_id);
CREATE INDEX IF NOT EXISTS idx_chapter_tags_tag_id ON chapter_tags(tag_id);
CREATE INDEX IF NOT EXISTS idx_tags_category ON tags(category);