Saphir: xampp db erstellen; tabellen verknüpfen

Hallo,

ich habe eine Excel Tabelle mit folgendem Inhalt:
ID, Vorname, Nachname, Kurs

Bsp:

23, Max, Mustermann, Sport

Nun möchte ich diese Information normalisieren und in eine DB schreiben.

Folgende Relation würden isch ergeben:

Schüler(Schueler_ID, Vorname, Nachname, Kurs_ID#)
Kurs(Kurs_ID, Kursbezeichnung)

Wie sage ich der DB das er die Kursbezeichnung aus der Relation Kurs holen soll?
Oder anders: Ich gebe in die Tabelle Schüler den Vornamen und Nachnamen ein. Die Schüler_ID ist Int(Autowert).
Als nächstes gebe ich in Kurs die einzelnen Kursbezeichnungen ein.
Wie sage ich nun der DB das Schüler so und so in diesem Kurs ist?
In dieser 1:n Beziehung wird ja die Kursbezeichnung in Schüler angezeigt. Soll ich einfach in Kurs_ID# selber die passenden ID eintragen oder wie mache ich das?

  1. Hallo,

    In dieser 1:n Beziehung wird ja die Kursbezeichnung in Schüler angezeigt. Soll ich einfach in Kurs_ID# selber die passenden ID eintragen oder wie mache ich das?

    Ja, prinzipiell musst Du Dich um das Eintragen der IDs selber kümmern. Sprich, wenn Du einen neuen Schüler einträgst, musst Du (oder Dein Programm) sicher stellen, dass es auf einen korrekten Kurs verweist (sprich die Kurs_ID eine gültige ist, die in der Tabelle Kurs enthalten ist).

    Du benutzt XAMP schreibst Du, also nehme ich an, Du nutzt die Standard-DB die dabei ist (MySQL)?

    MySQL kann theoretisch referentielle Integrität prüfen, sprich z.b. sicherstellen, dass Du einen Kurs nicht löschen kannst, so lange noch schüler darin sind oder aber diese Schüler automatisch mit-löschen.

    Hierzu musst Du aber beim Anlegen der Tabellen darauf achten, dass diese die INODB-Engine nutzen (ab MySQL 5.5 ist das Standard, wenn Du eine Tabelle anlegst und nichts explizit anderes sagst).

    Hope that helps,

    Viele Grüße,
    Jörg

    1. Erstmal Danke.

      D.h. ich gehe wie folgt vor:

      1. Erstelle ich eine DB.
      2. Ich erstelle die Tabellen mit den jeweiligen Attributen.
      2.1 Ich sage der Kurs_ID# in der Tabelle Schüler das sie der FK aus der Tabelle Kurs ist.
      3. Beim eintragen des Schülers gebe ich folgendes quasi ein:
      INSERT INTO Schüler (ID, Vorname, Nachname, Kurs_ID#)
      VALUES("", Max, Mustermann, 2);

      Ich habe auch etwas von ON CASCADE und ON UPDATE gelesen. Bedeutet das beides das wenn ich die in der Tabelle den Kurs mit der ID 2 in ID 3 umbenne das die DB das auch automatisch in der Tabelle Schüler macht?

      1. Hallo,

        D.h. ich gehe wie folgt vor:

        1. Erstelle ich eine DB.
        2. Ich erstelle die Tabellen mit den jeweiligen Attributen.

        Genau. Wichtig ist wie gesagt die richtige Engine (INODB). Das früher von MySQL (vor Version 5.5) als Standard eingesetzte MyISAM kann diese Spezialfeatures nicht.

        2.1 Ich sage der Kurs_ID# in der Tabelle Schüler das sie der FK aus der Tabelle Kurs ist.
        3. Beim eintragen des Schülers gebe ich folgendes quasi ein:
        INSERT INTO Schüler (ID, Vorname, Nachname, Kurs_ID#)
        VALUES("", Max, Mustermann, 2);

        Jepp, so würde ich das machen.

        Ich habe auch etwas von ON CASCADE und ON UPDATE gelesen. Bedeutet das beides das wenn ich die in der Tabelle den Kurs mit der ID 2 in ID 3 umbenne das die DB das auch automatisch in der Tabelle Schüler macht?

        Genau.
        "CASCADE" bedeutet nur, dass die Änderung an die verknüpften Tabellen weiter gegeben wird, Du kannst es mit "DELETE" oder "UPDATE" kombinieren um zu bestimmen, welche Form der Änderung kaskadiert werden soll:

        - "ON DELETE CASCADE": Wenn Du den Kurs X löscht, werden alle Schüler aus X gelöscht

        - "ON UPDATE CASCADE": Wenn Du die ID von Kurs X in Y änderst, ändert sich
           auch die Fremdschlüsselbeziehung aller Schüler mit  X in Y

        Geht natrülich auch beides zusammen.

        (Alternativ dazu kannst Du für UPDATE oder DELETE natürlich ein anderes Verhalten definieren, z.b. dass der entsprechende Fremdschlüssel auf Null gesetzt wird: ON DELETE SET NULL)

        1. Vielen Dank. Genau das wollte ich wissen. :)

          @alle anderen: danke für eure Vorschläge und Hilfen aber es ist schon so beabsichtigt das jeder Schüler nur einen Kurs hat. Dieser eine Kurs ist sein Tutorkurs, hätte ich vllt auch so nennen sollen.
          Deshalb steht auch die Kurs_ID als FK in der Schülertabelle.

          Eine andere Frage hierzu:

          Ich hab die Schülerinformationen in einer Excel Tabelle. Gibt es eine Möglichkeit diese unkompliziert in die DB zu überführen ohne 200 mal INSERT INTO ... zu benutzen?

          1. Hallo,

            Ich hab die Schülerinformationen in einer Excel Tabelle. Gibt es eine Möglichkeit diese unkompliziert in die DB zu überführen ohne 200 mal INSERT INTO ... zu benutzen?

            Du kannst das Excel-Sheet in ein CSV-File umwandeln und dieses dann in XAMPP importieren. Soweit ich weiß, ist da ja phpmyAdmin installiert, damit geht das.

            1. Du kannst das Excel-Sheet in ein CSV-File umwandeln und dieses dann in XAMPP importieren. Soweit ich weiß, ist da ja phpmyAdmin installiert, damit geht das.

              Sorry, ich meinte natürlich, in MySQL importieren. Aber phpmyadmin müsste bei xampp dabei sein. So herum stimmts :)

              1. Du kannst das Excel-Sheet in ein CSV-File umwandeln und dieses dann in XAMPP importieren. Soweit ich weiß, ist da ja phpmyAdmin installiert, damit geht das.

                Sorry, ich meinte natürlich, in MySQL importieren. Aber phpmyadmin müsste bei xampp dabei sein. So herum stimmts :)

                Super vielen Dank. Hat geklappt. ^^

                1. Da Andreas ja der Meinung ist dass das Verschieben von Datensätzen zum Thema "Tabellen verknüpfen" gehört kopier ich meinen anderen Thread hier rein...

                  Hey,

                  nachdem mir in nem anderen Thread schon geholfen wurde komme ich jetzt mit etwas anderem nicht weiter.

                  Ich habe nun meine Excel Tabelle importiert aber wie bekomme die Datensätze in die richtigen Tabellen?

                  Im Moment sind meine tbltemp so aus:
                  ID, Vorname, Nachname, Kurs, Lehrer, usw...

                  Ich möchte jetzt nur die ID, Vorname und Nachnamen in die tblTeilnehmer machen.

                  Die sieht auch so aus: ID, Vorname, Nachname.

                  Hab an
                  INSERT INTO tblTeilnehmer SET ID = (SELECT ID FROM tbltemp WHERE ID = 1)

                  gedacht aber da sitze ich bis nächste Woche dran, wenn ich für jedes Attribut einen SQL Befehl machen muss.

      2. Hi,

        1. Erstelle ich eine DB.
        2. Ich erstelle die Tabellen mit den jeweiligen Attributen.
          2.1 Ich sage der Kurs_ID# in der Tabelle Schüler das sie der FK aus der Tabelle Kurs ist.
        3. Beim eintragen des Schülers gebe ich folgendes quasi ein:
          INSERT INTO Schüler (ID, Vorname, Nachname, Kurs_ID#)
          VALUES("", Max, Mustermann, 2);

        INSERT INTO Schüler (ID, Vorname, Nachname, Kurs_ID#) VALUES(1, 'Max',   'Mustermann', 2);
        INSERT INTO Schüler (ID, Vorname, Nachname, Kurs_ID#) VALUES(1, 'Erika', 'Mustermann', 3);

        Upps. Derselben Schülerid sind in unterschiedlichen Kursen unterschiedliche Namen zugeordnet.
        Die Kurszuordnung hat in der Schülertabelle nichts verloren.

        Dazu braucht es, wie Felix schon schrieb, eine Extra-Tabelle, die die Zuordnung zwischen Schüler und Kurs regelt.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Aloha,

          Upps. Derselben Schülerid sind in unterschiedlichen Kursen unterschiedliche Namen zugeordnet.

          Nicht wenn die ID unique ist (was sie bei einem sinnvollen DB-Design in jedem Fall sein sollte)

          Die Frage ist, ob Kurs<->Schüler eine 1:n oder m:n-Beziehung ist. Es kann durchaus so sein, dass ein Schüler genau einen Kurs besuchen kann.

          Viele Grüße,
          Jörg

          1. Hi,

            Upps. Derselben Schülerid sind in unterschiedlichen Kursen unterschiedliche Namen zugeordnet.

            Nicht wenn die ID unique ist (was sie bei einem sinnvollen DB-Design in jedem Fall sein sollte)

            Dann hätte derselbe Schüler mehrere IDs, wenn er mehrere Kurse besucht. Auch nicht sinnvoll.

            Die Frage ist, ob Kurs<->Schüler eine 1:n oder m:n-Beziehung ist. Es kann durchaus so sein, dass ein Schüler genau einen Kurs besuchen kann.

            Dann ist immer noch die Frage, ob der vom Schüler besuchte Kurs etwas in der Schüler-Tabelle zu suchen hat.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  2. Lieber Saphir,

    Folgende Relation würden isch ergeben:

    Schüler(Schueler_ID, Vorname, Nachname, Kurs_ID#)
    Kurs(Kurs_ID, Kursbezeichnung)

    das finde ich nicht gut. In meinen Augen sollte die Verknüpfung aus Schüler-Namen und Kurs-ID nicht in derselben Tabelle stehen. Ich würde das eher so lösen:

    Schüler(Schueler_ID, Vorname, Nachname)
    Kurs(Kurs_ID, Kursbezeichnung)
    gebucht(Schueler_ID, Kurs_ID)

    In einer Tabelle sollten nach meiner Auffassung nur die unmittelbaren Eigenschaften eines "Gegenstands" stehen.

    In der Schülertabelle sind das die Eigenschaften eines Schülers wie Vor- und Nachname. Dort könnten von mir aus auch noch weitere Schülerdaten stehen, die einen Schüler näher definieren: Telefon-Nummer, Email-Adresse, Geburtsdatum, Anschrift etc.

    In der Kursetabelle sollten nur die Dinge stehen, die einen Kurs näher beschreiben. Neben der Kursbezeichnung könnte dort auch stehen, was er kostet, wann er stattfindet und wo.

    Die Verknüpfung von Schülerdaten und Kursdaten sollte nach meiner Auffassung in einer eigenen Tabelle in Form einer m:n-Relation stehen. Dadurch könnte ein Schüler auch mehrere Kurse belegen, was in Deinem Entwurf z.B. nicht abgebildet werden kann.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo,

      Schüler(Schueler_ID, Vorname, Nachname)
      Kurs(Kurs_ID, Kursbezeichnung)
      gebucht(Schueler_ID, Kurs_ID)

      In einer Tabelle sollten nach meiner Auffassung nur die unmittelbaren Eigenschaften eines "Gegenstands" stehen.

      Die Frage ist halt, wie da die Fachlichkeit ist.
      Wenn es eine echte "1:n"-Beziehung ist, also ein Schüler genau EINEN Kurs besuchen kann (was ja sein kann, wenn das z.b. der EINE Wahlkurs ist, den ein Schüler maximal belegen kann o.ä.), dann ist ein Schüler also ein "Kursbesucher" und somit ist die Kurs-ID auch eine Eigenschaft eines ebensolchen.
      Eine zusätzliche Tabelle würde dann ggf. unnötig Performance für Joins verursachen.

      Vermutlich hat der Fragende aber tatsächlich eine m:n-Beziehung gemeint (Die Zuordnung Kurs-Shüler sieht zumindest stark danach aus), insofern - guter Einwand.

      1. Lieber mrjerk,

        Eine zusätzliche Tabelle würde dann ggf. unnötig Performance für Joins verursachen.

        Selbst wenn man eine Universität mit 24.000 Studenten nähme (habe nachgeschaut, die Uni Tübingen hat etwa so viele), wäre eine solche Performanceeinbuße kaum der Rede wert. Bei einer Schule sind die Schülerzahlen nocheinmal weit darunter anzusiedeln (eine Schule mit 5000 Schülern ist ein Monstrum, das kaum handhabbar ist!), sodass diese Performance-Frage wirklich bedeutungslos ist. Die Skalierbarkeit des Projektes im Hinblick auf eine spätere Erweiterung wiegt da meines Erachtens extrem viel schwerer, sodass man hier "es gleich richtig machen" sollte.

        insofern - guter Einwand.

        Danke!

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. Da Andreas ja der Meinung ist dass das Verschieben von Datensätzen zum Thema "Tabellen verknüpfen" gehört kopier ich meinen anderen Thread hier rein...

    Hey,

    nachdem mir in nem anderen Thread schon geholfen wurde komme ich jetzt mit etwas anderem nicht weiter.

    Ich habe nun meine Excel Tabelle importiert aber wie bekomme die Datensätze in die richtigen Tabellen?

    Im Moment sind meine tbltemp so aus:
    ID, Vorname, Nachname, Kurs, Lehrer, usw...

    Ich möchte jetzt nur die ID, Vorname und Nachnamen in die tblTeilnehmer machen.

    Die sieht auch so aus: ID, Vorname, Nachname.

    Hab an
    INSERT INTO tblTeilnehmer SET ID = (SELECT ID FROM tbltemp WHERE ID = 1)

    gedacht aber da sitze ich bis nächste Woche dran, wenn ich für jedes Attribut einen SQL Befehl machen muss.