[MySQLi] Verständnisfrage Onlineshop Produkte & Gruppen

B

ByeBye 242513

Guten Tag Community,

versuche mich gerade an einem Onlineshop und habe dazu zwei Fragen.

Frage 1)
Zum Hauptprodukt (Rasierer) gibt es Nebenprodukte (Rasierschaum und Klingen). Alle Produkte sind in einer SQL-Tabelle hinterlegt. Die Produkt-Tabelle sieht folgendermaßen aus:
SQL:
`products`
(`ID`, `name`, `price`, `GroupID`, `linked`)
VALUES
(1, 'Rasierer', 20.00, 1, '2;3;'),
(2, 'Rasierschaum', 3.00, 8, ''),
(3, 'Klingen', 18.00, 6, '');
Angedacht war nun im SQL-Eintrag (1) Rasierer ein Vermerkt in linked mit den Produkt-ID-Nummern von (2) Rasierschaum und (3) Klingen.

Die Frage hierzu:
Ist diese Lösung sinnvoll? Und wie kann ich per PHP+MySQLi die Nebenprodukte ressourcenschonend auflisten? Mit der LIKE-Funktion fällt mir keine Lösung ein, da die Verknüpfungen (linked) dynamisch sind.



Frage 2)
Die Produkte sind in Gruppen unterteilt. Die entsprechende Gruppe wird in der Spalte GroupID im jeweiligen Produkt vermerkt. Die Anzahl der Untergruppen ist dynamisch. Beispiel: Männerprodukte -> Körperpflege -> Nassprodukte -> Rasierer

Die Frage hierzu:
Wie ist eine Realisierung bei mehreren Untergruppen sinnvoll? Wie wird dies in anderen Shoppsystem gelöst?
 
Zuletzt bearbeitet von einem Moderator:
Hi,

zu 1) Würde das "linked" normalisieren und in eine extra Tabelle auslagern. Dann mit JOINS zusammenfügen und schon hast du alles.
zu 2) Auch eine extra Tabelle, die die Gruppen miteinander verlinkt (vorgaengerId, nachfolgerId)

Grüße,
BK
 
Rasierer heißt des. :)

MySQLi ist der Name eines Verbindungs-Adapters in PHP. Das Datenbanksystem heißt weiterhin MySQL.

1) Nein, nicht sinnvoll. Du brauchst eine Many-to-many-Relation (m:n) zwischen Produkten.

Code:
`products`
(`ID`, `name`, `price`, `GroupID`)
VALUES
(1, 'Rassierer', 20.00, 1),
(2, 'Rassierschaum', 3.00, 8),
(3, 'Klingen', 18.00, 6);

Code:
`product_is_linked_with_product`
(`product_id`, `linked_id`)
VALUES
(1, 2),
(1, 3);

Auslesen dann per JOIN. In etwa so:

Code:
SELECT    `ID`, `name`, `price`, `GroupID`
FROM      `products` p
LEFT JOIN `product_is_linked_with_product` p2p
       ON p.`ID` = p2p.`linked_id`
WHERE     p2p.`product_id` = 1

2) Was Bratkartoffel sagt.
 
Habe mir nun einige Gedanken gemacht, aber komme auf keine sinnvolle Umsetzung der Untergruppen-Lösung. Könnt ihr mir hierfür ein anschauliches Beispiel geben?

Welche Tabellen soll ich wie miteinander verbinden, wenn ich alle Produkte der Untergruppe Rasierer anzeigen möchte? Es gibt 3 Tabellen (products, groups, linkedgroups).

Situationsbeispiel:
(Ausgehend von diesem Pfad: Startseite -> Männerprodukte -> Körperpflege -> Nassprodukte -> Rasierer)

Ich befinde mich als Besucher auf der Startseite und möchte nun zur Kategorie Rasierer gelangen, alle Kategorien (Gruppen) sind dynamisch angelegt und in der Datenbank abgespeichert.
 
Die Gruppenhierarchie:

Code:
Tabelle: group
-----------------------------
id  parent_id  name
-----------------------------
 1       null  Männerprodukte
 2          1  Körperpflege
 3          2  Nassprodukte
 4          3  Rasierer

Wenn ein Produkt nur Teil einer Gruppe sein kann:

Code:
Tabelle: product
--------------------------------------
id  group_id  name
--------------------------------------
 1         4  Ökoflex 3000
 2         4  Jumbo Machete Deluxe
 3         4  X-TractR (Black Edition)
 4         4  Mohnbrötchen

Ansonsten mit einer zusätzlichen Zuordnungstabelle wie in meinem letzten Post.

Dein URL zur Übersichtsseite für die Rasierer sieht dann zum Beispiel so aus: example.org/group/4

Um so eine Breadcrumb-Navigation zu erstellen, kannst du nun so lange aus group jeweils den Datensatz mit der entsprechenden id auslesen und die id für den nächsten Durchlauf auf die parent_id setzen, bis dort null erreicht ist. In diesem Fall also: id=4, id=3, id=2, id=1, null erreicht. (Der Begriff dafür ist Adjazenzliste. Es gibt auch noch Nested Sets. Welcher Ansatz geeignter ist, ist diskutabel.)

Wie du an die Produkte aus einer Gruppe kommst, sollte ja klar sein.
 

Neue Beiträge

Zurück