Supongamos que estoy creando un blog en el que quiero publicar publicaciones y comentarios. Así que creo dos tablas, una tabla de 'publicaciones' con una columna 'id' de entero autoincremento y una tabla de 'comentarios' que tiene una clave externa 'post_id'.
Luego quiero ejecutar lo que probablemente será mi consulta más común, que es recuperar una publicación y todos sus comentarios. Al ser bastante nuevo en las bases de datos relacionales, el enfoque que me parece más obvio es escribir una consulta que se parezca a algo como:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Lo que me daría el ID y el contenido de la publicación que quiero, junto con todas las filas de comentarios relevantes empaquetadas cuidadosamente en una matriz (una representación anidada como la que usarías en JSON). Por supuesto, SQL y las bases de datos relacionales no funcionan de esta manera, y lo más cerca que pueden llegar es hacer una unión entre 'publicaciones' y 'comentarios' que devolverá mucha duplicación innecesaria de datos (con la misma información de publicación repetida en cada fila), lo que significa que el tiempo de procesamiento se gasta tanto en la base de datos para ponerlo todo junto como en mi ORM para analizar y deshacer todo.
Incluso si le pido a mi ORM que cargue con entusiasmo los comentarios de la publicación, lo mejor que haré es enviar una consulta para la publicación, y luego una segunda consulta para recuperar todos los comentarios, y luego unirlos al cliente lado, que también es ineficiente.
Entiendo que las bases de datos relacionales son tecnología probada (demonios, son más antiguas que yo) y que se han realizado muchas investigaciones a lo largo de las décadas, y estoy seguro de que hay una muy buena razón por la que (y el estándar SQL) están diseñados para funcionar como lo hacen, pero no estoy seguro de por qué el enfoque que describí anteriormente no es posible. Me parece que es la forma más simple y obvia de implementar una de las relaciones más básicas entre los registros. ¿Por qué las bases de datos relacionales no ofrecen algo como esto?
(Descargo de responsabilidad: principalmente escribo aplicaciones web utilizando almacenes de datos Rails y NoSQL, pero recientemente he estado probando Postgres, y en realidad me gusta mucho. No pretendo atacar bases de datos relacionales, solo estoy perplejo. )
No estoy preguntando cómo optimizar una aplicación de Rails, o cómo solucionar mi problema en una base de datos en particular. Me pregunto por qué el estándar SQL funciona de esta manera cuando me parece contradictorio y me desperdicia. Debe haber alguna razón histórica por la cual los diseñadores originales de SQL quisieran que sus resultados se vieran así.