📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 08: Bancos de Dados SQL e NoSQL. Recomendado revisar antes de começar.

🏥 Prontuário Médico Objeto-Relacional & Operadores JSONB no PostgreSQL

v1.0 — Tipos Semiestruturados, Índices Invertidos GIN e Consultas por Contenção

Trilha de Engenharia de Dados & Bancos de Dados — Projeto 7 de 10

🎓 Nível Profissional Simulado: Arquiteto de Software / Especialista PostgreSQL. Em clínicas médicas e hospitais veterinários, dados de pacientes (cadastros, tutores, financeiro) exigem integridade relacional estrita (ACID), enquanto prescrições, dosagens e exames exigem flexibilidade dinâmica. O tipo JSONB no PostgreSQL une o melhor dos dois mundos.


🎯 Objetivo

Implementar uma arquitetura de banco de dados híbrida Objeto-Relacional no PostgreSQL 16 para prontuários clínicos veterinários, combinando integridade referencial com tabelas relacionais (tutores, animais) e documentos clínicos complexos em colunas JSONB, aceleradas por Índices Invertidos Generalizados (GIN) e operadores de busca profunda (@>, ->>).


🏗️ Diagrama do Modelo Híbrido Relacional + JSONB

erDiagram
    TUTORES ||--o{ ANIMAIS : "possui (1:N)"
    ANIMAIS ||--o{ ATENDIMENTOS_CLINICOS : "recebe (1:N)"

    TUTORES {
        int id PK
        string nome
        string cpf UK
        string telefone
        string endereco
    }

    ANIMAIS {
        int id PK
        int tutor_id FK
        string nome
        string especie
        string raca
        decimal peso_kg "CHECK > 0"
    }

    ATENDIMENTOS_CLINICOS {
        int id PK
        int animal_id FK
        string veterinario
        timestamp data_consulta
        jsonb prontuario_json "Indexado via GIN"
    }

🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Diretoria Clínica Veterinária)

“Nossos veterinários atendem desde cães e gatos até animais silvestres. Cada especialidade (oftalmologia, ortopedia, cardiologia) anota parâmetros completamente diferentes no prontuário. Não queremos um sistema rígido onde cada novo exame exija alterar o banco, mas também não podemos abrir mão de vincular com segurança o animal ao tutor responsável. Precisamos conseguir pesquisar instantaneamente quais animais já tomaram a vacina da Raiva ou receberam certo antibiótico.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

ID Tipo Descrição Origem no Briefing
RF01 Funcional Cadastrar tutores e animais com integridade referencial relacional (FOREIGN KEY). “vincular animal ao tutor”
RF02 Funcional Armazenar prescrições, dosagens, sintomas e vacinas em estrutura flexível JSONB. “cada especialidade anota parâmetros diferentes”
RF03 Funcional Permitir buscas por contenção de tags e vacinas através do operador @>. “pesquisar quais tomaram a vacina”
RNF01 Não-Funcional Índice GIN no campo JSONB para resposta em tempo logarítmico. Performance de Busca Clínica
RNF02 Não-Funcional Validação de tipos atômicos em colunas relacionais e integridade ON DELETE RESTRICT. Segurança Cadastral

📋 Fase 2 — Backlog & User Stories

ID User Story Prioridade
US01 Como veterinário, quero registrar diagnósticos e prescrições sem restrições rígidas de schema. Alta
US02 Como recepcionista, quero consultar o histórico de vacinas aplicadas em um animal instantaneamente. Alta
US03 Como gestor da clínica, quero filtrar atendimentos que prescreveram medicamentos controlados. Média

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# Branch da funcionalidade
git checkout -b feature/US01-postgres-jsonb-prontuario

# Subir o PostgreSQL Clínico isolado
docker-compose up -d

# Conectar via psql
docker exec -it db_postgres_clinica psql -U vet_admin -d clinica_vet_db

🛠️ Fase 4 — Implementação Passo a Passo (sql/01_schema_jsonb.sql)

CREATE TABLE atendimentos_clinicos (
    id SERIAL PRIMARY KEY,
    animal_id INT NOT NULL REFERENCES animais(id) ON DELETE RESTRICT,
    veterinario VARCHAR(100) NOT NULL,
    data_consulta TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    prontuario_json JSONB NOT NULL
);

-- Índice GIN para busca profunda por contenção
CREATE INDEX idx_prontuario_gin ON atendimentos_clinicos USING GIN (prontuario_json);

🧭 Decisões Técnicas (ADRs)


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd db_sql_07_postgres_jsonb_clinica

2. Execute a aplicação ou testes

docker-compose up -d
# Executar a suíte de testes automatizados:
python -m unittest tests/test_postgres_jsonb.py

[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd catalogo_projetos/db_sql_07_postgres_jsonb_clinica


🧪 Testes de Validação & Asserções

-- Buscar atendimentos em que a vacina 'Raiva' foi aplicada via operador @>
SELECT a.nome AS animal, t.veterinario, t.data_consulta, t.prontuario_json->>'diagnostico' AS diagnostico
FROM atendimentos_clinicos t
JOIN animais a ON a.id = t.animal_id
WHERE t.prontuario_json @> '{"vacinas_aplicadas": ["Raiva"]}';


🏛️ Arquitetura Visual & Engenharia de Dados

A arquitetura abaixo demonstra o fluxo de persistência, otimização e isolamento dos componentes na subpasta sql/:

Arquitetura do Banco de Dados

flowchart TD
    subgraph DDL["Modelagem & Schema (DDL)"]
        S1["Tabelas / Coleções"] --> S2["Constraints & Índices"]
    end
    subgraph DML["Regras & Automação (DML / PL)"]
        R1["Triggers / Aggregations"] --> R2["Procedimentos Transacionais"]
    end
    subgraph Perf["Otimização & Armazenamento"]
        P1["Planos EXPLAIN / Partições"] --> P2["Garantia de ACID / TTL"]
    end
    subgraph Homolog["Homologação & Qualidade"]
        Q1["Docker Compose & Scripts"] --> Q2["Checkpoints CP-01..05 PASS"]
    end

    DDL --> DML
    DML --> Perf
    Perf --> Homolog

    style DDL fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
    style DML fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
    style Perf fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
    style Homolog fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

ID Persona História de Usuário Critério de Aceite Prioridade
US-01 Engenheiro Hospitalar Desejo combinar tabelas relacionais com dados clínicos semiestruturados Tabela de pacientes com dados demográficos e coluna prontuario em JSONB Alta
US-02 Médico Especialista Desejo consultar exames e laudos aninhados usando operadores @> e -» Queries rápidas filtrando pacientes por diagnósticos codificados no JSON Alta
US-03 DBA Especialista Desejo criar índices GIN sobre campos específicos do documento JSONB Índices jsonb_path_ops reduzindo custo de busca em atributos dinâmicos Alta
US-04 Desenvolvedor Backend Desejo atualizar trechos específicos do prontuário com jsonb_set Modificação cirúrgica de propriedades sem reescrever o documento inteiro Média
US-05 Auditor Clínico Desejo testes validando conformidade de esquema via JSON Schema validation Check constraints no PostgreSQL assegurando campos obrigatórios no JSON Média

⚙️ Requisitos Funcionais (RF)

ID Descrição do Requisito Criticidade
RF-01 Modelo híbrido relacional e documental centrado em prontuário eletrônico Alta
RF-02 Consultas avançadas com operadores JSONB (@>, ?, ?&, ->, -») Alta
RF-03 Indexação especializada GIN com operador jsonb_path_ops Alta
RF-04 Funções de mutação parcial atômica com jsonb_set e operador - (remover chave) Média
RF-05 Scripts de carga e testes automatizados de consultas profundas Média

🛡️ Requisitos Não-Funcionais (RNF)

ID Especificação Arquitetural Criticidade
RNF-01 Performance de busca em campos indexados com GIN comparável a colunas relacionais Alta
RNF-02 Garantia de integridade e validação de formato JSON no nível de armazenamento Alta
RNF-03 Flexibilidade para evolução de esquema sem necessidade de migrações pesadas Média
RNF-04 Conformidade com padrões de privacidade médica e LGPD Alta
RNF-05 Isolamento dos comandos e migrations em sql/ Alta

🔗 Matriz de Rastreabilidade (RTM)

User Story Requisito Funcional Requisito Não-Funcional Módulo / Artefato de Código Status de Homologação
US-01 RF-01 RNF-02, RNF-04 sql/01_clinical_schema.sql Testado
US-02 RF-02 RNF-01, RNF-03 sql/02_jsonb_queries.sql Testado
US-03 RF-03 RNF-01, RNF-05 sql/03_gin_indexes.sql Testado
US-04 RF-04 RNF-02, RNF-03 sql/02_jsonb_queries.sql Testado
US-05 RF-05 RNF-01, RNF-05 tests/test_jsonb_clinica.py Testado

🏁 Checkpoints de Qualidade & Homologação

Checkpoint Escopo da Validação Artefato Verificado Status
CP-01 Subida Conteinerizada do Ambiente docker-compose.yml PASS ✅
CP-02 Criação de Estrutura & Schemas sql/ PASS ✅
CP-03 Automação Transacional & Regras Triggers / Queries PASS ✅
CP-04 Otimização de Performance & Índices Indexes / Tuning PASS ✅
CP-05 Homologação com Suíte de Testes tests/ PASS ✅