Algum exemplo do mundo real de um problema que eu não teria idéia de como resolver de uma maneira razoável apenas com SQL e um banco de dados relacional (talvez seja minha culpa).
Portanto, temos um banco de dados (relacional comum) com cerca de 30.000 produtos. Nada grande até agora. Cada um desses produtos possui muitos atributos. Existem os mais comuns, como grupo (cabos, antenas, capas para iphone ... cerca de 80), sortimento (de alguma forma semelhante a grupos: carro, hifi, mp3, apenas 15), marca (30).
Depois vem os dados técnicos. Cada item tem muitos itens como cor, comprimento do cabo, peso, volume. cerca de 200 tipos de valores e milhares de valores.
E o mais complicado: muitos desses produtos pertencem a algum tipo de carro (ou vários deles) ou a algum tipo de dispositivo móvel. Esses vêm em hierarquias na forma como: tipo de marca (maçã) (ipad) (1,2,3,4) e, em alguns casos, geração. (para carros é semelhante, embora em vez de geração tenhamos anos de construção)
Etapa 1 do problema:
Queremos a quantidade de produtos para cada um desses atributos. Quantos são vermelhos? Quantos estão no grupo de cabos? E assim por diante.
Isso pode ser parcialmente resolvido com o SQL. Seria um monte de consultas e bastante feio, mas acho possível. Talvez lento, mas poderíamos fazê-lo ainda mais feio e manter os contadores em cada tabela e atualizar a cada alteração. Especialmente difícil com os atributos em que um produto pode ter vários (como funciona com o iPhone e outros 12 telefones celulares)
Mas aqui vem o problema, etapa dois:
Quando um cliente seleciona um atributo (digamos que ele quer apenas ver produtos vermelhos), queremos atualizar todos esses contadores em tempo real. Isso significa que teríamos consultas extremamente complicadas (provavelmente pouco rápidas de qualquer maneira) ou manteríamos contadores para possíveis combinações de atributos (bilhões).
Quando eu comecei neste projeto, eles deram a opção de contador e tentaram fazer isso para um subconjunto muito pequeno de atributos (grupo, sortimento, marca). O código era feio, com erros e lento. Além disso, agora eles tinham uma mesa com balcões que era muito maior que a mesa de produtos.
Usar as facetas do Apache Solr foi realmente a solução. Nivele as tabelas em uma lista de documentos (um por produto) permitidos para obter todos esses dados em tempo real com consultas muito mais simples.