Opened 3 years ago
Closed 3 years ago
#2377 closed Aufgabe (fixed)
Unnötiges JOIN in Funktion getAttributesCount()
| Reported by: | noRiddle | Owned by: | somebody |
|---|---|---|---|
| Priority: | normal | Milestone: | modified-shop-2.0.8.0 |
| Component: | Shop | Version: | 2.0.7.2 |
| Keywords: | Cc: | ||
| Blocked By: | Blocking: |
Description
In der product-Klasse wird in der Query in der Methode getAttributesCount() ein JOIN auf die Tabelle products_options gemacht. Mir erschließt sich der Grund dafür nicht und ich bin der Ansicht, daß man das JOIN entfernen kann und somit, insbesondere bei vielen Attributen, einen Prerformance-Gewinn ereicht.
Eine Abhängigkeit von aktivierten Sprachen ist bei der Zuordnung von Optionen zu Produkten nicht gegeben. Sollten in der Tabelle products_options Spracheeinträge fehlen liegt ohnehin eine Inkonsistenz der Inhalte der betroffenen DB-Tabelle vor.
Gruß,
noRiddle
Attachments (0)
Change History (10)
comment:1 by , 3 years ago
| Milestone: | → modified-shop-2.0.8.0 |
|---|
comment:2 by , 3 years ago
comment:3 by , 3 years ago
| Milestone: | modified-shop-2.0.8.0 |
|---|---|
| Resolution: | → invalid |
| Status: | new → closed |
comment:4 by , 3 years ago
Nachdem ich nun erneut darauf gestossen bin muß ich revidieren und das Ticket sollte wieder aktiviert werden.
Es ist definitiv nicht nur völlig unnötig mit der Tabelle products_options zu JOINen,
sondern auch unsinnig.
Anstatt diesem bisherigen
$products_attributes_query = xtDBquery("SELECT count(*) AS total_a,
count(IF(patrib.options_values_price > 0, 1, null)) as total_p
FROM ".TABLE_PRODUCTS_OPTIONS." popt
JOIN ".TABLE_PRODUCTS_ATTRIBUTES." patrib
ON patrib.options_id = popt.products_options_id
AND popt.language_id = '".(int) $_SESSION['languages_id']."'
WHERE patrib.products_id = '".(int)$pID."'");
reicht dies völlig aus:
$products_attributes_query = xtDBquery("SELECT count(*) AS total_a,
count(IF(options_values_price > 0, 1, null)) as total_p
FROM ".TABLE_PRODUCTS_ATTRIBUTES."
WHERE products_id = '".(int)$pID."'");
Gruß,
noRiddle
comment:5 by , 3 years ago
| Milestone: | → modified-shop-2.0.8.0 |
|---|---|
| Resolution: | invalid |
| Status: | closed → reopened |
comment:6 by , 3 years ago
Wenn wir das so machen wie vorgeschlagen, ist keine Prüfung mehr vorhanden ob es auch Optionen gibt in entsprechender Sprache gibt.
So wie es jetzt ist, ist es aber auch nicht ausreichend.
Die Frage ist ob hier eine Abfrage nach Übersetzungen notwendig ist.
comment:7 by , 3 years ago
Wie könnte es geschehen, daß es Optionen nicht in der entsprechenden Sprache gibt ?
Wenn eine Sprache später angelegt wurde und die Optionen nicht in der neuen Sprache gespeichert sind ?
Wenn man das abfangen wollen würde müsste man nicht nur hier weiter ausholen sondern auch an vielen anderen Stellen im System wo ein solches Problem mit fehlenden Werten in einer oder mehreren Sprachen vorkommen könnte.
Eine Prüfung "ob es auch Optionen gibt in entsprechender Sprache gibt" wird allein an dieser Stelle zu nichts führen. Was sollte es denn für Konsequenzen haben wenn nicht ?
Diese müssten sich ja dann an den (zwei) Stellen wo die Methode bislang angewendet wird auswirken.
Ich denke im Moment, mangels besserer Idden, daß man das erstmal so lassen und sich auf eine konsistente DB verlassen muß.
Gruß,
noRiddle
comment:8 by , 3 years ago
Ich behaupte mal ganz frech, dass alle anderen Abfragen so gestaltet sind, dass nur das dargestellt wird, was auch in der entsprechenden Sprache gepflegt ist. Manchmal wird das auch ganz bewusst verwendet um Artikel in DE aber nicht ein EN anzuzeigen.
Ein Problem das ich sehe:
ich lege einen Artikel in den Warenkorb mit Attribute und stelle dann die Sprache um weil ich sehe, dass ich doch auf EN umstellen kann.
Plötzlich hat der Artikel keine Attribute mehr oder noch viel schlimmer, der Artikel verschwindet aus dem Warenkorb.
comment:9 by , 3 years ago
Verstehe vollkommen. Aber das kannst du ja nicht mit der Funktion getAttributesCount() abfangen.
Gruß,
noRiddle

Was ich hier gemeldet habe ist Unsinn. Weiß leider nicht mehr was ich da gedacht habe oder ob ich etwas verwechselt habe.
Sorry for that.
Ticket kann als "völliger Blödsinn" geschlossen werden.
Gruß,
noRiddle