Frage

Ich fühle mich wie diese Frage wohl tausendmal schon gefragt wurde, so dass ich entschuldige mich, wenn es beantwortet worden ist. Und wenn ja, kann mir jemand zeigen auf die richtigen Stellen / Links?

Was ich versuche eine facettierte Navigation für meine Website zu tun ist, zu bauen. Es nutzt MySQL und hier ist eine grobe Skizze der Tabellen Ich bin mit:

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

Was ich tun möchte, ist eine Liste der verfügbaren Attribute angezeigt, wenn Sie in einer Kategorie sind, so dass Sie einen oder mehr Werte für jedes dieser Attribute auszuwählen. Um Ihnen ein Beispiel, schauen Sie sich diese Seite von Office Depot: http : //www.officedepot.com/a/browse/binders/N=5+2177/

Bisher habe ich eine Menge von Verknüpfungen zum Filtern auf mehreren Attributen verwendet:

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'

Im Grunde a_options werden alle Attribute für diese Produkte zurück, die eine Teilmenge der Filter I mit a_select1 und a_select2 angewendet haben. Also, wenn ich das Bindemittel Beispiel von Office Depot verwenden, möchte ich alle verfügbaren Attribute zeigen, nach Blau oder Schwarz für Farbe und „8,5 x 11“ für die Größe auswählen.

Ich benutze PHP-Code dann Duplikate zu entfernen und die daraus resultierenden Eigenschaften in ein Array wie folgt zu anordnen:

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

Gibt es eine Möglichkeit ich meine Abfrage beschleunigen kann oder es effizienter schreiben? Ich habe Setup-Indizes auf den Namen und Wert in der Attributtabelle (und auch auf alle ID-Nummern). Aber wenn jemand ein paar Attribute auswählt, dann die Abfrage läuft langsam.

Vielen Dank für Ihre Hilfe im Voraus,
Sridhar

War es hilfreich?

Lösung

"Ich habe dann PHP-Code verwenden, um Duplikate zu entfernen"

Es wird dann nicht skaliert werden.

Nachdem ich gelesen http://www.amazon.com/Data-Warehouse-Toolkit -techniken-Dimensional / dp / 0471153370 ich war Facetten und Filtermechanismen non stop Ausrollen.

Die Grundidee ist, Sie verwenden ein Sternschema ..

Sie erstellen eine Faktentabelle, die Fakten speichert

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

Sie verwenden Fremdschlüssel in Maßtabellen, die Attribute speichern

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

Dann whichver date „Paradigma“ Sie verwenden, greifen alle IDs aus dieser Dimension Tabelle und

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

Diese „indizieren Sichten“ Ihre Daten sollten in einer separaten Datenbank befinden, und eine Änderung an ein Objekt in der Produktion sollte für die Wieder Indizierung im Analysesystem, dass die Aufzeichnung Warteschlange. Große Websites könnte Batch ihre Aufzeichnungen bei Nicht-Spitzenzeiten auf die Statistik Anwendung Berichterstattung immer hinkt hinter ein paar Stunden oder Tage. Ich versuche immer, es auf den zweiten Schritt zu halten, wenn die Architektur unterstützt wird.

Wenn Sie rowcount Vorschaubilder werden angezeigt wird, Sie könnten einige recht haben Optimierung oder Caching als auch zu implementieren.

Im Grunde Um es zusammenzufassen, Sie Daten kopieren und denormalize. Die Technik trägt den Namen "Data Warehousing" oder OLAP (Online-Analytik Verarbeitung).

Es gibt bessere Möglichkeiten, mit kommerziellen Datenbanken wie Oracle, aber das Star-Schema macht es mit einer Open-Source-relationalen Datenbank und einige Zeit für jedermann verfügbar.

Sie sollten auf jeden Fall das Toolkit lesen, aber er beschreibt eine Menge Dinge, die Sie viel Zeit sparen können. Wie Strategien für die mit aktualisierten Daten zu tun, und die Halt Audit-Historie in der Reporting-Anwendung. Für jedes Problem umreißt er mehrere Lösungen, von denen jede in unterschiedlichen Kontexten anwendbar sind.

Es kann bis zu Millionen von Zeilen skalieren, wenn Sie die einfachen Möglichkeiten, nicht herausnehmen und verwenden eine Tonne unnötig verbindet.

Andere Tipps

Sie können eine Facette Tabelle erzeugen basierend auf dem normalisierten Datenbanktabellen.
Zum Beispiel:

> 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

Dann einfach diese Abfrage tut insgesamt pro Attribut zu erhalten:

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

Ergebnis:

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

Wenn Sie mit Kriterien suchen, können Sie die Facette Tabelle durch Spiel Produkt-ID wählen:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top