Tabellen verknüpfen
Merlin
- datenbank
Hallo Leute !
Ich habe ein kleines Problem. Ich möchte zwei Tabellen miteinander verknüpfen.
Kunden Tabelle: ID (AutoWert) / Name (Text) / Vorname (Text) / Strasse (Text)
Telefon Tabelle: ID (Zahl) / Telefonnummer (Text)
Es soll später möglich sein, einem Kunden mehrere Telefonnummern zu zuordnen.
Meine Frage: Auf welche Felder muss ein Primärschlüssel ? Unser (zerstreuter) Lehrer hat in der letzten Stunde erzählt, dass man einem Kunden nur mehrere Telefonnummern zuordnen kann, wenn man auf die beiden Felder 'ID' und 'Telefonnummer' einen zusammengesetzten Primärschlüssel legt - in den Stunden davor allerdings etwas ganz anderes. Was ist nun richtig ?
Gruss Merlin
Hello Merlin,
T_KUNDE T_NUMMER
=================== ======================
ID_KUNDE --------+ ID_NUMMER kann ggf. entfallen
-------- | ---------
VORNAME +-------> ID_KUNDE
NACHNAME NUMMER
STRASSE
PLZ
ORT
Doppelt Unterstrichen = Tabellenname
einfach unterstrichen = Primärschlüssel
alle Schlüssel fangen bei mir immer mit ID_ an
Außerdem habe ich mir angewöhnt, jeder Tabelle einen Primärschlüssel zu geben, der gleich als erstes Feld steht und natürlich mit ID_ anfängt.
Außerdem heißen bei mir Sekundärschlüssel immmer so wie die Primärschlüssel der Tabelle, auf die sie sich bezeihen. So verliert man nicht so schnell den Überblick und außerdem unterstützen viele DBMS durch die Namensharmoisierung das Arbeiten mit den Tabellenrelationen
Die dargestellte Relation ( --> ) würde dazu führen, dass die zweite Tabelle von der ersten "geführt" wird. Das bedeutet, dass bei einstellen eines Datensatzes in der Kundentabelle automatisch die dazu passenden Datensätze in der Nummerntabelle geholt werden. dazu muss die Nummerntabelle (i.d.R.) einen Index für den Sekundärschlüssel ID_KUNDE haben.
Die Kundentabelle muss jedoch weder sortiert noch indiziert sein. (Primärschlüssel tragen aber üblicherweise sowieso einen Index, da man sonst nur schwer die Eigenschaft "UNIQUE" überprüfen könnte)
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Tom !
Du hast mich grade mit deinem Fachwissen erschlagen ;-)
Wozu ist die 'ID_NUMMER' in der Tabelle 'T_NUMMER' gut ? Brauche ich also keinen zusammengesetzten Primärschlüssel in der Tabelle 'Telefonnummern', aus 'ID' und 'Telefonnummer', um einem Kunden mehrere Telefonnummern zuorden zu können - Wäre dies eine mögliche Lösung ?
Hello,
Du hast mich grade mit deinem Fachwissen erschlagen ;-)
Wozu ist die 'ID_NUMMER' in der Tabelle 'T_NUMMER' gut ?
Für Deinen Anwendungsfall nur als zusätzlicher Ballast :-)
Du benötigst in Deiner T_NUMMER keinen Promärschlüssel.
Ist aber nicht verkehrt, wenn einer existiert.
Telefonnummern selber sind hier keine Primärschlüssel. Könnte schließlich sein, dass zwei Leute über dieselbe Nummer ereichbar sein sollen...
Brauche ich also keinen zusammengesetzten Primärschlüssel in der Tabelle 'Telefonnummern', aus 'ID' und 'Telefonnummer', um einem Kunden mehrere Telefonnummern zuorden zu können -
Nein.
Wäre dies eine mögliche Lösung ?
Die Lösung habe ich Dir schon aufgemalt.
Du kannst ID_NUMMER einfach weglassen. Die Spalte brauchst Du nicht.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Tom !
Vielen Dank, du hast mir sehr geholfen !
Hallo Leute !
Anderes Problem:
Tabelle Kunden: ID (AutoWert) / Name (Text) / Vorname (Text) / Strasse (Text)
Tabelle Kontonummer: ID (Zahl) / Kontonummer (Text) / BLZ (Text)
Tabelle BLZ: BLZ (Text) / Bank (Text)
Wie muss ich die Tabelle verknüpfen ? Ist es hier nötig in der Tabelle 'Kontonummer' einen Primärschlüssel auf 'ID', 'Kontonummer' und 'BLZ' zu legen ?
Hello,
Tabelle Kunden: ID (AutoWert) / Name (Text) / Vorname (Text) / Strasse (Text)
Tabelle Kontonummer: ID (Zahl) / Kontonummer (Text) / BLZ (Text)
Tabelle BLZ: BLZ (Text) / Bank (Text)Wie muss ich die Tabelle verknüpfen ? Ist es hier nötig in der Tabelle 'Kontonummer' einen Primärschlüssel auf 'ID', 'Kontonummer' und 'BLZ' zu legen ?
Wieviele Konten kann ein Kunde haben?
Die BLZ ist ein Primärschlüssel per Definition, da jedem Kreditinstitut genau eine Bankleitzahl zugeordent ist und zu jeder BLZ genau ein Kreditinstitut gehört.
Du willst zwar nicht damit rechnen, aber die Bankleitzahl heißt ...zahl, weil sie tatsächlich eine Zahl ist. Manche DBMS benötigen für Zahlen weniger Speicherplatz, als für Buchstaben, Ziffern und Zeichen. Das ist heutzutage zwar nicht mehr sooo wichtig, aber durchaus sachlich richtig, die BLZ als Zahl (Primärschlüssel, aber nicht auto...) zu nehmen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Tom !
Du willst zwar nicht damit rechnen, aber die Bankleitzahl heißt ...zahl, weil sie tatsächlich eine Zahl ist.
Was ist wenn die BLZ '0123456' lautet - die Null wäre beim Datentyp Zahl weg ?
Ist es hier nötig in der Tabelle 'Kontonummer' einen Primärschlüssel auf 'ID', 'Kontonummer' und 'BLZ' zu legen ?
Danke und Gruss Merlin
Hello,
Du willst zwar nicht damit rechnen, aber die Bankleitzahl heißt ...zahl, weil sie tatsächlich eine Zahl ist.
Was ist wenn die BLZ '0123456' lautet - die Null wäre beim Datentyp Zahl weg ?
Das kann nicht passieren, weil es keine BLZ mit einer führenden 0 gibt.
Aber ich korrigiere mich: die BLZ ist keine wirkliche Zahl, ist aber solche speicherbar.
Ist es hier nötig in der Tabelle 'Kontonummer' einen Primärschlüssel auf 'ID', 'Kontonummer' und 'BLZ' zu legen ?
Die Tabelle Kontomnummer benötigt (vorerst) auch keinen Primärschlüssel, sondern nur den Fremdschlüssel ID_KUNDE und den Fremdschlüssel ID_BLZ, sowiwe die frei belegbare Kontobezeichnung.
Du solltest Dich ggf. an meine Empfehlung halten mit den Bezeichnern für Eigen- und Fremdschlüssel, wenn Dein Lehrer da nichts anderes bestimmt hat.
Dementsprechend würde ich selber die BLZ vielleicht auch ID_BLZ nennen, weil sie ein (zusammengesetzter) Primärschlüssel ist!
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Die BLZ ist ein Primärschlüssel per Definition, da jedem Kreditinstitut genau eine Bankleitzahl zugeordent ist und zu jeder BLZ genau ein Kreditinstitut gehört.
Nachtrag: Die Bankleitzahl ist ein primärer Kombinationsschlüssel
http://de.wikipedia.org/wiki/Bankleitzahl
Da Programmierung, speziell wirtschaftlicher Zusammenhänge, immer auch eine Abbildung aus der Makrowelt (Real Life) in eine Mikrowelt (Programm) darstellt, lohnt es sich immer, sich zuerst Überblick über die Zusammenhänge in der Makrowelt zu machen.
Wenn das Programm richtig ist, muss auch eine Rückabbildung aus der Mikrowelt in die Makrowelt möglich sein. Und diese muss dann tatsächliche Gegenheiten widerspiegeln http://dict.tu-chemnitz.de/dings.cgi?o=3003;style=;dlink=self;iservice=de-en;query=widerspiegeln *gg* (ich musste doch glatt drei Sekunden überlegen...). Sie kann aber die Makrowelt nie vollständig beschreiben.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo!
Danke für den Link,
aber du hast folgende Frage noch nicht beantwortet:
Ist es hier nötig in der Tabelle 'Kontonummer' einen Primärschlüssel auf 'ID', 'Kontonummer' und 'BLZ' zu legen ?
Schon mal Danke.
Hello,
http://de.wikipedia.org/wiki/Bankleitzahl
Danke für den Link,aber du hast folgende Frage noch nicht beantwortet:
Ist es hier nötig in der Tabelle 'Kontonummer' einen Primärschlüssel auf 'ID', 'Kontonummer' und 'BLZ' zu legen ?
Wie ich vorhin schon sagte, benötigst Du zur Abbildung der Relationen aus den Aufgabenstellungen für T_NUMMER und für T_KONTO keine Primärschlüssel in diesen Tabellen.
Aber zur Bearbeitung der Datensätze selber in einem verbindungslosen System benötigt man immer einen Primärschlüssel für jeden Datensatz. Anderenfalls wird das System instabil, bzw. lässt sich nur unter Aufwand stabil (konsistent) halten.
Der Primärschlüssel sollte immer möglichst unabhängig von den Daten sein. Also keinen zusammengesetzten Schlüssel bilden, sondern einen eigenen vergeben. Der darf dann auch "Autowert" (Autoincrement) sein und er _muss_ UNIQUE sein, sonst wäre er kein Primärschlüssel :-)
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
yo,
eine kunde kann durchaus mehrere konten haben kann, aber ein konto gehört wohl in deinem falle immer nur einen kunden. insofern handelt es sich um eine 1:n beziehung und du kannst die tabelle kunden und konto damit verbinden, indem du einen fremdschlüssel in die konto tabelle legst, die auf den jeweiligen kunden verweist.
Ilja
yo,
Wozu ist die 'ID_NUMMER' in der Tabelle 'T_NUMMER' gut ? Brauche ich also keinen zusammengesetzten Primärschlüssel in der Tabelle 'Telefonnummern', aus 'ID' und 'Telefonnummer', um einem Kunden mehrere Telefonnummern zuorden zu können - Wäre dies eine mögliche Lösung ?
ja, ein zusammengesetzter schlüssel würde sich hier anbieten. und zwar wären es die spalten id_kunden und nummer, wobei id_kunder gleichzeitig auch noch ein fremdschlüssel ist. damit ist sichergestellt, dass zwar unterschiedliche kunden die gleiche telefonummer haben können, aber ein und dieselbe person die gleiche nummmer nicht zweimal besitzen.
Ilja