Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich aus den erstellten Tabellen eine Zeitplantabelle für den Lehrer erstellen?

Eine Tabelle für diesen Bericht

Dieser Bericht funktioniert nur, wenn „Michel“ einen Lehrer identifiziert. Andernfalls benötigen Sie entweder mehrere Unterberichte für eine Wochentag-Zeitfenster-Schnittmenge oder Sie benötigen mehrere Berichte.

Jeder nicht leere Unterbericht in einer Zeile und Spalte Ihres Berichts sagt Ihnen:instructor Michel teaches course C in classroom CR to section S for department D .

Der Bericht sagt Ihnen also insgesamt dasselbe wie eine Tabelle mit den Zeilen, in denen:instructor Michel teaches course C in classroom CR to section S for department D in timeslot TS on weekday WD . Beachten Sie, wie wir jede Spalte und Zeile eines mehrdimensionalen Berichts wie diesen nehmen und der Tabelle für jeden mehrdimensionalen Unterbericht dort, wo sie sich überschneiden, eine Spalte dafür hinzufügen.

Wahrscheinlich möchten Sie eine Tabelle, die Ihnen dasselbe sagt wie alle Berichte für alle Dozenten:instructor I teaches course C in classroom CR to section S for department D in timeslot TS on weekday WD . Beachten Sie, wie wir einen Parameter im Titel nehmen und der Tabelle eine Spalte dafür hinzufügen.

(Jetzt brauchen wir uns keine Gedanken mehr darüber zu machen, ob Michel einen Ausbilder identifiziert.)

Ein erster Entwurf für diesen Bericht

Lehrernamen sind wahrscheinlich nicht eindeutig oder nicht dauerhaft. Fügen Sie also IDs zu Namen und Berichtstiteln hinzu. Wahrscheinlich haben Sie weitere Daten zu Dozenten, Kursen und Fachbereichen. Also haben Sie Tische für sie. Anscheinend ist eine Sektionsnummer nur innerhalb eines Kurses eindeutig.

-- instructor ID is named NAME and ...
Instructor(id, name, ...)
    CK(id)
-- course NAME ...
Course(name, ...)
    CK (name)
-- department NAME ...
Department(name, ...)
    CK (name)
-- course C_NAME has section S_NUMBER
Course_Has_Section(C_name, S_number)
    CK (C_name, S_number)
    FK(C_name) to Course
-- instructor I_id teaches course C_NAME in classroom CR_NAME to section S_NUMBER 
--     for department D_NAME in timeslot TS_NAME on weekday WD_NAME
Weekly_Lecture(I_id, C_name, CR_name, S_number, D_name, TS_name, WD_name)
    FK(I_id) to Instructor
    FK(C_name, S_number) to Course_Has_Section
    FK(D_name) to Department

Ihre Designdetails werden abweichen. Möglicherweise haben Kurse und/oder Abteilungen eindeutige Codes. Dann könnten Sie sie als FKs verwenden. Fügen Sie dann eine Tabelle hinzu. Anscheinend kann ein Abschnitt aktiv sein, was auch immer das bedeutet.

CKs und Normalisierung

Ein bestimmter Lehrer, Zeitfenster und Wochentag kann nur eine wöchentliche Vorlesung haben. Aber keine kleinere Teilmenge davon tut es. Wir haben also Weekly_Lecture CK(I_id, TS_name, WD_name) . Ein bestimmter Kurs, Abschnitt, Zeitfenster und Wochentag kann nur eine wöchentliche Vorlesung haben. Aber keine kleinere Teilmenge davon tut es. Wir haben also Weekly_Lecture CK(C_name, S_number, TS_name, WD_name) . Ein gegebenes Klassenzimmer, Zeitfenster und Wochentag kann nur eine wöchentliche Vorlesung haben. Aber keine kleinere Teilmenge davon tut es. Wir haben also Weekly_Lecture CK(CR_name, TS_name, WD_name) .

Vielleicht kann ein bestimmter Kurs nur für einen Fachbereich unterrichtet werden? Vielleicht kann eine bestimmte Abschnittsnummer nur von einem bestimmten Lehrer unterrichtet werden? Indem wir alle FDs (funktionale Abhängigkeiten) identifizieren, bestimmen wir alle CKs (Kandidatenschlüssel). Dann Normalisierung verwendet diese, um möglicherweise "bessere" Auswahlmöglichkeiten für Basistabellen vorzuschlagen.