Wie ich in diesem Blog-Beitrag geschrieben habe, entstehen bei einem meiner Shopware-Projekte Datensatz-Inkonsistenzen im Bereich der Artikel und Artikel-Varianten.
Aus diesem Grund habe ich mir die Shopware Datenbank Struktur und deren Inhalte mal etwas genauer angesehen.
Durch lesen dieses Artikels aus den Shopware-Docs habe ich bereits befürchtet, dass da wahrscheinlich nicht 100%ig alles sauber sein wird.
Ich musste feststellen, dass es durchaus auch noch andere „Baustellen“ an der Datenbank und deren Inhalte gibt.
Zum Beispiel wären das die Tabellen s_article_configurator_sets, s_article_configurator_set_group_relations, s_article_configurator_set_option_relations und s_article_configurator_option_relations
In diesen Tabellen wird die Zuordnung von Artikeln zu Varianten-Gruppen (Größe, Farbe, etc.) und Varianten-Options (XL, XXL, grün, gelb etc.) hinterlegt.
Nun ist es in unserer aktuellen Shopware-Version (5.5.7) leider immer noch so, dass wenn ein Artikel über die API oder das Backend gelöscht wird, die entsprechenden Datenbankeinträge in diesen Tabellen nicht mit gelöscht werden.
Daher entstehen – je nach dem wie oft Artikel gelöscht werden – eine Menge Datensatz-Leichen, die nicht mehr benötigt werden.
Hier mal die SQL-Abfragen zum Aufspüren der Leichen rund um die Artikel im Shopware:
unbenutzte Daten s_article_configurator_sets
SELECT cs.*
FROM s_article_configurator_sets cs
LEFT JOIN s_articles a
ON a.configurator_set_id = cs.id
WHERE a.id IS NULL
unbenutzte Daten s_article_configurator_set_group_relations
SELECT csgr.*
FROM s_article_configurator_set_group_relations csgr
LEFT JOIN s_article_configurator_sets cs
ON cs.id = csgr.set_id
LEFT JOIN s_articles a
ON a.configurator_set_id = cs.id
WHERE a.id IS NULL OR cs.id IS NULL
unbenutzte s_article_configurator_set_option_relations
SELECT csor.*
FROM s_article_configurator_set_option_relations csor
LEFT JOIN s_article_configurator_sets cs
ON cs.id = csor.set_id
LEFT JOIN s_articles a
ON a.configurator_set_id = cs.id
WHERE a.id IS NULL OR cs.id IS NULL
unbenutzte s_article_configurator_option_relations
Beziehung von Variante zu Option. In diesen Fällen ist der Eintrag in der s_article_configurator_option_relations eine Leiche, d.h. die Variante existiert gar nicht mehr in der s_articles_details
SELECT r.*
FROM s_article_configurator_option_relations r
LEFT JOIN s_articles_details a
ON a.id = r.article_id
WHERE a.id IS NULL
„kaputte Varianten“ ermitteln. In diesen Fällen fehlt der Eintrag in der Tabelle s_article_configurator_option_relations, dass die jeweilige Variante die Option besitzt.
SELECT d.*
FROM s_articles_details d
JOIN s_articles a ON d.articleID = a.id AND a.configurator_set_id IS NOT NULL
LEFT JOIN s_article_configurator_option_relations cr ON cr.article_id = d.id
WHERE cr.id IS NULL;
Einträge in der s_articles ohne Eintrag in der s_articles_details
SELECT *
FROM s_articles a
LEFT JOIN s_articles_details d
ON d.articleID = a.id
WHERE d.id IS NULL
Ich habe hier bewusst, nicht die DELETE Statements hingeschrieben, sondern nur die SELECT’s. Falls ihr hier Ergebnisse bekommt habt ihr definitiv Daten-Leichen bzw. inkonsistenzen in Eurer Shopware-Datenbank.
Danke, das hat mich in die richtige Richtung geschubst.
Bei mir hat es noch einen Schritt mehr gebraucht um den Fehler zu beheben. Ich musste nicht nur die ‚xxx_relations‘ Tabellen bereinigen, sondern auch die ‚_groups‘ und ‚_options‘ Tabelle. Dort stehen die eigentlichen Werte drin, die durch die beiden „relations“ verknüpft werden.
Queries dazu:
## s_article_configurator_options
SELECT co.*
FROM s_article_configurator_options co
LEFT JOIN s_article_configurator_set_option_relations csor
ON co.id = csor.option_id
WHERE csor.set_id IS NULL
## s_article_configurator_groups
SELECT cg.*
FROM s_article_configurator_groups cg
LEFT JOIN s_article_configurator_set_group_relations csgr
ON cg.id = csgr.group_id
WHERE csgr.set_id IS NULL
Grüße!