AndreD: Warenkorb Konzept

Hallo,
ich arbeite gerade an meinem ersten richtigen Shop für unsere Seite.
Nun habe ich eine Frage:
Wie entwickelt man einen Warenkorb für eine MySQL Datenbank am besten?

Ich habe schon einen funktionstüchtigen Warenkorb entwickelt, ich denke, das Konzept ist aber nicht optimal.
In jeder Warenkorb-Zeile gibt es eine fixe Antahl an "Artikel-Slots" für die Artikel-ID und die Anzahl.

Nun würde ich gerne den ganzen Warenkorb in _EINEM_ Feld speichern.
Sollte ich jetzt ein einfaches Array nutzen und später gleiche Artikel zählen, dann doppelte Artikel entfernen, oder besser ein mehrdimensionales Array mit Anzahl UND Artikel-ID verwenden?

Viele Grüsse,
Andre

  1. hi,

    In jeder Warenkorb-Zeile gibt es eine fixe Antahl an "Artikel-Slots" für die Artikel-ID und die Anzahl.

    wenig sinnvoll.

    Nun würde ich gerne den ganzen Warenkorb in _EINEM_ Feld speichern.

    noch weniger sinnvoll.

    mache eine tabelle mit warenkorb-ID, artikel-ID und -menge, und lege jeden artikel in einem eigenen datensatz ab.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. Super,
      danke, so macht das Sinn!

  2. Hi,

    Wie entwickelt man einen Warenkorb für eine MySQL Datenbank am besten?

    mit genügendem Wissen, um keine so allgemeine Frage stellen zu müssen. Sorry, aber in einem solchen System sind viele sicherheitsrelevante Details zu beachten; wenn man diese nicht zu erkennen in der Lage ist, sollte man das Vorhaben lieber auf einen späteren Zeitpunkt verschieben.

    In jeder Warenkorb-Zeile gibt es eine fixe Antahl an "Artikel-Slots" für die Artikel-ID und die Anzahl.

    Schlecht.

    Nun würde ich gerne den ganzen Warenkorb in _EINEM_ Feld speichern.

    Schlechter.

    Du möchtest für jeden _Artikel_ im Warenkorb einen kompletten Datensatz anlegen, für den Warenkorb selbst ggf. einen zusätzlichen Datensatz in einer anderen Tabelle. Die Stichworte lauten Normalisierung, Beziehung und Kreuztabelle.

    Sollte ich jetzt ein einfaches Array nutzen

    Überlege Dir zunächst ein ordentliches DB-Layout. Über dessen Verwaltung seitens der umgebenden Programmlogik kannst Du Dich anschließend kümmern.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Nun würde ich gerne den ganzen Warenkorb in _EINEM_ Feld speichern.

      Schlechter.

      Du möchtest für jeden _Artikel_ im Warenkorb einen kompletten Datensatz anlegen, für den Warenkorb selbst ggf. einen zusätzlichen Datensatz in einer anderen Tabelle. Die Stichworte lauten Normalisierung, Beziehung und Kreuztabelle.

      ich hatte den Warenkorb immer als Tabelle verstanden, die die Relationen zwischen eingeloggtem Nutzer (ein Datensatz aus der Sitzungentabelle) und den Artikeln haelt.

      Wie wuerde der Warenkorb aussehen, wenn er selbst eine Kennung bekommt? Hmm, eine Warenkorb-Kennungen Tabelle (auf die aus der Sitzungentabelle verwiesen wird) oder die Kennung gleich in die Sitzungentabelle schreiben? (Es werden ja hoffentlich nicht mehr als ein Warenkorb pro Sitzung aufgemacht?!)

      (Oder den Warenkorb als XML in der Sitzungstabelle speichern? (wuerg))

      Gruss,
      Ludger

      1. Hello,

        Wie wuerde der Warenkorb aussehen, wenn er selbst eine Kennung bekommt? Hmm, eine Warenkorb-Kennungen Tabelle (auf die aus der Sitzungentabelle verwiesen wird) oder die Kennung gleich in die Sitzungentabelle schreiben? (Es werden ja hoffentlich nicht mehr als ein Warenkorb pro Sitzung aufgemacht?!)

        (Oder den Warenkorb als XML in der Sitzungstabelle speichern? (wuerg))

        siehe https://forum.selfhtml.org/?t=88622&m=528355

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hi,

          Du solltest ganz im Gegenteil weiter normalisieren

          Warenkorb (Kopftabelle)           Ein Datensatz pro angefangenen >>Warenkorb
                                            aber viele Datensätze pro User
            Warenkorb (Positionstabelle)    Ein Datensatz pro ausgewähltem >>Artikel
                                            aber viele Datensätze pro >>Warenkorb.

          ja, das hatte ich nicht verstanden. Haben wir da neben den Entitaeten Nutzer, Sitzung, Artikel und Warenkorb (der logisch aus mehreren Datensaetzen mit Relationen Sitzung<->Artikel) besteht noch weitere Entitaeten und wie sehen die dann aus?

          Wenn ein Besucher dann seine Session verlieren sollte und sich nue anmeldet, dann kann man ihm vorschlagen, den angefangenen Warenkorb weiterzunutzen oder ihn zu löschen und einen neuen zu beginnen. bei Speicherung in der Sessiondatrei sind diese Daten i.d.R. weg.

          Darf ich da etwas philosophisch werden? - Wir bauen doch bei einem Webshopsystem einen Sachverhalt der Realitaet nach, den Supermarkt z.B.. Waere es da ueberhaupt sinnvoll und intuitiv dem Nutzer anzubieten in einen bereits vorhandenen alten Warenkorb "wiedereinzusteigen" und den dann sofort an der Kasse zu bezahlen? (Und haben Warenkoerbe Namen?)

          Gruss,
          Ludger

          1. Hello,

            Warenkorb (Kopftabelle)           Ein Datensatz pro angefangenen >>Warenkorb
                                              aber viele Datensätze pro User
              Warenkorb (Positionstabelle)    Ein Datensatz pro ausgewähltem >>Artikel
                                              aber viele Datensätze pro >>Warenkorb.

            ja, das hatte ich nicht verstanden. Haben wir da neben den Entitaeten Nutzer, Sitzung, Artikel und Warenkorb (der logisch aus mehreren Datensaetzen mit Relationen Sitzung<->Artikel) besteht noch weitere Entitaeten und wie sehen die dann aus?

            Nein. Mit der Sitzung hat der Warewnkorb überhaupt nichts zu tun. Die Sitzung (Session) sit nur ein Mittel zum Zweck. Und wenn man nun dem User bei jedem Login eine neue Sessionnummer gibt, dann muss man sich darüber klar sein, ob die Vorgangsbearbeitung "Bestellung erfassen" Sessionübnergreifend bzw. vollkommen davon gelöst (was das gleich sein kann) ablaufen soll. Man könnte auch mehrere Bestellungen (also Vorgänge) in einer Session abwickeln.

            Die Session hat ÜBERHAUPT NICHTS mit den Rechten eines Users oder mit dem Status seiner Vorgänge zu tun. Sie dient nur der momentanen Zuordnung jedes einzelnen Requests.

            Wenn ein Besucher dann seine Session verlieren sollte und sich nue anmeldet, dann kann man ihm vorschlagen, den angefangenen Warenkorb weiterzunutzen oder ihn zu löschen und einen neuen zu beginnen. bei Speicherung in der Sessiondatrei sind diese Daten i.d.R. weg.

            Darf ich da etwas philosophisch werden? - Wir bauen doch bei einem Webshopsystem einen Sachverhalt der Realitaet nach, den Supermarkt z.B.. Waere es da ueberhaupt sinnvoll und intuitiv dem Nutzer anzubieten in einen bereits vorhandenen alten Warenkorb "wiedereinzusteigen" und den dann sofort an der Kasse zu bezahlen? (Und haben Warenkoerbe Namen?)

            Genau, und in der Realität sollten auch nicht alle Waren aus dem Einkaufswagen verschwunden sein, nur weil mal eben die Tonanlage oder das Licht im Supermarkt ausgefallen ist.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hi,

              Nein. Mit der Sitzung hat der Warewnkorb überhaupt nichts zu tun. Die Sitzung (Session) sit nur ein Mittel zum Zweck. Und wenn man nun dem User bei jedem Login eine neue Sessionnummer gibt, dann muss man sich darüber klar sein, ob die Vorgangsbearbeitung "Bestellung erfassen" Sessionübnergreifend bzw. vollkommen davon gelöst (was das gleich sein kann) ablaufen soll. Man könnte auch mehrere Bestellungen (also Vorgänge) in einer Session abwickeln.

              Die Session hat ÜBERHAUPT NICHTS mit den Rechten eines Users oder mit dem Status seiner Vorgänge zu tun. Sie dient nur der momentanen Zuordnung jedes einzelnen Requests.

              darf ich mal was Boeses(TM) sagen?   ;-)
              Das ist alles Mist!

              Genau, und in der Realität sollten auch nicht alle Waren aus dem Einkaufswagen verschwunden sein, nur weil mal eben die Tonanlage oder das Licht im Supermarkt ausgefallen ist.

              Das auch!   ;-)

              Gruss,
              Ludger

              --
              "Waehlt ruhig weiter SPD!"
              1. Hello,

                darf ich mal was Boeses(TM) sagen?   ;-)
                Das ist alles Mist!

                Das ist nicht böse, sondern einfach nur dämliche Anmache. Wenn Du es besser weißt, erzähl uns Doofis doch, "wie man es macht"[tm]

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. Hallo, Tom,

                  ich war da emotinonal nicht gut drauf, sorry.

                  Bitte erlaeutere doch Deine Aussagen noch etwas. Vielleicht bringst Du mir ganz schonend ("super_schoend" ;-) bei, warum Sitzungen und Berechtigungen nichts mit dem Warenkorb zu tun haben.

                  Gruss,
                  Ludger

                  1. Hello,

                    ich war da emotinonal nicht gut drauf, sorry.

                    Na gut, weil Du's bist...

                    Bitte erlaeutere doch Deine Aussagen noch etwas. Vielleicht bringst Du mir ganz schonend ("super_schoend" ;-) bei, warum Sitzungen und Berechtigungen nichts mit dem Warenkorb zu tun haben.

                    Es handelt sich um drei unterschiedliche Freiheitsgrade.

                    Der User hat irgendwelche Berechtigungen. Über welche Session er die ausübt, ist wurscht. Wenn er die heute über die eine Session und morgen übere eine andere ausübt, ist immer noch die Welt in Ordnung. Wenn die berechtigungen aber während einer Session geändert werden, sollen sei doch sofort greifen und nicht erst mit dem nächsten "Login" oder der nächsten Session.

                    Der User hat ein Anliegen. Er will eine Bestellung aufgeben. Nun fängt er am PC an und dann kommt aber seine liebe Frau und sagt, Du musst jetzt aber aufhören zu arbeiten. Er hat schon 123 von 186 Positionen eingegeben. Weil er nicht sofort nach der Pfeife tanzt, zeiht ihm die Ziege einfach den Stecker raus...

                    Soll der arme Kerl jetzt wegen technischer Unzulänglichkeit die ganze Arebit nochmal von vorne beginnen? Dafür baut man ja Client-Server-Systeme. Die Datensicherheit und die Kapselung der daten soll dadurch verbessert werden. Also muss der Arme mittels neuer Sesseion wieder auf dem angefangenen Vorgang aufseetzen können.

                    Wenn während der Bestellerfassung dem User neue Rechte gegeben werden, haben die auch nicht zwingend was zu tun mit dem Warenkorb. Vielleicht darf er jetzt Liebesbriefe online schreiben. Selbstverstänlich müssen die effektiven rechte des users beim jedem Rquest geprüft werden. das gilt aber generell für ALLE Vorgangsarten und nicht nur für Bestellungen.

                    Harzliche Grüße aus http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    1. Hi,

                      ich war da emotinonal nicht gut drauf, sorry.

                      Na gut, weil Du's bist...

                      danke, ich wollte sagen, dass ich Deine Aussagen in Teilen nicht verstehe und das, was ich verstanden habe, mir falsch erscheint.

                      Bitte erlaeutere doch Deine Aussagen noch etwas. Vielleicht bringst Du mir ganz schonend ("super_schoend" ;-) bei, warum Sitzungen und Berechtigungen nichts mit dem Warenkorb zu tun haben.

                      Es handelt sich um drei unterschiedliche Freiheitsgrade.

                      Der User hat irgendwelche Berechtigungen. Über welche Session er die ausübt, ist wurscht.

                      Ich meiere da mal ein bisschen schlau.   ;-)
                      Die Sitzungen-Tabelle implementiert die Identifikation, die Nutzertabelle die Authentifikation, die Rechtetabelle die Autorisierung. Wenn das stimmt, dann hat "alles mit allem zu tun".

                      Wenn er die heute über die eine Session und morgen übere eine andere ausübt, ist immer noch die Welt in Ordnung. Wenn die berechtigungen aber während einer Session geändert werden, sollen sei doch sofort greifen und nicht erst mit dem nächsten "Login" oder der nächsten Session.

                      Sicher, darum gibt es auch (idealerweise ;-) bei jedem Datenzugriff eine Abfrage des Rechtelevels des Nutzers.

                      Der User hat ein Anliegen. Er will eine Bestellung aufgeben. Nun fängt er am PC an und dann kommt aber seine liebe Frau und sagt, Du musst jetzt aber aufhören zu arbeiten. Er hat schon 123 von 186 Positionen eingegeben. Weil er nicht sofort nach der Pfeife tanzt, zeiht ihm die Ziege einfach den Stecker raus...

                      Da greift wieder die Sache mit der Realitaet. Wenn man im Supermarkt ist, kann man auch nicht zeitgleich mit dem Sohn Fussball spielen. Ist das doch moeglich (d.h. Warenkorb wird an Nutzer und nicht an die Sitzung gebunden), dann ist das aus meiner Sicht nicht intuitiv. Ich mag es wirklich nicht "in den Webshop zu gehen" und einen alten Warenkorb zu finden. Vielleicht kann m an da geteilter Meinung sein?

                      Soll der arme Kerl jetzt wegen technischer Unzulänglichkeit die ganze Arebit nochmal von vorne beginnen? Dafür baut man ja Client-Server-Systeme. Die Datensicherheit und die Kapselung der daten soll dadurch verbessert werden. Also muss der Arme mittels neuer Sesseion wieder auf dem angefangenen Vorgang aufseetzen können.

                      Vielleicht, s.o..

                      Wenn während der Bestellerfassung dem User neue Rechte gegeben werden, haben die auch nicht zwingend was zu tun mit dem Warenkorb.

                      Ich wuerde es so sehen, das "alles mit allem" zu tun hat.

                      Vielleicht darf er jetzt Liebesbriefe online schreiben. Selbstverstänlich müssen die effektiven rechte des users beim jedem Rquest geprüft werden. das gilt aber generell für ALLE Vorgangsarten und nicht nur für Bestellungen.

                      Absolute Zustimmung.   :-)

                      Danke fuer Deine Geduld.   ;-)

                      Gruss,
                      Ludger

                      1. Hello,

                        Ich meiere da mal ein bisschen schlau.   ;-)
                        Die Sitzungen-Tabelle implementiert die Identifikation, die Nutzertabelle die Authentifikation, die Rechtetabelle die Autorisierung. Wenn das stimmt, dann hat "alles mit allem zu tun".

                        Ja. Da hast Du natürlich recht. Es gehört ja alles zu einem gemeinsamen System. Sonst wäre die Diskussion insgesamt nutzlos. Aber der einzige gemeinsame Punkt ist nur der Ursprucg des Systems. Von dort aus messen sich die Dimensionen voneinenader unabhängig:

                        Eine Änderung der Rechte eines Users hat keine Änderung der Session zur Folge oder Voraussetzung

                        Eine Änderung der Session macht keine Änderung der Rechte oder des Inhalts des Warenkorbes notwendig

                        Eine Änderung der Daten des Users (des Namens und Wohnortes) hat nicht zwingend eine Änderung der Session oder des Warenkorbes zur Folge.

                        Es ist wirklich nicht einfach, diese ganzen Dimensionen im Kopf zu sortieren. Das gebe ich ja zu. Aner versuch es trotzdem. Dein SAMS wird es Dir danken.

                        Harzliche Grüße aus http://www.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
      2. Hi,

        Du möchtest für jeden _Artikel_ im Warenkorb einen kompletten Datensatz anlegen, für den Warenkorb selbst ggf. einen zusätzlichen Datensatz in einer anderen Tabelle.
        ich hatte den Warenkorb immer als Tabelle verstanden, die die Relationen zwischen eingeloggtem Nutzer (ein Datensatz aus der Sitzungentabelle) und den Artikeln haelt.

        ja, genau.

        Wie wuerde der Warenkorb aussehen, wenn er selbst eine Kennung bekommt?

        Er könnte Meta-Daten besitzen, z.B. seinen Eröffnungszeitpunkt. Nicht ohne Grund schrieb ich aber "ggf.".

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  3. Igitt...
    Wie wäre es mit einer separaten Tabelle z.B. Warenkorbinhalt, in der dann alle Artikel mit Warenkorb-ID, Artikel-ID und Anzahl gespeichert werden?

    Den Warenkorb erhältst du dann mit einem JOIN von Warenkorb und Warenkorbinhalt.

    Der Yeti

    --
    Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
    Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
    Und bin so klug als wie zuvor!
    1. Igitt...
      Wie wäre es mit einer separaten Tabelle z.B. Warenkorbinhalt, in der dann alle Artikel mit Warenkorb-ID, Artikel-ID und Anzahl gespeichert werden?

      Den Warenkorb erhältst du dann mit einem JOIN von Warenkorb und Warenkorbinhalt.

      Der Yeti

      Danke,
      so mache ich es ;-)

      1. Danke,
        so mache ich es ;-)

        Schön. Sag mal, hast du dich schon mit Datenbanken befasst oder bist du einfach von Textdateien auf MySQL umgestiegen? Wenn ja, dann würde ich erstmal schauen wofür es DBs überhaupt gibt, wie sie arbeiten und was man damit machen kann.
        Der Yeti

        --
        Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
        Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
        Und bin so klug als wie zuvor!
        1. Hi,
          habe schon einiges mit MySql gemacht.
          Ich denke, ich komme so schon ganz gut klar.
          (Habe schon diverse CM-Systeme und Foren entwickelt)

          Viele Grüsse!

          1. Komisch, denn dieses Konzept habe ich direkt am Anfang gelernt.
            Der Yeti

            --
            Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
            Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
            Und bin so klug als wie zuvor!
  4. Hello,

    Nun würde ich gerne den ganzen Warenkorb in _EINEM_ Feld speichern.
    Sollte ich jetzt ein einfaches Array nutzen und später gleiche Artikel zählen, dann doppelte Artikel entfernen, oder besser ein mehrdimensionales Array mit Anzahl UND Artikel-ID verwenden?

    Du solltest ganz im Gegenteil weiter normalisieren

    Warenkorb (Kopftabelle)           Ein Datensatz pro angefangenen Warenkorb
                                      aber viele Datensätze pro User
      Warenkorb (Positionstabelle)    Ein Datensatz pro ausgewähltem Artikel
                                      aber viele Datensätze pro Warenkorb.

    Ich würde auch Warenkorb-Artikel sofort in einer tabelle speichern und nicht in der Session lagern. Wenn ein Kunde fertig ist mit der Bestellung, dann wird ein Flag in der Kopftabelle gesetzt.

    Wenn ein Besucher dann seine Session verlieren sollte und sich nue anmeldet, dann kann man ihm vorschlagen, den angefangenen Warenkorb weiterzunutzen oder ihn zu löschen und einen neuen zu beginnen. bei Speicherung in der Sessiondatrei sind diese Daten i.d.R. weg.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Danke, gute Tipps!

  5. Hallo Andre!

    Ich habe schon einen funktionstüchtigen Warenkorb entwickelt, ich denke, das Konzept ist aber nicht optimal.
    In jeder Warenkorb-Zeile gibt es eine fixe Antahl an "Artikel-Slots" für die Artikel-ID und die Anzahl.

    Nun würde ich gerne den ganzen Warenkorb in _EINEM_ Feld speichern.
    Sollte ich jetzt ein einfaches Array nutzen und später gleiche Artikel zählen, dann doppelte Artikel
    entfernen, oder besser ein mehrdimensionales Array mit Anzahl UND Artikel-ID verwenden?

    Warenkorb im Array:
    Nehme als Schlüssel die Artikel-ID und als Wert die Bestellmenge:

    warenkorb["47110815-b1"] = 10;

    In der Datenbank:
    Tabellen: Kunden, Artikel, Warenkorb

    +-----------+
       | Warenkorb |
       +-----------+--+
       | Kunden_ID    |
       | Artikel_ID   |
       | Bestellmenge |
       +--------------+

    Grüsse,

    Sky