Ankündigung

Einklappen
Keine Ankündigung bisher.

Webshop DB-Design

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Webshop DB-Design

    Moin,

    Ich bin mir nicht sicher, wie ich hier am besten vorgehen soll:

    Ein Produkt gibt es in meinem Onlineshop genau 4x.
    Nun wird ein Button von einem Kunden angeklickt "Kaufen".
    Das heisst die Produktmenge geht auf 3x.
    Wenn es von 1x auf 0x geht, soll das Produkt nicht mehr angezeigt werden.

    Meine Überlegung zur vorgehensweise:
    1. Möglichkeit:

    2 Tabellen:

    table: products
    id - productname - productquantity
    34 - Snowboard - 4

    table: purchased
    id - productid - buyerid
    1 - 34 - 5050

    Somit müsste ich die Anzahl an Produkten zuerst mit dem "SELECT" abfragen und anschliessend mit dem SQL "UPDATE products SET productquantity WHERE id=34..." auf -1Stk updaten. Mit der Tabelle "purchased" kann ich die Verrechnung tätigen.

    2. Möglichkeit:
    3 Tabellen:


    table: products
    id - productname
    34 - Snowboard

    table: productquantity
    id - productid
    1 - 34
    2 - 34
    3 - 34
    4- 34

    table: purchased
    id - productid - buyerid
    1 - 34 - 5050

    Somit muss ich die die Anzahl an Produkten für die Anzeige ermitteln "SELECT COUNT(id) FROM productquantity WHERE id=34" und beim "Kaufen/Buttonklick" 1 Eintrag löschen und in der purchased-Tabelle 1 Eintrag machen "INSERT INTO purchased..."

    Was ist besser oder wie machen das Shop's wie "Magento"?
    Ich sehe folgende Problematiken:
    - wenn Personen gleichzeitig "kaufen" klicken.
    - Es gibt viele Datensätze, wodurch die SELECT-Abfrage langsam wird...
    - Ich schränke die "Rechte" der Kunden weitgehend von vornherein im phpmyadmin ein bezüglich Sicherheit:
    SELECT, INSERT erlaubt mit einer Ressourcenbeschränkung, DELETE, UPDATE, FILE, ... Strukturen, Administration nicht..)

    Danke für eure Hilfe!

    Gruss Newsletter

  • #2
    Du brauchst kein SELECT und dann ein UPDATE, das geht einfacher:

    Code:
    test=*# create table shop(produkt int primary key, anzahl int, check (anzahl >= 0));
    CREATE TABLE
    test=*# insert into shop values (42, 3);
    INSERT 0 1
    test=*# update shop set anzahl = anzahl - 1 where produkt = 42;
    UPDATE 1
    test=*# update shop set anzahl = anzahl - 1 where produkt = 42;
    UPDATE 1
    test=*# update shop set anzahl = anzahl - 2 where produkt = 42;
    FEHLER:  neue Zeile für Relation »shop« verletzt Check-Constraint »shop_anzahl_check«
    DETAIL:  Fehlgeschlagene Zeile enthält (42, -1).
    test=*#
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Hallo,

      die zweite Möglichkeit ist offensichtlich Murks.

      Du könntest doch so etwas machen.

      Sobald die Bestellung getätigt wurde, erst dann wird der Counter um eins erniedrigt.

      Damit der/die Artikel nicht mehr angezeigt wird/werden, löst Du mittels

      SELECT id, productname, .... FROM products WHERE productquantity > 0.

      Kommentar


      • #4
        Würde ich auch empfehlen. Es ist ja für den bestand erstmal völlig irrelevant, wie viele Kunden den Artikel im Warenkorb haben, wichtig ist wer den schlussendlich gekauft hat.
        Als kleines Feature könnte man noch einen einen verfügbaren Bestand nutzen. Den kann man dann bereits minimieren, wenn sich ein Kunde in der Checkout-Strecke bereits beim Bezahlen befindet.
        Dann könnte man in den anderen Warenkörben anderer Kunden diesen Artikel entsprechend markieren, so dass die wissen, dass durch andere Käufe gerade der Bestand unterhalb der eigenen Warenkorbmenge geht.

        Ist aber nur ein Feature, muss man nicht machen.
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Mh Also dementsprechend die Variante von akretschmer sieht gut aus:

          VOR "KAUFEN/Buttonklick":
          table: products
          id - productname - quantity
          34 - Snowboard - 4

          table: purchased
          id - productid - buyerid


          NACH "Kaufen/Buttonklick" von Kunde "1234":
          UPDATE products SET quantity = quantity - 1 WHERE id = 34;
          INSERT INTO purchased Value(...)


          table: products
          id - productname - quantity
          34 - Snowboard - 3

          table: purchased
          id - productid - buyerid
          1 - 34 - 1234

          Allerdings benötige ich doch trotzdem eine "SELECT"-Abfrage?
          Nehmen wir an:
          - Produkt mit der "id = 34" gibt es noch 1x.
          - Es sind gerade 2 Kunden bei dem Produkt mit dieser id.
          Kunde 1 Kauft das Produkt (table: products -> quantity geht auf 0).
          Kunde 2 ist langsam und hat das Produkt immernoch offen im Browser und kauft es nun nach einer halbstündigen Überlegung doch noch.
          (Produkt sollte es garnicht mehr anzeigen -> SELECT id, productname, .... FROM products WHERE quantity > 0.

          Beim Kunde 2 ist die Menge jedoch bereits auf "0" wodurch der UPDATE-Befehl nicht mehr geht also müsste ich doch bei jedem "Kaufen"-Klick im 1. Schritt per SELECT COUNT() die menge auf > 0 prüfen?

          Kommentar


          • #6
            Die Variante von akretschmer ist sicher gut und passt für die meisten Anwendungen.
            Jedoch vermurkst man sich damit, Artikel/Produkte verkaufen zu können, die keinen Bestand haben/brauchen. Ich würde das auf die Weise nicht machen.
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar

            Lädt...
            X