Beziehung und Fremdschlüssel zwischen PRODUKT und ORDERDETAIL
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 schreiben
Antwort 1 von Teddy7 vom 28.06.2019, 10:01 Options
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 vom 28.06.2019, 10:35 Options
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 vom 28.06.2019, 12:19 Options
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 vom 28.06.2019, 15:11 Options
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 vom 28.06.2019, 15:15 Options
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 vom 28.06.2019, 16:28 Options
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 vom 29.06.2019, 00:07 Options
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 vom 14.07.2019, 15:06 Options
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 vom 16.07.2019, 13:11 Options
neues problem - neuen thread eröffnen - dann gibts auch Antworten