2009-07-03 16 views
0

Ich habe zwei Tabellen, eine namens "Cart" und eine namens "Artikel". Jetzt möchte ich, dass der Warenkorb eine Liste von "Artikeln" und Mengen speichern kann. Also habe ich eine weitere Tabelle "cart_items" erstellt, die ein Feld für die ID der Vorlage, die ID des Artikels und die Menge enthält.SQL/PHP: Tabelle Design Frage

Ist das ein gutes Design, oder sollte ich ein anderes Feld für die ID der „cart_item“ hinzufügen? Oder gibt es einen besseren Weg, dies alles zusammen zu tun? Ich laufe gerade in Schwierigkeiten, wenn ich versuche, meinen Einkaufswagen zu aktualisieren. Meine Einkaufswagen-Artikel werden nicht korrekt aktualisiert. Was ich tun muss, ist zu löschen alle die "cart_items" an einen Warenkorb angehängt und dann wieder jedes "cart_item" und ich kann nicht helfen, aber denke, es muss eine bessere Möglichkeit, dies zu tun.

Antwort

2

Das ist sehr gutes Design.

In ER (Entity-Relationship) Bedingungen gibt es eine viele-zu-viele-Beziehung zwischen den einzelnen Posten und Karren. Damit meine ich, dass ein Gegenstand in vielen verschiedenen Wagen erscheinen kann und ein Wagen viele verschiedene Gegenstände enthalten kann. "Viele" bedeutet in diesem Zusammenhang "eine variable Zahl, die mehr als eins sein kann".

Ihre cart_items Tisch ist, was eine Join-Tabelle genannt wird, und Sie müssen es viele-zu-viele-Beziehungen zu modellieren. Ein hinzugefügtes Mengenfeld macht auch Sinn, wie es auf cart_items gesetzt wird.

Sie haben zwei Möglichkeiten, wenn es um den Schlüssel kommt:

  1. Fabrikat (cart_id, item_id) den Primärschlüssel. Dies wird als zusammengesetzter Primärschlüssel bezeichnet. oder
  2. Erstellen eines Auto-Inkrement-Felds namens ID. Wenn Sie dies tun, machen Sie (cart_id, item_id) einen eindeutigen Index, um die Eindeutigkeit zu erzwingen.

Jede Wahl ist gültig. Persönlich bevorzuge ich (2). Sie sollten höchstwahrscheinlich auch einen eindeutigen Index für (item_id, cart_id) haben.

1

Ich bin nicht sicher, wie Ihre Tabellen aussehen würden, aber so etwas wie unten wäre ein guter Anfang sein.

Items 
+-- ID --+-- Description --+-- Etc --+ 
|  1| Good item here | Buy one.| 
|  2| Another item | somethin| 


Cart 
+-- Cart ID --+-- Item ID --+-- Amt --+ 
|   1|   1|  4| 
|   1|   2|  3| 

Jeder Wagen hat eine eindeutige ID, die jedes Element in einer eigenen Zeile gespeichert. Auf diese Weise können Sie Elemente nacheinander hinzufügen oder entfernen, während Sie sie verknüpft halten, und gleichzeitig alle Elemente aus einem Einkaufswagen auswählen.

1

Ein Zeiger, den ich Ihnen geben würde, ist, anstatt Karren direkt mit Artikeln zu verknüpfen, dass Sie alle relevanten Informationen aus dem Artikel in eine andere Tabelle, möglicherweise cart_Items kopieren und diese mit dem Warenkorb verknüpfen. Dies ist nützlich, damit Sie pflegen, was im Laufe der Zeit zum Warenkorb hinzugefügt wurde. Es sei denn, diese sind nur schnelle wegwerfen Karren, die Sie nur für eine einzelne Sitzung benötigen, Sie möchten in der Lage sein, eine Geschichte von genau das, was die Person in ihren Warenkorb zu diesem Zeitpunkt, und nicht ihre Warenkorb Daten ändern, wenn jemand beschließt, etwas über den Gegenstand zu ändern, oder lässt den Gegenstand verschwinden, wenn der Gegenstand gelöscht wird.

1

Was Sie tun, ist korrekt, wie zuvor erklärt. Das einzige, was fehlt, ist DELETE CASCADE und FOREIGN KEYS in Ihrer Datenbank zu verwenden.

diese Weise, wenn Sie eine Zeile in CART löschen es auch zum Anschlag in CART_ITEM löschen.

+0

Könnten Sie bitte erklären, wie diese funktionieren? – MackDaddy

+0

Vielleicht kann dieses Tutorial helfen. http: //www.sitepoint.com/blogs/2009/03/12/mysql-foreign-keys-schneller-datenbank-entwicklung / – elviejo79