Estrutura Detalhada da Base de Dados KB 1. Sistema Base (Schema) sqlCopyCREATE SCHEMA IF NOT EXISTS kb; Este é o namespace dedicado que mantém todas as tabelas organizadas e separadas de outros sistemas. 2. Sistema de Armazenamento Principal 2.1 Documentos (kb.documents) sqlCopyCREATE TABLE kb.documents ( doc_id SERIAL PRIMARY KEY, title TEXT NOT NULL, author TEXT, original_date DATE, processing_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, source_type TEXT CHECK (source_type IN ('pdf', 'ebook', 'video', 'documentation')), language TEXT DEFAULT 'pt-PT', original_file_path TEXT, md_file_path TEXT, content TEXT, content_embedding vector(1536), -- Para busca semântica metadata JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, version INTEGER DEFAULT 1 ); Armazena informações base dos documentos Inclui embeddings para busca semântica Mantém metadados flexíveis em JSONB Controla versões e datas 2.2 Capítulos (kb.chapters) sqlCopyCREATE TABLE kb.chapters ( chapter_id SERIAL PRIMARY KEY, doc_id INTEGER REFERENCES kb.documents(doc_id), title TEXT NOT NULL, content TEXT, content_embedding vector(1536), -- Para busca semântica em nível de capítulo sequence_number INTEGER, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, version INTEGER DEFAULT 1 ); Estrutura hierárquica do conteúdo Embeddings específicos por capítulo Sequenciamento ordenado 3. Sistema de Classificação e Relações 3.1 Tags e Relações sqlCopyCREATE TABLE kb.tags ( tag_id SERIAL PRIMARY KEY, tag_type TEXT NOT NULL, tag_value TEXT NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(tag_type, tag_value) ); CREATE TABLE kb.document_tags ( doc_id INTEGER REFERENCES kb.documents(doc_id), tag_id INTEGER REFERENCES kb.tags(tag_id), PRIMARY KEY (doc_id, tag_id) ); Sistema flexível de categorização Relacionamento muitos-para-muitos Tipos de tags para melhor organização 3.2 Relacionamentos entre Documentos sqlCopyCREATE TABLE kb.document_relationships ( relationship_id SERIAL PRIMARY KEY, source_doc_id INTEGER REFERENCES kb.documents(doc_id), target_doc_id INTEGER REFERENCES kb.documents(doc_id), relationship_type TEXT, strength FLOAT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(source_doc_id, target_doc_id, relationship_type) ); Mapeia conexões entre documentos Indica força da relação Permite múltiplos tipos de relacionamento 4. Sistema de Conhecimento 4.1 FAQs Contextuais sqlCopyCREATE TABLE kb.faqs ( faq_id SERIAL PRIMARY KEY, chapter_id INTEGER REFERENCES kb.chapters(chapter_id), question TEXT NOT NULL, answer TEXT NOT NULL, question_embedding vector(1536), -- Para busca semântica de perguntas created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); FAQs geradas automaticamente Embeddings para busca semântica Vinculadas a capítulos específicos 4.2 Referências sqlCopyCREATE TABLE kb.references ( ref_id SERIAL PRIMARY KEY, doc_id INTEGER REFERENCES kb.documents(doc_id), reference_type TEXT, citation TEXT, url TEXT, doi TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); Mantém referências bibliográficas Suporta múltiplos tipos de citação Inclui identificadores digitais 5. Sistema de Controle 5.1 Histórico de Versões sqlCopyCREATE TABLE kb.version_history ( version_id SERIAL PRIMARY KEY, entity_type TEXT NOT NULL, entity_id INTEGER NOT NULL, change_type TEXT NOT NULL, changes JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_by TEXT ); Rastreia todas as alterações Armazena detalhes das mudanças Mantém auditoria completa 5.2 Fila de Processamento sqlCopyCREATE TABLE kb.processing_queue ( queue_id SERIAL PRIMARY KEY, file_path TEXT NOT NULL, status TEXT DEFAULT 'pending', priority INTEGER DEFAULT 1, attempts INTEGER DEFAULT 0, last_attempt TIMESTAMP, error_message TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, processed_at TIMESTAMP ); Gerencia processamento assíncrono Controla tentativas e erros Prioriza processamentos 6. Otimizações 6.1 Índices sqlCopyCREATE INDEX idx_documents_title ON kb.documents USING gin (to_tsvector('portuguese', title)); CREATE INDEX idx_documents_content ON kb.documents USING gin (to_tsvector('portuguese', content)); CREATE INDEX idx_documents_embedding ON kb.documents USING ivfflat (content_embedding vector_cosine_ops); Otimiza busca textual Acelera busca semântica Melhora performance geral 6.2 Funções e Triggers sqlCopy-- Função de atualização de timestamp CREATE OR REPLACE FUNCTION kb.update_timestamp() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; -- Trigger exemplo CREATE TRIGGER update_documents_timestamp BEFORE UPDATE ON kb.documents FOR EACH ROW EXECUTE FUNCTION kb.update_timestamp(); Automatiza atualizações de timestamp Mantém consistência dos dados Facilita manutenção Esta estrutura proporciona: Armazenamento eficiente Busca semântica avançada Organização hierárquica Rastreamento de mudanças Processamento assíncrono Performance otimizada **exemplo -- Extensões necessárias CREATE EXTENSION IF NOT EXISTS pg_trgm; -- Para busca textual CREATE EXTENSION IF NOT EXISTS unaccent; -- Para lidar com acentos -- Esquema principal CREATE SCHEMA IF NOT EXISTS kb; -- Tabela de Documentos CREATE TABLE kb.documents ( doc_id SERIAL PRIMARY KEY, title TEXT NOT NULL, author TEXT, original_date DATE, processing_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, source_type TEXT CHECK (source_type IN ('pdf', 'ebook', 'video', 'documentation')), language TEXT DEFAULT 'pt-PT', original_file_path TEXT, md_file_path TEXT, content TEXT, metadata JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, version INTEGER DEFAULT 1 ); -- Tabela de Capítulos CREATE TABLE kb.chapters ( chapter_id SERIAL PRIMARY KEY, doc_id INTEGER REFERENCES kb.documents(doc_id), title TEXT NOT NULL, content TEXT, sequence_number INTEGER, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, version INTEGER DEFAULT 1 ); -- Tabela de Tags CREATE TABLE kb.tags ( tag_id SERIAL PRIMARY KEY, tag_type TEXT NOT NULL, tag_value TEXT NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(tag_type, tag_value) ); -- Tabela de relação Documentos-Tags CREATE TABLE kb.document_tags ( doc_id INTEGER REFERENCES kb.documents(doc_id), tag_id INTEGER REFERENCES kb.tags(tag_id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (doc_id, tag_id) ); -- Tabela de FAQs CREATE TABLE kb.faqs ( faq_id SERIAL PRIMARY KEY, chapter_id INTEGER REFERENCES kb.chapters(chapter_id), question TEXT NOT NULL, answer TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Tabela de Referências Bibliográficas CREATE TABLE kb.references ( ref_id SERIAL PRIMARY KEY, doc_id INTEGER REFERENCES kb.documents(doc_id), reference_type TEXT, citation TEXT, url TEXT, doi TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Tabela de Relacionamentos entre Documentos CREATE TABLE kb.document_relationships ( relationship_id SERIAL PRIMARY KEY, source_doc_id INTEGER REFERENCES kb.documents(doc_id), target_doc_id INTEGER REFERENCES kb.documents(doc_id), relationship_type TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(source_doc_id, target_doc_id, relationship_type) ); -- Tabela de Histórico de Versões CREATE TABLE kb.version_history ( version_id SERIAL PRIMARY KEY, entity_type TEXT NOT NULL, entity_id INTEGER NOT NULL, change_type TEXT NOT NULL, changes JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_by TEXT ); -- Tabela de Fila de Processamento CREATE TABLE kb.processing_queue ( queue_id SERIAL PRIMARY KEY, file_path TEXT NOT NULL, status TEXT DEFAULT 'pending', priority INTEGER DEFAULT 1, attempts INTEGER DEFAULT 0, last_attempt TIMESTAMP, error_message TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, processed_at TIMESTAMP ); -- Índices para otimização CREATE INDEX idx_documents_title ON kb.documents USING gin (to_tsvector('portuguese', title)); CREATE INDEX idx_documents_content ON kb.documents USING gin (to_tsvector('portuguese', content)); CREATE INDEX idx_chapters_content ON kb.chapters USING gin (to_tsvector('portuguese', content)); CREATE INDEX idx_documents_source_type ON kb.documents(source_type); CREATE INDEX idx_processing_queue_status ON kb.processing_queue(status); -- Funções CREATE OR REPLACE FUNCTION kb.update_timestamp() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; -- Triggers para atualização automática de timestamps CREATE TRIGGER update_documents_timestamp BEFORE UPDATE ON kb.documents FOR EACH ROW EXECUTE FUNCTION kb.update_timestamp(); CREATE TRIGGER update_chapters_timestamp BEFORE UPDATE ON kb.chapters FOR EACH ROW EXECUTE FUNCTION kb.update_timestamp(); -- Views úteis CREATE VIEW kb.document_summary AS SELECT d.doc_id, d.title, d.author, d.source_type, COUNT(DISTINCT c.chapter_id) as num_chapters, COUNT(DISTINCT f.faq_id) as num_faqs, COUNT(DISTINCT dt.tag_id) as num_tags, d.created_at, d.updated_at FROM kb.documents d LEFT JOIN kb.chapters c ON d.doc_id = c.doc_id LEFT JOIN kb.faqs f ON c.chapter_id = f.chapter_id LEFT JOIN kb.document_tags dt ON d.doc_id = dt.doc_id GROUP BY d.doc_id; -- Função para adicionar novo documento CREATE OR REPLACE FUNCTION kb.add_document( p_title TEXT, p_author TEXT, p_source_type TEXT, p_original_file_path TEXT, p_md_file_path TEXT ) RETURNS INTEGER AS $$ DECLARE v_doc_id INTEGER; BEGIN INSERT INTO kb.documents ( title, author, source_type, original_file_path, md_file_path, created_at ) VALUES ( p_title, p_author, p_source_type, p_original_file_path, p_md_file_path, CURRENT_TIMESTAMP ) RETURNING doc_id INTO v_doc_id; RETURN v_doc_id; END; $$ LANGUAGE plpgsql;