Algún ejemplo del mundo real de un problema que no tendría idea de cómo resolver de manera razonable con SQL y una base de datos relacional sola (quizás mi culpa).
Entonces tenemos una base de datos (relacional común) con aproximadamente 30,000 productos. Nada grande hasta ahora. Cada uno de estos productos tiene muchos atributos. Hay los más comunes como grupo (cables, antenas, fundas para iphone ... alrededor de 80), surtido (de alguna manera similar a grupos: automóvil, equipo de música, mp3, solo 15), marca (30).
Luego vienen los datos técnicos. Cada artículo tiene muchos de esos como color, longitud del cable, peso, volumen. alrededor de 200 tipos de valores y miles de valores.
Y lo más complicado: muchos de esos productos pertenecen a algún tipo de automóvil (o varios de ellos) o algún tipo de dispositivo móvil. Éstos vienen en jerarquías en la forma como: marca (apple) modelo (ipad) tipo (1,2,3,4) y en algunos casos generación. (para automóviles es similar, aunque en lugar de generación tenemos años de fabricación)
Problema primer paso:
Queremos la cantidad de productos para cada uno de esos atributos. Cuantos son rojos? ¿Cuántos hay en el grupo de cable? Y así.
Esto podría resolverse parcialmente con SQL. Sería un montón de consultas y bastante feo, pero creo que es posible. Tal vez lento, pero podríamos hacerlo aún más feo y mantener contadores en cada tabla y actualizar cada cambio. Especialmente difícil con aquellos atributos donde un producto puede tener múltiples (como funciona con iPhone y otros 12 teléfonos móviles)
Pero aquí viene el problema, paso dos:
Cuando un cliente selecciona un atributo (digamos que solo quiere ver productos que son rojos), queremos actualizar todos esos contadores en tiempo real. Esto significa que tendríamos consultas extremadamente complicadas (probablemente no lo suficientemente rápido de todos modos) o mantendríamos contadores para posibles combinaciones de atributos (miles de millones).
Cuando comencé este proyecto, probaron la opción de contador y lo hicieron para un subconjunto muy pequeño de atributos (grupo, surtido, marca). El código era feo, con errores y lento. Además, ahora tenían una mesa con mostradores que era mucho más grande que la mesa de productos.
Usar las facetas de Apache Solr fue en realidad la solución. Acoplar las tablas en una lista de documentos (uno por producto) autorizados para obtener todos estos datos en tiempo real con consultas mucho más simples.