Mysql 5.0 < Datenbanken < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
HI Leute
Wann brauche ich eigentlich Joints / wann Fremdschlüssel?
Ich habe jetzt zwei Tabellen erstellt. Die eine enhält den Fremdschlüssel der anderen. Nun möchte ich jedoch eine ANgabe, welche sich in der anderen Tabelle befindet auslesen. Also beispielsweise:
IDKunden FKIDKunden
Name ID Aufträge
Vornahme Datum
Wie sieht die Abfrage aus, wenn ich die Namen der Kunden anzeigen möchte, die zum Datum....eingekauft haben?
Das ganze wird doch auch mit Joints realisiert, sehe ich das nicht richtig?:S
Aber was ist denn der Unterschied?
Vielen Dank.
Lg Nicole
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:51 Di 26.06.2007 | Autor: | piet.t |
> HI Leute
>
> Wann brauche ich eigentlich Joints / wann Fremdschlüssel?
Erstmal zur Ausdrucksweise: Meines Wissens verwendet man im Datenbankjargon nur "Join", also "Verbindung", auch wenn "joint" neben "Gelenk" oder was zum Rauchen auch "Nahtstelle" bedeuten kann.
Im Prinzip beschreibt beides den gleichen Sachverhalt aus unterschiedlichen Sichtweisen: zwei Datenbanktabellen werden über gemeinsame Feldinhalte in Beziehung gesetzt. "Fremdschlüssel" bezieht sich dabei nur auf die statische Struktur ("Feld X in Tabelle A verweist auf Feld Y in Tabelle B") wogegen "Join" sich auf den Vorgang des Abfragens bezieht, d.h. die Tabellen werden tatsächlich verbunden.
>
> Ich habe jetzt zwei Tabellen erstellt. Die eine enhält den
> Fremdschlüssel der anderen. Nun möchte ich jedoch eine
> ANgabe, welche sich in der anderen Tabelle befindet
> auslesen. Also beispielsweise:
>
> IDKunden FKIDKunden
> Name ID Aufträge
> Vornahme Datum
>
> Wie sieht die Abfrage aus, wenn ich die Namen der Kunden
> anzeigen möchte, die zum Datum....eingekauft haben?
Da gibt es zwei unterschiedliche Formulierungen, die aber letztlich auf das gleiche hinauslaufen:
1.) Als Join mit Schlüsselwort "JOIN":
SELECT A.Name
FROM KUNDE A
INNER JOIN AUFTRAG B
ON A.IDKunden = B.FKIDKunden
WHERE B.Datum = '2007-03-17'
oder 2.) als "Theta-Style-join" (frag mich jetzt nicht, ob es da auch ein deutsches Wort für gibt, das letzte Datenbankbuch was ich gelesen habe war leider auf Englisch):
SELECT A.Name
FROM KUNDE A,
AUFTRAG B
WHERE A.IDKunden = B.FKIDKunden
AND B.Datum = '2007-03-17'
> Das ganze wird doch auch mit Joints realisiert, sehe ich
> das nicht richtig?:S
Abfragen, die sich auf zwei Tabellen beziehen werden in der Regel am besten über Joins realisiert. Es wäre im Prinzip auch möglich, das ganze über eine Subquery zu machen, allerdings ist das im allgemeinen langsamer.
> Aber was ist denn der Unterschied?
siehe oben....
>
> Vielen Dank.
>
> Lg Nicole
Reicht das erstmal? Sonst nochmal nachfragen...
Gruß
piet
|
|
|
|
|
Sorry, habe natürlich Join gemeint;)..Hehe...also das Problem, was ich habe ist einfach...wenn ich ja 2 Tabellen oder mehrere habe
dann kann ich ja bei der ersten Tabelle eine Spalte FK_IDKunde machen. Dort kann ich dann die ID hineinschreiben, welche sich dann auf die Tabelle Kunde bezieht.
Aber dann muss ich ja nicht unbedingt diese Spalte als Foreign Key definieren? Ich habe ja dann schon eine Spalte, die sich auf die ID der anderen Tabelle bezieht, welche ich dann per Join auslesen kann.
Für was sind denn diese Fremdschlüssel überhaupt? Es verwirrt mich momentan einfach...da ich, egal ob ich den Fremdschlüssel sezte, sowieso eine Joinabfrage machen muss.Da könnte ich ja einfach eine Spalte bei der ersten Tabelle hinzufügen und dort die ID's der 2. Spalte hineinsetzen.
Vielen lieben Dank für deine Antwort.
Grüsse Nicole
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:32 Do 28.06.2007 | Autor: | rainerS |
Hallo Nicole,
> Für was sind denn diese Fremdschlüssel überhaupt? Es
> verwirrt mich momentan einfach...da ich, egal ob ich den
> Fremdschlüssel sezte, sowieso eine Joinabfrage machen
> muss.Da könnte ich ja einfach eine Spalte bei der ersten
> Tabelle hinzufügen und dort die ID's der 2. Spalte
> hineinsetzen.
Fremdschlüssel dienen dazu, die referenzielle Integrität sicherzustellen.
Beispiel: 2 Tabellen, in einer stehen Lieferanten, in der anderen die gelieferten Artikel:
Lieferanten:
LID (integer) Name(Text) Adresse(Text)
Artikel:
AID (integer) Bestellnummer(Text) LieferantenID(integer)
Hier würde ich Lieferanten_ID in der Artikeltabelle als Fremdschlüssel deklarieren, der auf LID in der Lieferantentabelle verweist. Dadurch muss jeder Eintrag in der Spalte Lieferanten_ID auch in der Lieferantentabelle
vorhanden sein.
Das heisst insbesondere, dass es nicht möglich ist, eine Zeile in Lieferanten zu löschen, wenn es noch einen Artikel gibt, der darauf verweist.
Man kann auch bei der Definition des Fremdschlüssels angeben, dass automatisch Änderungen an der Artikeltabelle durchgeführt werden, wenn die Bedingung verletzt wird.
Beispiel: ON DELETE CASCADE bedeutet, dass beim Löschen eines Lieferanten automatisch alle zugehörigen Artikel gelöscht werden.
Zusammengefasst: Fremdschlüssel sorgen dafür, dass gewisse Beziehungen zwischen Tabellen eingehalten werden, wenn Einträge in der Datenbank hinzugefügt, geändert oder gelöscht werden.
In deiner Datenbank sorgt der Fremdschlüssel FKIDKunden dafür, dass es zu jedem Auftrag auch einen passenden Kunden gibt.
In der Wikipedia gibt es einen Artikel zur Referenziellen Integrität.
Und zum Abschluss noch ein anderer Tipp: ich finde es nützlich, in jeder Tabelle eine ID-Spalte als Primärschlüssel vorzusehen. Dann kann ich immer mit einer Zahl auf meine Tabelleneinträge verweisen.
Grüsse Rainer
|
|
|
|