Suponha que eu esteja criando um blog que eu queira ter postagens e comentários. Portanto, crio duas tabelas, uma tabela 'posts' com uma coluna 'id' de número inteiro automático e uma tabela 'comments' que possui uma chave estrangeira 'post_id'.
Quero executar o que provavelmente será minha consulta mais comum, que é recuperar uma postagem e todos os seus comentários. Sendo uma novidade para os bancos de dados relacionais, a abordagem que me parece mais óbvia é escrever uma consulta que se pareça com:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
O que me daria o ID e o conteúdo da postagem que eu quero, juntamente com todas as linhas de comentários relevantes empacotadas ordenadamente em uma matriz (uma representação aninhada como você usaria no JSON). É claro que os bancos de dados SQL e relacionais não funcionam assim, e o mais próximo que eles podem chegar é fazer uma junção entre 'postagens' e 'comentários' que retornarão muita duplicação desnecessária de dados (com as mesmas informações de postagem repetidas em cada linha), o que significa que o tempo de processamento é gasto no banco de dados para reunir tudo e no meu ORM para analisar e desfazer tudo.
Mesmo que eu instrua meu ORM a carregar avidamente os comentários da postagem, o melhor que ele fará é enviar uma consulta para a postagem e, em seguida, uma segunda consulta para recuperar todos os comentários e reuni-los no lado do cliente, o que também é ineficiente.
Entendo que os bancos de dados relacionais são uma tecnologia comprovada (inferno, eles são mais antigos do que eu), e que houve uma tonelada de pesquisas neles ao longo das décadas e tenho certeza de que há uma boa razão para eles (e os Padrão SQL) foram projetados para funcionar da maneira que funcionam, mas não sei por que a abordagem descrita acima não é possível. Parece-me a maneira mais simples e óbvia de implementar um dos relacionamentos mais básicos entre registros. Por que os bancos de dados relacionais não oferecem algo assim?
(Isenção de responsabilidade: geralmente escrevo aplicativos da Web usando datastores Rails e NoSQL, mas recentemente venho testando o Postgres e realmente gosto muito. Não pretendo atacar bancos de dados relacionais, estou perplexo.)
Não estou perguntando como otimizar um aplicativo Rails ou como solucionar esse problema em um banco de dados específico. Estou perguntando por que o padrão SQL funciona dessa maneira quando parece contra-intuitivo e inútil para mim. Deve haver alguma razão histórica pela qual os designers originais do SQL queriam que seus resultados fossem assim.