Chefkoch
Mitglied
Ich beschäftige mich erst seit kurzem mit Datenbanken und habe nun ein kleines praktisches Beispiel gemacht.
Es geht um eine Datenbank auf einer Universität mit Studenten, Professoren und Vorlesungen.
1 Professor kann mehrere Vorlesungen abhalten. Mehrere Studenten können mehrere Vorlesungen besuchen. Mehrere Vorlesungen können von mehreren Studenten besucht werden. Zwischen Vorlesung und Student haben wir also n:m
Wie die Tabellen aufgebaut sind, sieht man bei dem angehängtem Bild.
Und in der Tabelle Student_has_Vorlesung befindet sich das problem. Das ist die Transformation zwischen Student und Vorlesung, da es ja n:m ist.
Vorlesung_Professor_Pid:Integer(FK) ist nämlich der Foreign Key aus der Tabelle Vorlesung (Professor_Pid), welcher wiederum der Foreign Key aus der Tabelle Professor(pid) ist. Da ist pid der Primary key.
Das Problem ist, dass ich die 3. NF nicht so erreichen kann, da Professor_Pid von dem Primary key VID in der Tabelle Vorlesung abhängt. VID ist der Primary Key aus der Tabelle Vorlesung und müsste ja nur diesen an die neue Transformationstabelle zwischen Student und Vorlesung schicken. Ich schicke aber den Primary key und Foreign key, welcher ja nun vom Primary key abhängt, in die neue Tabelle. Somit habe ich eine transitive Abhängigkeit vom PK, da Professor_Pid als nichtschlüssel vom nichtschlüssel Vorlesung_VID abhängt. Professor_Pid ist hier redundant, doch leider brauche ich ihn, damit die folgende Abfrage funktioniert:
hier bekomme ich studentenname, vorlesungsname und professorname. Wenn ich Professor_pid nicht als attribut habe, dann erhalte ich nur studentenname und Vorlesung, da ich ja keine Verbindung auf die Tabelle Professor habe. Wenn ich Proffesor.pid mit Vorlesung.proffessor_pid vergleichen könnte, dann würde es auch gehen. Doch wie
Die neue Tabelle hat als PK "ID".
Functional Dependency: ID->(Sid(fk),Professor_pid(fk),Vid(fk)) jedoch FD:Vid->Professor_pid und das ist eine transitive Abhängigkeit vom PK ID. Jetzt müsste ich Vid und Proffesor_pid in neue Tabelle auslagern, was ich ja aber schon gemacht habe. Das ist die Tabelle Vorlesungen.
create table a.Student_has_vorlesung(
ID int not null auto_increment primary key,
Sid int not null,
Professor_pid int not null,
Vid int not null,
Foreign key(Sid)references Student(sid),
Foreign key(Professor_pid) references Vorlesung(professor_pid),
Foreign key(Vid) references Vorlesung(vid)
)
Die Tabellenstruktur liefert das Ergebnis, welches ich möchte, doch habe ich eine transitive Abhängigkeit vom Primary Key ID in der Tabelle Student_has_Vorlesung und somit kann ich keine 3.Normalform erreichen, was ich aber muss, um nicht Modify-Anomalien irgendwann mal zu bekommen. Ich denke, dass die Lösung eigentlich die Umformulierung des Inner joins sein müsste.
Es geht um eine Datenbank auf einer Universität mit Studenten, Professoren und Vorlesungen.
1 Professor kann mehrere Vorlesungen abhalten. Mehrere Studenten können mehrere Vorlesungen besuchen. Mehrere Vorlesungen können von mehreren Studenten besucht werden. Zwischen Vorlesung und Student haben wir also n:m
Wie die Tabellen aufgebaut sind, sieht man bei dem angehängtem Bild.
Und in der Tabelle Student_has_Vorlesung befindet sich das problem. Das ist die Transformation zwischen Student und Vorlesung, da es ja n:m ist.
Vorlesung_Professor_Pid:Integer(FK) ist nämlich der Foreign Key aus der Tabelle Vorlesung (Professor_Pid), welcher wiederum der Foreign Key aus der Tabelle Professor(pid) ist. Da ist pid der Primary key.
Das Problem ist, dass ich die 3. NF nicht so erreichen kann, da Professor_Pid von dem Primary key VID in der Tabelle Vorlesung abhängt. VID ist der Primary Key aus der Tabelle Vorlesung und müsste ja nur diesen an die neue Transformationstabelle zwischen Student und Vorlesung schicken. Ich schicke aber den Primary key und Foreign key, welcher ja nun vom Primary key abhängt, in die neue Tabelle. Somit habe ich eine transitive Abhängigkeit vom PK, da Professor_Pid als nichtschlüssel vom nichtschlüssel Vorlesung_VID abhängt. Professor_Pid ist hier redundant, doch leider brauche ich ihn, damit die folgende Abfrage funktioniert:
PHP:
select a.student.Sname,a.vorlesung.Vname,a.professor.pname from
a.student_has_vorlesung as shv inner join a.student
on a.student.sid=a.shv.sid
inner join a.vorlesung on a.vorlesung.vid=a.shv.vid
inner join a.professor on a.professor.pid=a.shv.professor_pid
hier bekomme ich studentenname, vorlesungsname und professorname. Wenn ich Professor_pid nicht als attribut habe, dann erhalte ich nur studentenname und Vorlesung, da ich ja keine Verbindung auf die Tabelle Professor habe. Wenn ich Proffesor.pid mit Vorlesung.proffessor_pid vergleichen könnte, dann würde es auch gehen. Doch wie
Die neue Tabelle hat als PK "ID".
Functional Dependency: ID->(Sid(fk),Professor_pid(fk),Vid(fk)) jedoch FD:Vid->Professor_pid und das ist eine transitive Abhängigkeit vom PK ID. Jetzt müsste ich Vid und Proffesor_pid in neue Tabelle auslagern, was ich ja aber schon gemacht habe. Das ist die Tabelle Vorlesungen.
create table a.Student_has_vorlesung(
ID int not null auto_increment primary key,
Sid int not null,
Professor_pid int not null,
Vid int not null,
Foreign key(Sid)references Student(sid),
Foreign key(Professor_pid) references Vorlesung(professor_pid),
Foreign key(Vid) references Vorlesung(vid)
)
Die Tabellenstruktur liefert das Ergebnis, welches ich möchte, doch habe ich eine transitive Abhängigkeit vom Primary Key ID in der Tabelle Student_has_Vorlesung und somit kann ich keine 3.Normalform erreichen, was ich aber muss, um nicht Modify-Anomalien irgendwann mal zu bekommen. Ich denke, dass die Lösung eigentlich die Umformulierung des Inner joins sein müsste.