📚 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.
v1.0 — Tipos Semiestruturados, Índices Invertidos GIN e Consultas por Contenção
Trilha de Engenharia de Dados & Bancos de Dados — Projeto 7 de 10
- v1: Modelagem Relacional 3FN · PostgreSQL 16
- v2: Modelagem NoSQL · MongoDB 7.0
- v3: Estratégias de Cache · Redis 7.2
- v4: DBA Enterprise · Particionamento & RLS · PostgreSQL 16
- v5: Modelagem Visual EER & Stored Procedures · MySQL 8.0
- v6: Séries Temporais IoT · Apache Cassandra 5.0
- ➡️ v7 (este): Prontuário Objeto-Relacional & JSONB · PostgreSQL 16
- v8: Rastreamento de Fraudes em Grafos · Neo4j 5.x
- v9: Data Warehouse & Consultas OLAP · PostgreSQL 16
- v10: Persistência Poliglota Integrada · Postgres + Mongo + Redis
🎓 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
JSONBno PostgreSQL une o melhor dos dois mundos.
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 (@>, ->>).
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"
}
“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.”
| 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 |
| 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 |
# 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
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);
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd db_sql_07_postgres_jsonb_clinica
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
-- 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"]}';
A arquitetura abaixo demonstra o fluxo de persistência, otimização e isolamento dos componentes na subpasta sql/:
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
| 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 |
| 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 |
| 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 |
| 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 |
| 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 ✅ |