376 lines
11 KiB
Plaintext
Executable File
376 lines
11 KiB
Plaintext
Executable File
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;
|
|
|