Alcuni esempi reali di un problema non avrei idea di come risolvere in modo ragionevole con SQL e un database relazionale da solo (forse è colpa mia).
Quindi abbiamo un database (comune relazionale) con circa 30.000 prodotti. Niente di così grande finora. Ognuno di questi prodotti ha molte caratteristiche. Ci sono quelli comuni come gruppo (cavi, antenne, custodie iphone ... circa 80), assortimento (in qualche modo simile ai gruppi: auto, hifi, mp3, solo 15), marca (30).
Poi arrivano i dati tecnici. Ogni articolo ha molti di quelli come colore, lunghezza del cavo, peso, volume. circa 200 tipi di valore e migliaia di valori.
E il più complicato: molti di questi prodotti appartengono a qualche tipo di auto (o a molti di essi) oa qualche tipo di dispositivo mobile. Quelli entrano in gerarchie nella forma come: marca (apple) model (ipad) type (1,2,3,4) e in alcuni casi generazione. (per le auto è simile, anche se invece di generazione abbiamo anni di costruzione)
Problema Passaggio 1:
Vogliamo la quantità di prodotti per ciascuno di questi attributi. Quanti sono rossi? Quanti sono nel gruppo di cavi? E così via.
Questo potrebbe parzialmente essere risolto con SQL. Sarebbe un sacco di domande e piuttosto brutto, ma penso possibile. Forse lento ma potremmo farlo ancora più brutto e mantenere i contatori in ogni tabella e aggiornarlo ad ogni cambio. Particolarmente difficile con quegli attributi in cui un prodotto può avere molteplici (come funziona con iPhone e altri 12 telefoni cellulari)
Ma ecco il passaggio due del problema:
Quando un cliente seleziona un attributo (diciamo che vuole vedere solo i prodotti rossi), vogliamo aggiornare tutti quei contatori in tempo reale. Ciò significa che avremmo query estremamente complicate (non è probabile abbastanza veloce in ogni caso) o mantenere contatori per possibili combinazioni di attributi (miliardi).
Quando ho iniziato questo progetto, hanno dato una prova all'opzione contatore e lo abbiamo fatto per un sottogruppo di attributi molto piccolo (gruppo, assortimento, marca). Il codice era brutto, buggy e lento. Inoltre ora disponevano di una tabella con contatori che era molto più grande della tabella dei prodotti.
L'utilizzo delle faccette di Apache Solr era in realtà la soluzione. Appiattisci le tabelle in un elenco di Documenti (uno per prodotto) che consente di ottenere tutti questi dati in tempo reale con query molto più semplici.