Frage

Ich habe nur Datenbanken ohne Beziehungen getan, aber jetzt brauche ich etwas ernster und richtig zu tun.

Hier ist meine Datenbank-Design: alt text

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

Hier ist mein SQL (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 aufgeben? Zum Beispiel 2 Produkte mit SQL INSERT INTO? Ich kann nichts an der Arbeit.

Bisher:

Nur wenn ich manuell Produkte und Daten in Product_Orders einfügen und fügen Sie dann diese Daten an Orders = die es komplett macht. Oder umgekehrt (erstellen einen Auftrag in 1 mit SQL, dann manuell Produkten in Product_orders - 1 SQL für jeden Eintrag Einfügen)

War es hilfreich?

Lösung

Sie sollten zunächst einen Auftrag erstellen und dann einfügen Produkte in der Tabelle Product_Orders. Dies ist notwendig, weil Sie eine tatsächliche Bestellung mit einem id müssen es mit den Tabellen Product_Orders zuzuordnen.

Sie sollten immer einen Datensatz in der Fremdschlüsseltabelle erstellen, bevor die Lage ist, eine in der aktuellen Tabelle zu erstellen. Auf diese Weise sollten Sie eine „Post“, Kunden, Typen, Produkt, Ordnung und product_order erstellen.

Andere Tipps

Try this ...

Zunächst müssen Sie einen Kunden einfügen

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

dann fügen Sie einen Typ

insert into VareGruppe values(1, 'Type1')

dann legen Sie ein Produkt

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

fügen Sie dann einen Auftrag

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

dann fügen Sie ein Register zur product_orders Tabelle

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

Ich denke, das ist es. : -)

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

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

Verwenden Select @@identity den onr Wert sehen

Ich glaube, Sie schon den Dreh raus haben, was geschehen muss. Aber, was ich denke, Sie werden immer an ist, wie die Datenintegrität zu gewährleisten.

Dies ist, wo Transaktionen an Bedeutung.

http://www.sqlteam.com/article/introduction-to-transactions

Ist es die Sales (Ich vermute, das ist, was bedeutet, SamletPris) das ist das Problem verursacht? Ich kann sehen, dass hier ein Problem zu sein. Eine gemeinsame Design-Lösung ist 2 Tabellen haben: Bestellung und Orderline. Der Auftrag ist eine Kopftabelle - es wird die Fremdschlüsselbeziehung zu der Customer-Tabelle hat, und all andere ‚Top-Level‘ Daten. Die Orderline-Tabelle hat FK Beziehungen zu der Order-Tabelle und die Product-Tabelle, zusammen mit der Menge, Preis etc., die auf eine Position eindeutig sind die Reihenfolge. Nun, um den Verkaufspreis für einen Auftrag zu erhalten, Sie fassen die (Stückpreis * Menge) der Orderline-Tabelle für diesen Auftrag. Das Speichern das Sales für eine ganze Ordnung ist wahrscheinlich große Probleme auf der ganzen Linie führen.

Ein Hinweis für alle Fälle ist dies MySQL: Wenn Sie MyISAM verwenden, ignoriert der MySQL-Server die Fremdschlüssel vollständig. Sie haben den Motor zu InnoDB setzen, wenn Sie jede Art von Integrität wollen tatsächlich auf dem Datenbank-Ende durchgesetzt, statt nur in Ihrer Logik. Dies ist nicht Ihre Frage, aber es ist etwas bewusst zu sein.

fbinder bekam die Frage richtig:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top