0

Ok, vielleicht ist es nicht der beste Titel für die Frage, aber das ist der Fall.Datenbank-Design: Wie referenzielle Integrität Verletzung zu verhindern?

Ich arbeite an einem Projekt, das bereits einen E-Commerce hat. Und ein Teil der Datenbank sieht so aus. Alles funktioniert perfekt.

enter image description here

Das Problem kommt mit den Referenzen, wenn ein Benutzer ein Produkt den Warenkorb kauft geschlossen ist, aber wenn dann das Produkt gelöscht oder es den Preis ändert sich die Reihenfolge völlig beschädigt wird. Ich habe diesen Text gelesen ->Database Design for Real-World E-Commerce Systems aber ich kann die Lösung hier nicht sehen.

Was ist der beste Weg, dies zu tun. Wie große Unternehmen mit diesem Problem umgehen. Ich meine, was ich brauche, ist, alle Details einer Bestellung mit den Daten zu speichern, die es zum Kaufzeitpunkt hatte.

+0

Entschuldigung, ich kann Grafiken nicht lesen. – wildplasser

Antwort

1

Es gibt verschiedene Möglichkeiten, dies zu lösen. Ein Ansatz besteht darin, eine Preisverlaufstabelle anstatt einer Preisspalte zu haben, die sich periodisch ändert. Wenn Sie einen Auftrag erstellen, erstellen Sie ihn für einen bestimmten Preis und ein bestimmtes Produkt. Wenn Sie den Preis des Produkts ändern müssen, anstatt den Wert der Preisspalte zu ändern, geben Sie einen neuen Datensatz in Ihre Preisverlaufstabelle ein, damit zukünftige Bestellungen den neuen Preis annehmen können. Ein anderer Ansatz besteht darin, die Produktpreisinformationen von der Bestellung zu entkoppeln. Anstatt den Preis aus der Produkttabelle zu übernehmen, haben Sie in der Auftragstabelle eine Spalte für den Einzelpreis und dort wird der aktuelle Wert für den Preis gespeichert.

Bis zum Löschen von Produkten kommt es wieder auf Ihre Situation an. Im Allgemeinen ist es keine gute Idee, Zeilen zu löschen, die für historische Informationen benötigt werden. Wenn Sie also ein Produkt nicht mehr verkaufen möchten, anstatt den Datensatz zu löschen, könnten Sie eine Spalte haben, in der die Verfügbarkeit des Produkts auf "false" gesetzt ist. Frühere Bestellungen würden sich also immer noch auf dieses Produkt beziehen, aber neue Bestellungen könnten es nicht hinzufügen.

0

Jede Instanz jedes Felds in einer Tabelle sollte eine 1: 1-Beziehung mit dieser Instanz der Tabelle haben. Das Problem ist, dass der Preis eine 1: 1-Beziehung mit dem Produkt hat, was gut ist. Aber es sollte auch eine 1: 1 Beziehung mit dem Warenkorb haben. Und da sich der Preis im Laufe der Zeit ändern kann, tut es das nicht.
Zwei mögliche Lösungen: 1) Setzen Sie einen Timestamp auf den Kauf, und behalten Sie alle HistoricalPrices, dann wählen Sie den richtigen Preis für den Zeitpunkt des Kaufs. Dies hat den Vorteil, dass man genau sagen kann, warum sich der Preis geändert hat, aber es kann zusätzliche Arbeit sein. 2) Fügen Sie der Tabelle Shopping_Cart_Products ein PurchasePrice-Feld hinzu. Weisen Sie zum Zeitpunkt des Kaufs den Einkaufspreiswert für diese Instanz dieser Tabelle zu.

0

Sie haben ein paar Möglichkeiten, wenn die Produkte, während sie in Wagen sitzen zu ändern:

  1. Sie den Warenkorb aktualisieren und den Benutzer über den Grund, warum benachrichtigen.
  2. Sie legen alle benötigten Informationen in den Warenkorb und arbeiten damit während des Bezahlvorgangs anstatt mit den Live-Produktdaten.

Lösung 1 erfordert, dass Sie eine Plausibilitätsprüfung mindestens einmal am Ende der Kasse zu tun, um zu sehen, ob der Wagen noch gültig ist. Lösung 2 bedeutet, dass Menschen Produkte kaufen können, die irgendwie veraltet sind.

Verwandte Themen