Fremdschlüssel in SQL



  • Hallo!

    Ich studiere gerade die datei 'joomla.sql' von JOOMLA! CMS 1.0.3 .
    Da ist mir aufgefallen, dass einige Tabellen neben dem Primärschlüssel noch felder mit dem Attribut KEY aufweisen. Jetzt habe ich im Internet gesucht und auch eine Erklärung gefunden:

    > Ein Fremdschlüssel bezieht sich auf einen Primärschlüssel in einer anderen Tabelle.

    Allerdings habe ich nicht ganz verstanden für was das gut sein soll.

    -- Thomas



  • Hi,

    das Stichwort heisst Normalisierung. D. h., wenn du z. B. eine Tabelle mit Personen hast:

    id   name   vorname   ort
    --------------------------
    

    Wenn z. B. 1000 Personen aus dem gleichen Ort kommen würden, stünde 1000 mal der Ort drin. Das wäre überflüssig. Deswegen exitierst eine zweite Tabelle:

    id   plz   ort
    ---------------
    

    Nun würde man in die Tabelle "Personen" die ID der Tabelle Ort eintragen, damit man eben keine Redundanz der Daten hat. Außerdem, sollte sich der Ortname ändern (was in diesem Beispiel recht unwahrscheinlich ist, aber mal angenommen 😉 ) müsste man das nur in der Tabelle "Ort" ändern. Und, zusätzlich kann man eben nocht entsprechende zusätzliche Attribute hinzufügen (hier: PLZ), die für bestimmte Abfragen irrelevant sind, aber dennoch irgendwo vorhanden sein sollten.

    Also ist quasi der Primärschlüssel der Tabelle "Ort" ein Fremdschlüssel der Tabelle "Personen". Damit man auch erkennen kann, dass "Ort" den Schlüssel einer anderen Tabelle nutzt, nennt man das Attribut auch oft entsprechend:

    id   name   vorname   fk_ort
    --------------------------
    

    Muss man nicht, kann aber hilfreich sein.



  • Danke!

    Mit Normalsierung habe ich mich zwar schon ausgekannt allerdings wollte ich wissen warum man das verwenden soll/muss.

    sorry wenn ich mich nicht präzise ausgedrückt habe.

    Zwei Tabellen:
    CREATE TABLE einwohner
    (
    id INT NOT NULL UNSIGNED AUTO_INCREMENT PRIMARY_KEY,
    name CHAR(60) NOT NULL DEFAULT '',
    vorname CHAR(40) NOT NULL DEFAULT '',
    ort INT NOT NULL DEFAULT '0'
    );

    CREATE TABLE orte
    (
    id INT NOT NULL UNSIGNED AUTO_INCREMENT PRIMARY_KEY REFERENCES einwohner.(id)
    ),
    plz CHAR(5) NOT NULL DEFAULT '',
    ort VARCHAR(100)

    Warum dieses References oder man kann das auch mit 'KEY' machen.


Anmelden zum Antworten