Supongamos que estoy construyendo un blog en el que quiero tener publicaciones y comentarios. Por lo tanto, creo dos tablas, una tabla de 'publicaciones' con una columna de 'identificación' de enteros automáticos 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 vería así:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Lo que me daría la identificación y el contenido de la publicación que quiero, junto con todas las filas de comentarios relevantes empaquetadas ordenadamente en una matriz (una representación anidada como la que usarías en JSON). Por supuesto, las bases de datos relacionales y SQL no funcionan así, y lo más cerca que pueden estar es hacer una unión entre 'publicaciones' y 'comentarios' que devolverá una gran cantidad de 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 poner todo junto como en mi ORM para analizar y deshacer todo.
Incluso si le indico a mi ORM que cargue con entusiasmo los comentarios de la publicación, lo mejor que puede hacer es enviar una consulta para la publicación, y luego una segunda consulta para recuperar todos los comentarios, y luego reunirlos del lado del cliente, que También es ineficiente.
Entiendo que las bases de datos relacionales son tecnología comprobada (demonios, son más antiguas que yo), y que se ha realizado una gran cantidad de investigación a lo largo de las décadas, y estoy seguro de que hay una muy buena razón por la cual ellas (y el SQL estándar) están diseñados para funcionar de la manera en que lo hacen, pero no estoy seguro de por qué el enfoque que describí anteriormente no es posible. Me parece 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 usando almacenes de datos Rails y NoSQL, pero recientemente he estado probando Postgres, y en realidad me gusta mucho. No quiero atacar bases de datos relacionales, estoy perplejo).
No estoy preguntando cómo optimizar una aplicación Rails, o cómo solucionar este 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 antieconómico. Debe haber alguna razón histórica por la cual los diseñadores originales de SQL querían que sus resultados se vean así.