Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Beziehung und Fremdschlüssel zwischen PRODUKT und ORDERDETAIL





Frage

Guten Morgen, ich versuche gerad mir eine Datenbank für einen Onlineshop zu erstellen und hinke ein wenig: Auf das Wesentliche verkürzt: Die Datenbank (DB) hat drei Tabellen (TAB) mit den jeweils dazugehoerigen Attributen: PRODUKT -produktnummer -bezeichnung -preis ORDERDETAIL -orderdetailnummer -produktnummer -ordernummer -preiseinesartikels -mengeeinesartikels -gesamtpreiseinesartikels ORDER -ordernummer -kundennummer -gesamtbetragallerartikelplusversandkosten Mein Gedanke: ORDERDETAIL verhält sich zu ORDER wie n:1, weil ein ORDER mehrere ORDERDETAIL hat. Daher füge ich in ORDERDETAIL fremdschlüssel von ORDER "ordernummer" ein. Meine Frage: Welche Beziehungen hat ORDERDETAIL zu PRODUKT und warum? Und welchen Fremdschlüssel benutze ich? Ich hoffe, ich habs einigermassen klar erklärt.... Ich freue mich auf Euren Support Mel

Antwort 1 von Teddy7

Wenn Du von Access sprichst, dann vergiß erst mal die Beziehungen. Die sind einem nur im Weg. Sowas bildet man in Abfragen ab.
Hier würde man also - da wo man´s braucht und eben NUR da - eine Abfrage verwenden, die orderdetail mit Produkt über die ProduktNr verbindet.

Gruß
Teddy

Antwort 2 von Proggi

kann eine Order immer nur ein Produkt bestellen?

damit zu einer bestellung mehrere Artikel bestellt werden können, vermute ich das


Order.Ordernummer ein Autowert ist, der die Bestellung identifiziert.
Orderdetail.Ordernummer ist ein verknüpfter wert nicht Auto
wärhrend Orderdetail.Ordertetailnummer den Artikel in einer Order identifiziert.

z.B.

PRODUKT
334 -produktnummer (AUTO)
Artikel334-bezeichnung
5000€-preis

337 -produktnummer (AUTO)
dreihundertusw-bezeichnung
2000€-preis

338 -produktnummer (AUTO)
billigerartikel-bezeichnung
200€-preis


ORDERDETAIL
51-orderdetailnummer (AUTO)
334-produktnummer
3-ordernummer
5000-preiseinesartikels
1-mengeeinesartikels
-50000gesamtpreiseinesartikels

52-orderdetailnummer (AUTO)
337-produktnummer
3-ordernummer
2000-preiseinesartikels
1-mengeeinesartikels
2000-gesamtpreiseinesartikels

ORDER
3-ordernummer (AUTO)
112332-kundennummer
9042,32-gesamtbetragallerartikelplusversandkosten

Antwort 3 von Proggi

access kann die SQL-Abfragen aber für einen erzeugen wenn man die tabellen richtig verknüpft... läßt sich auch so bei MySQL schreiben:

SELECT produkt.produktnummer, produkt.bezeichnung, orderdetail.mengeeinesartikels, orderdetail.preiseinesartikels, order.gesamtbetrag, order.ordernummer, order.kundennummer
FROM produkt INNER JOIN (´order´ INNER JOIN orderdetail ON order.ordernummer = orderdetail.ordernummer) ON produkt.produktnummer = orderdetail.produktnummer
ORDER BY order.ordernummer;


Selektiert bestimmte Daten aller Positionen aller Bestellungen, sortiert nach den Bestellungen. Um nur alle Positionen einer Bestellung zu erhalten kann man where
order.ordernummer=3 
anhängen.

Order ist übrigens für Datenbanken eine schlechte Namenswahl für eine Tabelle/Spalte, da "Order by" eine Sortiermöglichkeit ist und daher in besondere hochkommas(apostroph eigentlich, kein hochkomma) gesetzt werden muss um es von dem Orderbefehl zu unterscheiden. Bei Access wird es [Order] geschrieben.

Antwort 4 von Mel

Hallo,

vielen Dank für das schnelle Feedback. Ich hab an euren Antworten bemerkt, das ich vergessen habe die Datenbank MySQL und die Primary keys anzugeben. Ich fasse deshalb noch einmal die wesenltichen verbesserten Fakts mit allen Details zusammen:

PRODUKT
-produktnummer (primary key)
-bezeichnung
-preis


BESTELLDETAIL
-bestelldetailnummer (primary key)
-produktnummer (foreign key)
-bestellnummer (foreign key)
-preiseinesartikels
-mengeeinesartikels
-gesamtpreiseinesartikels

BESTELLUNG
-bestellnummer (primary key)
-kundennummer (foreign key)
-gesamtbetragallerartikelplusversandkosten


Ja, BESTELLUNG.bestellnummer ist primary key von BESTELLUNG und zugleich foreign key für BESTELLDETAIL; identifiziert die Bestellung.
Und ja, BESTELLDETAIL.bestelldetailnummer ist Primary key von BESTELLDETAiL und identifiziert die einzelnen Artikelbestellungen einer BESTELLUNG. Jede BESTELLUNG kann also mehrere Produkte beinhalten.

