SQL Tabelle "Bestellung" - eine Bestellung mit mehreren Produkten, wie schreiben?

6 Antworten

Option 1: Mache nicht die Bestell-Nr zum primären Schlüssel; sondern benutze einen separaten primären Schlüssel. Dann kannst du mehrere Produkte unter der gleichen Bestellnummer erfassen.

Option 2: Erweitere deinen primären Schlüssel auf einen zweiten Indikator. Beispielsweise "Bestell-Nr & Produkt-Nr" als zusammengefasster primärer Schlüssel. Dann können deine Kunden in jeder Bestellung alle Produkte bestellen.

Option 3: Generiere zusätzlich eine "Positions-Nr" für die Bestellung. Dann bist du von der Produkt-Nr entkoppelt und kannst den Schlüssel auf "Bestell-Nr & Positions-Nr" erweitern und ebenfalls beliebig viele Produkte (dann sogar mehrmals das gleiche Produkt, etwa, wenn es Sets sind, oder wenn für das gleiche Produkt unterschiedliche Ausgabedaten gebraucht werden) aufnehmen.

In allen Fällen wirst du aber über das Auto-Increment stolpern. (Es ist vom Design her immer geschickter, weil flexibler, sowas der Software zu überlassen.)

skoobidoo15 
Fragesteller
 01.02.2018, 23:01

zu Opt1: dann brauche ich doch noch mehr Tabellen oder nicht?

0

Wie unten erwähnt handelt es sich um eine n:n Beziehung (eine Bestellnummer kann n Produkte beinhalten, ein Produkt kann in n Bestellnummern vorkommen).

Die einzige saubere Lösung so eine Beziehung abzubilden ist eine Verknüpfungstabelle.

In deinem Beispiel hast du eine Tabelle 'Bestellung' und eine Tabelle 'Produkt'. Was du brauchst ist eine weitere Tabelle, etwa 'Bestellung_Produkt', in der du sowohl Produkt-Nr als Fremdschlüssel, als auch Bestell-Nr als Fremdschlüssel hast. Eine Abfrage, etwa um zu gucken welche Produkte in einer Bestell-Nr bestellt wurden, machst du dann mit JOIN. Das klingt erstmal ein wenig kompliziert, ist aber eigentlich ganz einfach, hier ein Beispiel für dich:

CREATE TABLE Bestellung

(

   Bestell_Nr int PRIMARY KEY AUTO_INCREMENT,

   Bestelldatum DATE,

Empfangsdatum DATE,

);

CREATE TABLE Produkt

(

   Produkt_nr int PRIMARY KEY AUTO_INCREMENT,

   Produktname varChar NOT NULL

);

CREATE TABLE Produkt_Bestellung

(

   Bestell_nr int NOT NULL,

   Produkt_nr int NOT NULL,

   CONSTRAINT PK_ProduktBestellung PRIMARY KEY

   (

       Bestell_nr,

       Produkt_nr

   ),

   FOREIGN KEY (Bestell_nr) REFERENCES Bestellung (Bestell_nr),

   FOREIGN KEY (Produkt_nr) REFERENCES Produkt (Produkt_nr)

)

(dieser Syntax ist für eine MySql-Datenbank, wenn du was anderes benutzt musst du ihn vielleicht leicht abändern).

Wenn du jetzt eine Bestellung hast, in der drei Produkte enthalten sind, dann musst du in der Verknüpfungstabelle drei Einträge erstellen, in denen du die Bestell-Nummer deiner Bestellung verwendest, und jeweils die Produkt_Nummer des Produktes.

Eine Query sieht dann so aus:

Um rauszufinden welche Produkte in bestellung "12" enthalten sind:

SELECT * FROM Produkt

JOIN Produkt_Bestellung ON Produkt.Produkt_nr = Produkt_Bestellung.Produkt_nr

WHERE Produkt_Bestellung.Bestellung_nr = 12

Du Fragst quasi, welche Einträge aus der Tabelle Produkt (SELECT * FROM PRODUCT) in der Tabelle Produkt_Bestellung (JOIN ...) enthalten sind, und dort die Bestellung_nr 12 haben (WHERE...)

Arbeite am Besten mit 2 Tabellen und verknüpfe diese über die Bestellnummer.

In der 1. Tabelle alles über die Bestellung selbst (Kundendaten, Auftragsdaten etc.)

In der 2. Tabelle alles über die bestellten Artikel

Alles andere ist murx

Du musst für jedes Produkt eine eigene Bestell-Nr vergeben. Dafür ist die Bestell-Nr da und die muss eindeutig sein. Wenn es sich dabei um zusammenhängende Produkte handelt, brauchst eine hierarchische Ordnung. Mit einem Durcheinander wie Kraut und Rüben kommst mit Deiner Anwendung nicht weit. Wie soll da ein Kunde bei so einem Durcheinander sich was bestellen können?

Naja eine Bestellung ist n Produkten zugeordnet ein Produkt m Bestellungen klingt für mich nach ner n zu m Verknüpfung also brauchst du ne Verknüpfungstabelle.

skoobidoo15 
Fragesteller
 01.02.2018, 23:02

Wie sieht so eine Verknüpfungstabelle aus?

0
okarin  01.02.2018, 23:24

Du erstellst eine Tabelle die, die Bestellnr und die produktnr enthält welche zusammen den primary key bilden. Danke erstellst du natürlich die entsprechenden foreign keys auf die neue Tabelle. In dieser Verknüpfungstabelle steht dann eben immer  welche Produkte einer Bestellung zugeordnet sind. Außerdem müsstest du dann die Spalte Anzahl in diese Verknüpfungstabelle verschieben da diese ja für die Anzahl eines Produktes in der Bestellung steht.

0