Merlin: Tabellen verknüpfen

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

  1. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. 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 ?

      1. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Hallo Tom !

          Vielen Dank, du hast mir sehr geholfen !

          1. 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 ?

            1. 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

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau

              1. 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

                1. 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

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

              2. 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

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Hallo!

                  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 ?

                  Schon mal Danke.

                  1. 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

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau

            2. 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

      2. 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