SQL avançado: domínio de CTE
O curso trata de CTEs recursivas no PostgreSQL, construídas sobre a tabela community_comments, o único model autorreferente da aplicação. Mostra por que um carregamento de thread com duas queries deixa de funcionar quando a profundidade não é fixa. Usa o método with_recursive do Rails, com uma âncora e um membro recursivo unidos por UNION ALL. Acrescenta colunas de profundidade e caminho, protege contra ciclos que a foreign key não impede e explica por que CTEs recursivas são sempre materializadas. Termina com CTEs que gravam e o motivo de a aplicação não usar nenhuma.
O que você vai aprender
- ✓Escrever CTEs recursivas com o método with_recursive do Rails
- ✓Como a âncora e o membro recursivo rodam rodada a rodada
- ✓Calcular profundidade e caminho dentro do membro recursivo
- ✓Interromper ciclos com uma guarda baseada no caminho
- ✓Por que CTEs recursivas são sempre materializadas e como o custo cresce
- ✓CTEs que gravam com RETURNING e por que esta aplicação não as usa
A única coisa que WITH não conseguia fazer
O curso de nível Júnior "ActiveRecord: fundamentos de CTE" fechou a primeira aula com uma promessa. Ele nomeou o que deixou de fora: uma CTE que referencia a si mesma, WITH RECURSIVE, para dados em árvore ou grafo, como um organograma ou as respostas de uma thread de comentários. Ele se chamou de…
Ler a aula completa grátis →Currículo
7 aulasA única coisa que WITH não conseguia fazer
Apresenta Community::Comment como a única tabela autorreferente da aplicação e por que uma thread de dois níveis dispensa recursão.
with_recursive: o próprio método real do Rails, verificado
Monta uma query recursiva com o método with_recursive do Rails, explicando a âncora, o membro recursivo e as rodadas.
Profundidade e caminho: o que o membro recursivo carrega adiante
Acrescenta as colunas depth e path, calculadas pelo membro recursivo a cada rodada, sem processamento em Ruby.
O ciclo que uma chave estrangeira não impede
Mostra que a foreign key em parent_id permite ciclos e os interrompe com uma guarda baseada no caminho.
Sempre materializada: o que RECURSIVE muda
Explica por que CTEs recursivas são sempre materializadas no PostgreSQL e como o custo cresce com as rodadas.
Uma CTE que escreve, e por que esta aplicação não recorre a uma
Demonstra um UPDATE com RETURNING dentro de uma CTE e por que os services da aplicação gravam pelo Active Record.
Juntando tudo: uma query, qualquer profundidade, sem loop
Junta âncora, membro recursivo, profundidade, caminho e guarda de ciclo numa query que lê threads de qualquer profundidade.