L'indicizzazione di Magento è simile solo all'indicizzazione a livello di database nello spirito. Come afferma Anton, si tratta di un processo di denormalizzazione per consentire un funzionamento più rapido di un sito. Vorrei provare a spiegare alcuni dei pensieri alla base della struttura del database Magento e perché rende necessaria l'indicizzazione per operare velocemente.
In un database MySQL più "tipico", una tabella per la memorizzazione dei prodotti del catalogo sarebbe strutturata in questo modo:
PRODUCT:
product_id INT
sku VARCHAR
name VARCHAR
size VARCHAR
longdesc VARCHAR
shortdesc VARCHAR
... etc ...
Questo è veloce per il recupero, ma lascia un problema fondamentale per un pezzo di software di eCommerce:cosa fai quando vuoi aggiungere più attributi? Che cosa succede se vendi giocattoli e invece di una colonna di dimensioni, hai bisogno di age_range
? Bene, potresti aggiungere un'altra colonna, ma dovrebbe essere chiaro che in un grande negozio (pensa a Walmart, ad esempio), ciò comporterebbe righe vuote al 90% e tentare di mantenere nuovi attributi è quasi impossibile.
Per combattere questo problema, Magento divide i tavoli in unità più piccole. Non voglio ricreare l'intero sistema EAV in questa risposta, quindi per favore accetta questo modello semplificato:
PRODUCT:
product_id INT
sku VARCHAR
PRODUCT_ATTRIBUTE_VALUES
product_id INT
attribute_id INT
value MISC
PRODUCT_ATTRIBUTES
attribute_id
name
Ora è possibile aggiungere attributi a piacimento inserendo nuovi valori in product_attributes
e quindi inserire i record adiacenti in product_attribute_values
. Questo è fondamentalmente ciò che fa Magento (con un po' più di rispetto per i tipi di dati di quello che ho mostrato qui). In effetti, ora non c'è motivo per cui due prodotti abbiano campi identici, quindi possiamo creare interi tipi di prodotto con diversi insiemi di attributi!
Tuttavia, questa flessibilità ha un costo. Se voglio trovare il color
di una maglietta nel mio impianto (un banale esempio), devo trovare:
- Il
product_id
dell'articolo (nella tabella prodotti) - Il
attribute_id
percolor
(nella tabella degli attributi) - Infine, il
value
effettivo (nella tabella attributi_valori)
Magento funzionava così, ma era lentissimo. Quindi, per consentire prestazioni migliori, hanno fatto un compromesso:una volta che il proprietario del negozio ha definito gli attributi desiderati, vai avanti e genera il grande tavolo dall'inizio. Quando qualcosa cambia, eliminalo dallo spazio e generalo di nuovo. In questo modo, i dati vengono archiviati principalmente nel nostro bel formato flessibile, ma interrogati da un'unica tabella.
Queste tabelle di ricerca risultanti sono gli "indici" Magento. Quando reindicizzi, fai esplodere la vecchia tabella e la generi di nuovo.
Spero che questo chiarisca un po' le cose!
Grazie, Joe