Banco de Dados II — 2026.2

Aula 1
Apresentação da Disciplina

👨‍🏫 Prof. Gustavo Pinto 🏛️ UFPA 📅 1 de setembro de 2026 🕐 7h30 – 9h

Agenda de hoje

Em Banco de Dados I, escrevemos SQL

Aqui, escrevemos o programa que executa o SQL.

O critério de pronto

Devemos construir um minidb, em que podemos executar um SELECT com WHERE, dentro de uma transação que volta ao ar consistente depois de levar um kill -9 no meio do commit.

Sacou? O conteúdo do semestre foi escolhido de trás para frente, a partir dessa frase.

A anatomia de um SGBD

📝

Parser e catálogo

Do texto SQL a uma árvore que o programa entende

⚙️

Executor

Operadores que produzem linhas, um de cada vez

🌱

Índice e métodos de acesso

Achar a linha sem varrer a tabela inteira

💾

Buffer e armazenamento

Páginas em memória, páginas em disco, e o log

Vamos construir de baixo para cima, porque cada camada depende da anterior.

Por que o SGBD gerencia as próprias páginas?

O sistema operacional já tem cache de arquivo. Por que não usar só ele?

Os sete módulos

Uma aula teórica e duas de laboratório por módulo.

O que não vamos construir

E como esses temas entram?

Toda apresentação responde à mesma pergunta: o que precisaria mudar no minidb para ter isso?

A linguagem é escolha de vocês

Não estamos competindo em desempenho com o PostgreSQL. A escolha é sobre o que vocês querem aprender.

O que eu forneço não é código, é o contrato

O minidb lê comandos da entrada padrão e escreve o resultado na saída padrão, em formato definido. Assim os mesmos testes valem para qualquer linguagem.

$ ./minidb dados.db < consultas.sql
CREATE TABLE aluno (id INT, matricula INT);
OK
INSERT INTO aluno VALUES (1, 20260001);
OK 1
SELECT * FROM aluno WHERE id = 1;
1|20260001
(1 linha)

Ninguém fica para trás

O prazo de cada módulo é a data de publicação da referência. Depois dela, não há pontos.

Repositório e registro de avanços

Sete commits gigantes, um por módulo, na véspera de cada prazo, contam a história de um trabalho que não aconteceu.

Avaliação

🧩 Módulos M1 a M7M3 e M7 valem 10, os outros cinco valem 860 pts
🎤 Defesa oralIndividual, em 01/12 e 03/1220 pts
📚 SeminárioEm dupla, em 24/11 ou 26/1110 pts
📊 Relatório e apresentaçãoDemonstração ao vivo em 10/1210 pts

Como cada módulo é avaliado

Em dupla de implementação é comum um escrever e o outro assistir. Na defesa oral, cada um por si.

Cronograma · setembro e outubro

#DataDiaConteúdo
T001/09TerApresentação. Anatomia de um SGBD
T103/09QuiArmazenamento
08 e 10/09CBSoft 2026, sem aula
I115 e 17/09Laboratório M1. Entrega em 17/09
T222/09TerCache de páginas
I224 e 29/09Laboratório M2. Entrega em 29/09
T301/10QuiÁrvore B+
I306 e 08/10Laboratório M3. Entrega em 08/10
T413/10TerParser e catálogo
I415 e 20/10Laboratório M4. Entrega em 20/10
T522/10QuiExecutor
I527 e 29/10Laboratório M5. Entrega em 29/10

Cronograma · novembro e dezembro

#DataDiaConteúdo
T603/11TerTransações
I605 e 10/11Laboratório M6. Entrega e sorteio dos seminários em 10/11
T712/11QuiRecuperação
I717 e 19/11Laboratório M7. Entrega em 19/11
S124/11TerSeminários, primeira metade
S226/11QuiSeminários, segunda metade
DO01 e 03/12Defesa oral individual
08/12TerNossa Senhora da Conceição, sem aula
PF10/12QuiApresentações finais
15, 17 e 22/12Buffer, fechamento e notas

Sobre ferramentas de LLM

Um agente escreve uma árvore B+ em trinta segundos, e ela até passa nos testes.

Um banco de dados em 50 linhas

O SELECT inteiro do minidb 0.0. Guardem esta função: vamos passar o semestre consertando ela.

# le_tudo() abre o arquivo e devolve TODAS as linhas
if verbo == "SELECT":
    tabela  = p[p.index("FROM") + 1]
    colunas = esquema.get(tabela, [])
    linhas  = le_tudo()                      # o arquivo inteiro, sempre

    if "WHERE" in p:
        coluna, _, valor = p[p.index("WHERE") + 1 : ... ]
        indice = colunas.index(coluna)
        linhas = [l for l in linhas if l[indice] == valor]

    # imprime linha a linha, separado por |

E ele funciona

$ python3 hello.py dados.db < demo.sql
CREATE TABLE aluno (id, matricula, nome);
OK
INSERT INTO aluno VALUES (1, 20260001, Ana);
OK 1
SELECT * FROM aluno WHERE id = 2;
2|20260002|Bruno
(1 linha)

Cria tabela, insere, filtra e persiste em disco. É um banco de dados.

Agora com 5 milhões de linhas

$ ls -lh big.db
-rw-r--r--  136M  big.db

$ time python3 hello.py big.db < consulta.sql
4999999|25259999|nome4999999
(1 linha)

real    0m3,79s

Quase quatro segundos para achar uma linha. O PostgreSQL responde a mesma consulta em fração de milissegundo.

Cada defeito dele é um módulo nosso

Lê o arquivo inteiro a cada consultapágina e cache de páginasM1 M2
Percorre todas as linhas para achar umaárvore B+ e varredura por índiceM3 M5
O catálogo mora na memória e morre juntocatálogo em discoM4
O parser é um split() e um pouco de fétokenizador e gramáticaM4
Escreve direto no arquivo, sem registrolog, COMMIT e ROLLBACKM6
Uma queda deixa metade do trabalho feitolog de escrita antecipadaM7

Até a próxima aula

Na semana de 08 a 11/09 não haverá aula, por conta do CBSoft 2026. As entregas assíncronas vencem em 15/09.

Dúvidas?

Próxima aula: armazenamento, a página e o arquivo de dados

📧 gpinto@ufpa.br