Meine Bedenken:
--> Sind die "Foreign Keys" in diesem Zusammenhang richtig gesetzt?
--> Wie lautet dann die Beziehung von PRODUKT:BESTELLDETAIL?
1:n , n:1, oder n:m?

Eigentlich würde das doch 1:n (PRODUKT:BESTELLDETAIL) sein, da dasselbe Produkt in mehreren Bestelldetails vorkommen kann; anders gesagt: Dasselbe Produkt kann bei verschiedenen Bestellungen auftauchen.

Was meint ihr nun dazu?

Gruss Mel

Antwort 5 von Mel

Ach ja, der Hintergrund meiner Frage:

Ich hab das Datenbankschema wie oben entworfen und dann hab ich nem Buch von Kannengiesser (PHP5/MYSQL4, S. 270) entdeckt, dass er zwischen BESTELLDETAILS und PRODUKTE eine 1:n Beziehung setzt. Das wirft mir jetzt irgendwie mein Schema durcheinander.

Falls es euch interessiert, kann ich das Beziehungsmodell von Kannengiesser ja mal einscannen...

Gruss und bis gleich
Mel

Antwort 6 von Proggi

müste zwischen Produkte und Bestelldetails eine 1:n beziehung geben, da das Produkt eindeutig ist, aber in mehreren Bestelldetails vorkommen kann. logisch oder? Siehst du glaub ich ja auch so...

Übrigens sorry für die Satzsstellung, ich hab das auf der Arbeit so nebenbei geschrieben alle 5 minuten etwas dran weitergeschrieben ^^

noch was...

wenn Kundennummer ein Foreign key ist, gehe ich davon aus, das das ganze Modell um eine Tabelle Kunden erweitert werden kann. Ziemlich Blödsinnig ist in BESTELLDETAIL die Spalte gesamtpreiseinesartikels, da man bei der Selektion das schon ausrechnen lassen kann und nicht in der Datenbank gespeichert werden muss - ist eh IMMER

preiseinesartikels*mengeeinesartikels as gesamtpreiseinesartikels
in einer Abfrage... Den Preis bei der Bestellung nochmal zu speichern macht Sinn, auch bei den Details da Preise sich ja später ändern können und man eventuell für Buchhaltung den tatsächlich bezahlten und auf der Rechnung ausgestellten Betrag merken muss.

Antwort 7 von Mel

Zitat:

müste zwischen Produkte und Bestelldetails eine 1:n beziehung geben, da das Produkt eindeutig ist, aber in mehreren Bestelldetails vorkommen kann. logisch oder? Siehst du glaub ich ja auch so...


Ja, genau so sehe ich das auch. Aber mir scheint das Herr Kannengiesser das anders sieht (N:1) , mit der Begründung, dass ein "Warenkorb" ja aus mehreren Produkten besteht. Und er sieht die Bestelldetailtabelle als Warenkorb an, sprich er spricht in seinem Buch von einem Produkte: Warenkorb Verhältnis von N:1.

Ich habe mal auf die offizielle Seite des Autoren geschaut http://www.atomicscript.de: Es werden alle möglichen Fehler ausser diesem angesprochen (falls es denn einer ist). Daher bin ich verunsichert. Leider antwortet der Autor dort nicht auf meine Anfrage.

Zitat:

Übrigens sorry für die Satzsstellung, ich hab das auf der Arbeit so nebenbei geschrieben alle 5 minuten etwas dran weitergeschrieben ^^

Kein Problem. Freut mich doch viel mehr, dass Du so ausführlich geantwortet hast.

Zitat:

Ziemlich Blödsinnig ist in BESTELLDETAIL die Spalte gesamtpreiseinesartikels, da man bei der Selektion das schon ausrechnen lassen kann und nicht in der Datenbank gespeichert werden muss - ist eh IMMER preiseinesartikels*mengeeinesartikels as gesamtpreiseinesartikels
in einer Abfrage...

Jupp, ich weiss. Habs zur Veranschaulichung angegeben. War wohl eher dumm.

Zitat:

Den Preis bei der Bestellung nochmal zu speichern macht Sinn, auch bei den Details da Preise sich ja später ändern können und man eventuell für Buchhaltung den tatsächlich bezahlten und auf der Rechnung ausgestellten Betrag merken muss.
Stimmt ja. Daran hab ich natürlich nicht gedacht. Das ist gar nicht mal so unwichtig ;-)

Vielen Dank für Deinen Beitrag.
Ich werd noch einen neuen Beitrag schreiben, mit einer ähnlichen aber anderen Fragestellung bzgl. des Datenbankschemas von dem Autor Matthias Kannengiesser.

Gute Nacht und liebe Grüsse
Mel

Antwort 8 von GeRoLog

Hallo Leut!
Hilfe!

Habe zwei Tabellen:

Tabelle A
Felder: Kostenstelle/ Kennzeichen/ Fahrer

Tabelle B
Felder: Kostenstelle/ Kennzeichen/ Fahrer

Das Problem:
Ich möchte, wenn ich in Tabelle A die Werte im Feld
Kostenstelle ändere, daß die Felder Kennzeichen und Fahrer mit den Werten aus Tabelle B automatisch ausfüllen.

Wie geht das ?

Antwort 9 von Teddy7

neues problem - neuen thread eröffnen - dann gibts auch Antworten

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: