2009-05-27 6 views
1

Ich habe nur Datenbanken ohne Beziehungen gemacht, aber jetzt muss ich etwas ernsthafteres und korrekteres tun.Wie kann ich Tabellen mit Beziehungen einfügen?

Hier ist meine Datenbank-Design: alt text http://i41.tinypic.com/27xqzxl.jpg

  1. Kunde = Kunden
  2. Vare = Produkt
  3. Ordre = Order (lesen: Ich möchte eine Bestellung machen)
  4. VareGruppe = äh..typ? (Lesen Sie: Auto, Stuhl, Schrank etc.)
  5. VareOrdre = Product_Orders

Hier mein SQL ist (SQLite) Schema:

CREATE TABLE Post (
    Postnr INTEGER NOT NULL PRIMARY KEY, 
    Bynavn VARCHAR(50) NOT NULL 
); 

CREATE TABLE Kunde (
    CPR INTEGER NOT NULL PRIMARY KEY, 
    Navn VARCHAR(50) NOT NULL, 
    Tlf INTEGER NOT NULL, 
    Adresse VARCHAR(50) NOT NULL, 
    Postnr INTEGER NOT NULL 
    CONSTRAINT fk_postnr_post REFERENCES Post(Postnr) 
); 

CREATE TABLE Varegruppe (
    VGnr INTEGER PRIMARY KEY, 
    Typenavn VARCHAR(50) NOT NULL 
); 


CREATE TABLE Vare (
    Vnr INTEGER PRIMARY KEY, 
    Navn VARCHAR(50) NOT NULL, 
    Pris DEC NOT NULL, 
    Beholdning INTEGER NOT NULL, 
    VGnr INTEGER NOT NULL 
     CONSTRAINT fk_varegruppevgnr_vgnr REFERENCES Varegruppe(VGnr) 
); 

CREATE TABLE Ordre (
    Onr INTEGER PRIMARY KEY, 
    CPR INTEGER NOT NULL 
     CONSTRAINT fk_kundecpr_cpr REFERENCES Kunde(CPR), 
    Dato DATETIME NOT NULL, 
    SamletPris DEC NOT NULL 
); 

CREATE TABLE VareOrdre (
    VareOrdreID INTEGER PRIMARY KEY, 
    Onr INTEGER NOT NULL 
     CONSTRAINT fk_ordrenr_onr REFERENCES Ordre(Onr), 
    Vnr INTEGER NOT NULL 
     CONSTRAINT fk_varevnr_vnr REFERENCES Vare(Vnr), 
    Antal INTEGER NOT NULL 
); 

Es sollte korrekt funktionieren.

Aber ich bin verwirrt über Product_Orders.

Wie erstelle ich eine Bestellung? Zum Beispiel, 2 Produkte mit SQL INSERT INTO? Ich kann nichts zur Arbeit bekommen.

Bisher:

Nur wenn ich manuell einfügen Produkte und Daten in Product_Orders und dann diese Daten zu Orders = hinzufügen, die es komplett macht. Oder anders herum (Erstellen Sie eine Bestellung mit 1 SQL, dann manuell Produkte in Product_orders - 1 SQL für jeden Eintrag einfügen)

+0

Haben Sie in Betracht gezogen, in DB-Tools von Drittanbietern zu suchen? Ich bin nicht sicher, welche Sprache Sie verwenden, aber .NET verwendet LINQ, Java verwendet Hibernate/OpenJPA/viele andere. Viele Programmierer entfernen sich vom Schreiben von SQL zugunsten der Manipulation von Objekten. – Kieveli

+0

Ja, ich habe Ich liebe LINQ-TO-SQL wirklich. Leider arbeite ich in einem Team, und sie füttern nur bequem SQL - ich kann nicht scheinen, sie ein neues Werkzeug zu lernen, wenn es um Datenbanken geht – CasperT

Antwort

4

Sie sollten zuerst einen Auftrag und legen Sie Produkte in der Tabelle Product_Orders erstellen. Dies ist notwendig, da Sie eine tatsächliche Bestellung mit einer ID benötigen, um sie mit der Tabelle Product_Orders zu verknüpfen.

Sie sollten immer einen Datensatz in der Fremdschlüsseltabelle erstellen, bevor Sie einen in Ihrer aktuellen Tabelle erstellen können. Auf diese Weise sollten Sie einen "Post", einen Kunden, einen Typ, ein Produkt, einen Auftrag und einen Produktauftrag anlegen.

+0

Okay, also erstelle ich einen Auftrag. Wie erkenne ich nach dem Erstellen des Onr die gerade erstellte Bestellung? Ich brauche Onr beim Einlegen der 2 Produkte. – CasperT

+0

Können Sie 3 sql Sätze zeigen? EINFÜGEN IN Auftrag INSERT INTO Product_Order INSERT INTO Product_Orders Oder was auch immer es benötigt, um die Aufgabe zu erledigen. – CasperT

+0

Wenn Onr ein Auto-Increment-Feld ist, können Sie nach ihm suchen (wählen Sie oben 1 aus der Ordre-Reihenfolge nach onr). Dann können Sie das Ergebnis verwenden, um es in die Tabelle Product_Orders einzufügen. Welches DBMS benutzt du? – fbinder

0

Ist es der Verkaufspreis (ich vermute, das ist, was SamletPris bedeutet), dass das Problem verursacht? Ich kann sehen, dass das hier ein Problem ist. Eine gängige Designlösung sind 2 Tabellen: Order und OrderLine. Die Bestellung ist eine Kopftabelle - sie hat die Fremdschlüsselbeziehung zur Kundentabelle und alle anderen Daten auf der obersten Ebene. Die OrderLine-Tabelle verfügt über FK-Beziehungen zur Auftragstabelle und zur Produkttabelle, zusammen mit der Menge, dem Stückpreis usw., die für die Werbebuchung eines Auftrags eindeutig sind. Um nun den Verkaufspreis für eine Bestellung zu erhalten, summieren Sie die (Stückpreis * Menge) der OrderLine-Tabelle für diese Bestellung. Das Speichern des Verkaufspreises für eine ganze Bestellung wird wahrscheinlich zu großen Problemen auf der ganzen Linie führen.

3

Versuchen Sie dies ...

zuerst müssen Sie einen Kunden einfügen

insert into kunde values(1, 'navn', 1, 'adresse', 1) 

Sie dann eine Art einfügen

insert into VareGruppe values(1, 'Type1') 

Sie ein Produkt, dann legen

insert into vare values(1, 'product1', '10.0', 1, 1) 

Sie eine Bestellung fügen Sie dann

insert into ordre values(1, 1, '20090101', '10.0') 

dann fügen Sie ein Register zum product_orders Tabelle

insert into VareOrdre values (1, 1, 1, 1) 

Ich denke, das ist es. :-)

Da die Primärschlüssel autoincrement sind, fügen Sie sie nicht an dem Einsatz und geben Sie die Spalten wie dieser

insert into vare(Nav, Pris, Beholdning, VGnr) values('product1', '10.0', 1, 1) 

Verwenden Select @@identity ONR Wert

+0

Sorry, die meisten der Primärschlüssel sind autoincrement :) – CasperT

+0

Ja, ich weiß :) Aber das Problem ist: Wenn Sie einen ordre erstellen, wie kennen Sie die Onr beim Einfügen von Produkten in die VareOrdre? – CasperT

0

Ein Hinweis zu sehen, nur in Fall das ist MySQL: Wenn Sie MyISAM verwenden, ignoriert der MySQL-Server die Fremdschlüssel vollständig. Sie müssen die Engine auf InnoDB setzen, wenn Sie möchten, dass irgendeine Art von Integrität am Datenbankende statt nur in Ihrer Logik durchgesetzt wird. Das ist nicht deine Frage, aber es ist etwas, dessen du dich bewusst sein musst.

fbinder hat die Frage richtig :)