Question

Je me sens comme cette question a été posée sans doute mille fois déjà, je présente mes excuses si elle a été répondu. Et si oui, quelqu'un peut me pointer vers les bons messages / liens?

Ce que je suis en train de faire est de construire une navigation à facettes pour mon site. Il utilise MySQL et est ici une esquisse des tableaux que je utilise:

products:
- id
- title
- description
attributes:
- product_id
- name
- value
categories:
- id
- name
products_to_categories:
- product_id
- category_id

Ce que je veux faire est d'afficher une liste des attributs disponibles lorsque vous êtes dans une catégorie, ce qui vous permet de sélectionner une ou plusieurs valeurs pour chacun de ces attributs. Pour vous donner un exemple, regardez cette page de Office Depot: http : //www.officedepot.com/a/browse/binders/N=5+2177/

Jusqu'à présent, je l'ai utilisé beaucoup de jointures pour filtrer sur plusieurs attributs:

SELECT products.*, a_options.*
FROM products_to_categories AS pc, products,
attributes AS a_options,    /* list of attribute/value pairs I can continue to refine on */
attributes AS a_select1     /* first selected attribute */
attributes AS a_select2     /* second selected attribute */
...
WHERE pc.category_id = 1
AND products.id = pc.product_id
AND a_options.product_id = products.id
AND a_options.name != 'Color' AND a_options.name != 'Size'
AND a_select1.product_id = products.id
AND a_select1.name = 'Color' AND (a_select1.value = 'Blue' OR a_select1.value = 'Black')
AND a_select2.product_id = products.id
AND a_select2.name = 'Size' AND a_select2.value = '8.5 x 11'

En gros a_options retournera tous les attributs pour ces produits qui sont un sous-ensemble des filtres appliqués à l'aide que j'ai a_select1 et a_select2. Donc, si j'utilise le Liants exemple de Office Depot, je veux montrer tous les attributs disponibles après avoir sélectionné bleu ou noir pour couleur et « 8,5 x 11 » pour la taille.

J'utilise ensuite le code PHP pour supprimer les doublons et disposer les attributs résultant dans un tableau comme celui-ci:

attributes[name1] = (val1, val2, val3, ...)
attributes[name2] = (val1, val2, val3, ...)

Est-il possible que je peux accélérer ma requête ou écrire plus efficacement? Je index de configuration sur le nom et la valeur dans la table des attributs (et aussi sur tous les numéros d'identification). Mais si quelqu'un choisit un couple d'attributs, la requête tourne lentement.

Merci pour votre aide à l'avance,
Sridhar

Était-ce utile?

La solution

"J'utilise ensuite le code PHP pour supprimer les doublons"

Il ne sera pas l'échelle alors.

Après avoir lu http://www.amazon.com/Data-Warehouse-Toolkit -Les techniques-Dimensional / dp / 0471153370 je suis le déploiement de facettes et mécanismes de filtrage non stop.

L'idée de base est que vous utilisez un schéma en étoile ..

Vous créez une table de faits qui stocke des faits

customerid | dateregisteredid | datelastloginid
1 | 1 | 1
2 | 1 | 2

Vous utilisez les clés étrangères dans les tables de dimension qui stockent les attributs

date_registered
Id | weekday | weeknumber | year | month | month_year | daymonth | daymonthyear
1 | Wed      | 2            | 2009 | 2   |2-2009      | 4        | 4-2-2009

Alors whichver la date "paradigme" que vous utilisez, saisir toutes les ids de cette table de dimension et

 select * from the fact table where the fact.dateregisteredid is IN( ... the ids from the date dimension table that represent your time period)

Ces « vues indexées » de vos données doivent résider dans une base de données séparée, et un changement à un objet dans la production devrait file d'attente que record pour la réindexation dans le système d'analyse. Les grands sites pourraient lot leurs dossiers à des heures de pointe aux statistiques rapports d'application est toujours en retard quelques heures ou quelques jours. J'essaie toujours de le maintenir à la deuxième, si l'architecture supporte.

Si vous affichez des aperçus rowcount, vous pourriez avoir un certain optimisation ou la mise en cache pour mettre en œuvre aussi bien.

En fait, pour résumer, vous copiez des données et dénormaliser. La technique va par le nom de « l'entreposage de données » ou OLAP (traitement analytique en ligne).

Il y a de meilleures façons, en utilisant des bases de données commerciales comme Oracle, mais le schéma en étoile, il est accessible à tous avec une base de données relationnelle open source et un certain temps.

Vous devriez certainement lire la boîte à outils, mais il discute beaucoup de choses qui peuvent vous faire gagner un temps considérable. Comme les stratégies pour traiter les données mises à jour, et de conserver l'historique de vérification dans l'application de reporting. Pour chaque problème, il décrit plusieurs solutions, dont chacune sont applicables dans des contextes différents.

Il peut évoluer jusqu'à des millions de lignes si vous ne prenez pas les moyens faciles et utiliser une tonne de jointures inutiles.

Autres conseils

Vous pouvez générer une table de facettes en fonction de vos tables de base de données normalisées.
Par exemple:

> SELECT * FROM product_facet
product_id | facet_type | facet_value
1          | color      | blue
2          | color      | blue
3          | color      | green
4          | color      | yellow
1          | speed      | slow
2          | speed      | slow

Ensuite, il suffit faire requête pour obtenir au total par attribut:

SELECT facet_type, facet_value, COUNT(facet_value) as total
FROM product_facet
GROUP BY facet_type, facet_value;

Résultat:

facet_type | facet_value | total
color      | blue        | 2
color      | green       | 1
color      | yellow      | 1
speed      | slow        | 2

Lors de la recherche avec des critères, vous pouvez sélectionner la table de facette par ID produit de correspondance:

SELECT facet_type, facet_value, COUNT(facet_value) as total
FROM product_facet
WHERE product_id in (SELECT product_id FROM products WHERE ... )
GROUP BY facet_type, facet_value;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top