Banco de Dados II
Horário
Terça e Quinta, 7h30 às 9h. De 01/09/2026 a 22/12/2026.
Objetivo
Construir um sistema gerenciador de banco de dados do zero, pequeno mas funcional, para entender por dentro o que acontece entre o momento em que você escreve uma consulta e o momento em que o resultado volta.
Em Banco de Dados I aprendemos a escrever SQL. Aqui escrevemos o programa que executa o SQL.
Ementa
Revisão dos conceitos básicos de bancos de dados. Aspectos operacionais em sistemas de banco de dados: armazenamento e indexação, processamento e otimização de consultas, controle de concorrência, recuperação de falhas, segurança e integridade. Bancos de dados não convencionais.
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? :)
Os sete módulos
Cada módulo tem uma aula teórica e duas aulas de laboratório. São sete módulos, e cada um adiciona uma peça ao minidb:
- Página e arquivo de dados. Registros de tamanho fixo em páginas de tamanho fixo.
- Cache de páginas. Páginas em memória, marcação de página suja, escrita no disco.
- Árvore B+. Busca e inserção com divisão de nó.
- Parser e catálogo.
CREATE TABLE,INSERTeSELECTcomWHEREde igualdade. - Executor. Modelo iterador, varredura sequencial, varredura por índice e filtro.
- Transações.
BEGIN,COMMIT,ROLLBACKe log com valor antes e depois. - Recuperação. Log de escrita antecipada, e refazer e desfazer na partida.
O que não implementamos
- Remoção na árvore B+. Fusão e redistribuição de nós é a parte mais difícil da estrutura, e o critério de pronto só precisa de busca e inserção.
- Registros de tamanho variável. Nada de página com diretório de slots, campo
VARCHARde tamanho livre ou mapa de nulos. Tudo tem tamanho fixo. - Junções e ordenação. Sem
JOIN, semORDER BY, sem agregação. Uma tabela por consulta. - Otimizador. A escolha entre índice e varredura é uma regra de três linhas, não um modelo de custo.
- Concorrência. O
minidbatende uma sessão por vez. Sem bloqueios, sem níveis de isolamento, sem deadlock. - Checkpoint e ARIES completo. A recuperação lê o log inteiro desde o começo, sem número de sequência nem registro de compensação.
Nada disso vira aula minha. Concorrência, segurança e bancos não convencionais são exigências da ementa, e são cobertos pelos seminários de novembro, em que cada dupla estuda um desses temas e apresenta para a turma.
Como a disciplina funciona
A linguagem é escolha de vocês. C, Python, Go, Rust, Java, o que preferirem. Eu forneço o contrato, e não é código. Qualquer linguagem que leia da entrada padrão e escreva na saída padrão passa nos mesmos testes.
O protocolo é o mais simples possível. O minidb recebe comandos SQL, um por linha, e imprime o resultado em formato definido:
$ ./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)
Escolham a linguagem na primeira semana, e não mudem depois. C ensina mais sobre memória e disco, e custa perto do dobro do tempo. Python some do caminho e deixa vocês pensarem em estrutura. Não estamos competindo em desempenho com o PostgreSQL, então a escolha é sobre o que vocês querem aprender, não sobre velocidade.
Repositório e registro de avanços
Cada dupla deve manter um repositório público, no GitHub criado na primeira semana e usado do começo ao fim.
O repositório precisa mostrar o processo. Commits pequenos e frequentes. Um repositório com sete commits gigantes, um por módulo, na véspera de cada prazo, conta a história de um trabalho que não aconteceu.
Cada módulo entra por pull request e traz um NOTES.md com um parágrafo sobre a decisão de projeto mais difícil daquele módulo. É esse parágrafo, somado ao histórico, que eu leio antes da defesa oral.
Nenhuma biblioteca de banco de dados é permitida dentro do minidb, pelo motivo óbvio.
Bibliografia
- SCIORE, E. Database Design and Implementation: Second Edition. Springer, 2020. Referência principal, porque constrói um SGBD inteiro.
- ELMASRI, R.; NAVATHE, S. B. Sistemas de Banco de Dados. 7ª edição. Pearson, 2018.
- PETROV, A. Database Internals. O’Reilly, 2019.
Material extra
- CMU 15-445, Intro to Database Systems, aulas em vídeo abertas
- Let’s Build a Simple Database, um clone do SQLite construído em C, passo a passo
- Algorithms Behind Modern Storage Systems, CACM
- A Critique of ANSI SQL Isolation Levels, para a aula de concorrência
Avaliação
- Módulos M1 a M7: 60 pontos
- Defesa oral individual do código: 20 pontos
- Seminário: 10 pontos
- Relatório final e apresentação: 10 pontos
Módulos (60 pontos)
Entrega por pull request no fork da dupla, até as 23h59 da data indicada. M3 e M7 valem 10 pontos cada, por serem os dois mais difíceis; os outros cinco valem 8.
A nota de cada módulo se divide em: metade pelos testes de aceitação que passam, um terço pela qualidade do código e do histórico de commits, e o restante pelo NOTES.md.
Módulo entregue depois da publicação da implementação de referência não recebe pontos, porque a referência já está pública.
Defesa oral individual (20 pontos)
Em 01/12 e 03/12, cada aluno explica sozinho um trecho do minidb da própria dupla, escolhido por mim na hora. Em dupla de implementação é comum um escrever e o outro assistir. Aqui é cada um por sí :)
Seminário (10 pontos)
Nos dias 24/11 e 26/11, cada dupla apresenta um dos temas que o minidb não implementa. São dez minutos de apresentação e três de perguntas, sem relatório escrito. A entrega é a apresentação mais uma página de referências consultadas.
Os temas são sorteados em 10/11, um por dupla:
- Controle de concorrência e bloqueio em duas fases
- Níveis de isolamento e as anomalias que cada um permite
- Algoritmos de junção: laço aninhado, ordenação e fusão, hash
- Otimização baseada em custo: estatísticas e estimativa de cardinalidade
- Segurança: injeção de SQL, privilégios e segurança em nível de linha
- Armazenamento colunar e por que ele domina análise de dados
- LSM-trees e os bancos chave-valor
- Bancos distribuídos: replicação e particionamento
A pergunta que toda apresentação precisa responder é a mesma: o que precisaria mudar no minidb para ter isso? Não quero um resumo de capítulo de livro. Quero que vocês liguem o tema ao código que escreveram.
Quem apresenta lendo material de consulta recebe zero.
Relatório final e apresentação (10 pontos)
Relatório de 3 a 4 páginas respondendo a três perguntas: como o minidb de vocês está organizado, qual decisão de projeto vocês tomaram diferente do que o livro sugere e por quê, e o que fariam diferente recomeçando.
A apresentação é de 10 minutos em 10/12, e o centro dela é a demonstração ao vivo do critério de pronto: a consulta com índice, dentro da transação, e o kill -9. Ensaiem.
Cronograma
Passível de alterações. Verificar o calendário acadêmico oficial da UFPA para feriados estaduais e municipais.
| # | Data | Dia | Conteúdo |
|---|---|---|---|
| T0 | 01/09 | Ter | Apresentação. A anatomia de um SGBD, o critério de pronto e o que não vamos construir |
| T1 | 03/09 | Qui | Armazenamento: por que a página é a unidade, registro de tamanho fixo, heap file |
| — | 08/09 | Ter | CBSoft 2026, sem aula (atividade assíncrona) |
| — | 10/09 | Qui | CBSoft 2026, sem aula (atividade assíncrona) |
| I1 | 15/09 | Ter | Laboratório: leitura e escrita de páginas |
| I1 | 17/09 | Qui | Laboratório: serialização de registros. Entrega M1 |
| T2 | 22/09 | Ter | Cache de páginas: por que existe, página suja, política de substituição |
| I2 | 24/09 | Qui | Laboratório: cache de páginas |
| I2 | 29/09 | Ter | Laboratório: escrita no disco e integração com M1. Entrega M2 |
| T3 | 01/10 | Qui | Árvore B+: nós internos e folhas, busca, inserção com divisão, altura e I/O |
| I3 | 06/10 | Ter | Laboratório: busca e inserção sem divisão |
| I3 | 08/10 | Qui | Laboratório: divisão de nó. Entrega M3 |
| T4 | 13/10 | Ter | Parser e catálogo: do texto à árvore sintática. Injeção de SQL |
| I4 | 15/10 | Qui | Laboratório: tokenizador e parser (confirmar Dia do Professor) |
| I4 | 20/10 | Ter | Laboratório: catálogo de tabelas. Entrega M4 |
| T5 | 22/10 | Qui | Executor: modelo iterador, varredura sequencial, varredura por índice, seletividade |
| I5 | 27/10 | Ter | Laboratório: varredura sequencial e filtro |
| I5 | 29/10 | Qui | Laboratório: varredura por índice e a regra de escolha. Entrega M5 |
| T6 | 03/11 | Ter | Transações: ACID, log com valor antes e depois, atomicidade por desfazer |
| I6 | 05/11 | Qui | Laboratório: BEGIN, COMMIT e o log |
| I6 | 10/11 | Ter | Laboratório: ROLLBACK. Entrega M6 e sorteio dos temas de seminário |
| T7 | 12/11 | Qui | Recuperação: escrever o log antes do dado, fsync no commit, refazer e desfazer |
| I7 | 17/11 | Ter | Laboratório: log de escrita antecipada |
| I7 | 19/11 | Qui | Laboratório: recuperação após o kill -9. Entrega M7 |
| S1 | 24/11 | Ter | Seminários, primeira metade das duplas |
| S2 | 26/11 | Qui | Seminários, segunda metade das duplas |
| DO | 01/12 | Ter | Defesa oral individual, parte 1 |
| DO | 03/12 | Qui | Defesa oral individual, parte 2 |
| — | 08/12 | Ter | Nossa Senhora da Conceição, sem aula (feriado municipal em Belém) |
| PF | 10/12 | Qui | Apresentações finais, 15 minutos por dupla |
| — | 15/12 | Ter | Buffer |
| — | 17/12 | Qui | Buffer |
| — | 22/12 | Ter | Buffer, fechamento e notas |
Atividades Assíncronas
Na semana de 08 a 11/09 estarei no CBSoft 2026, no IME-USP, e não haverá aula em 08/09 e 10/09. Entregas para 15/09:
- Criar o repositório da dupla, escolher a linguagem, rodar o script de testes e enviar a saída, que deve mostrar todos os testes falhando.
- Responder em um parágrafo: por que o SGBD gerencia as próprias páginas em vez de deixar isso para o sistema operacional?
Sobre o uso de ferramentas de LLM
Um agente escreve uma árvore B+ inteira em trinta segundos, e ela até passa nos testes. Se vocês fizerem isso, terão um repositório bonito e nenhum aprendizado, e a defesa oral de dezembro vai deixar isso evidente para todo mundo, inclusive para vocês. Ela vale 20 pontos por esse motivo.
A regra prática: use a ferramenta para explicar, não para produzir. Peça para ela desenhar o que acontece quando um nó divide, peça outro exemplo, peça para revisar o código que vocês escreveram. O NOTES.md de cada módulo existe para registrar a decisão que vocês tomaram, e não sai de código que vocês não entenderam.
Entrega atrasada
Entregas após o prazo serão aceitas, mas os pontos referentes não serão contabilizados. No caso dos módulos, o prazo é a publicação da implementação de referência.
Política de plágio
Os módulos devem ser implementados pela dupla. Duplas são encorajadas a discutir ideias entre si, mas copiar código de outra dupla, ou do fork de outra dupla, configura plágio, e nesse caso as duplas envolvidas não receberão os pontos do módulo.