Tabela dla tego raportu
Ten raport działa tylko wtedy, gdy „Michel” identyfikuje jednego instruktora. W przeciwnym razie potrzebujesz wielu raportów podrzędnych dla jednego przecięcia przedziału czasu w dni powszednie lub wielu raportów.
Każdy niepusty raport podrzędny w wierszu i kolumnie raportu zawiera informację:instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
.
Raport mówi więc ogólnie to samo, co tabela zawierająca wiersze, w których:instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Zwróć uwagę, jak bierzemy każdą kolumnę i wiersz wielowymiarowego raportu takiego jak ten i dodajemy dla nich kolumnę do tabeli dla każdego wielowymiarowego podraportu, w którym się przecinają.
Prawdopodobnie chcesz, aby tabela zawierała to samo, co wszystkie raporty dla wszystkich instruktorów:instructor
I
teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Zwróć uwagę, jak bierzemy parametr w tytule i dodajemy dla niego kolumnę do tabeli.
(Teraz nie musimy się martwić, czy Michel zidentyfikuje jednego instruktora.)
Pierwszy projekt tego raportu
Nazwiska instruktorów są prawdopodobnie nieunikalne lub nietrwałe. Dodaj więc identyfikatory do nazw i tytułów raportów. Prawdopodobnie masz więcej danych o instruktorach, kursach i działach. Więc miej dla nich stoły. Najwyraźniej numer sekcji jest unikalny tylko w ramach kursu.
-- 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
Twoje szczegóły projektu będą się różnić. Może kursy i/lub wydziały mają unikalne kody. Wtedy możesz ich użyć jako FK. Następnie dodaj tabelę. Najwyraźniej sekcja może być aktywna, cokolwiek to znaczy.
CK i normalizacja
Dany instruktor, przedział czasowy i dzień tygodnia mogą mieć tylko jeden wykład w tygodniu. Ale nie mniejszy ich podzbiór. Mamy więc Weekly_Lecture CK(I_id, TS_name, WD_name)
. Dany kurs, sekcja, przedział czasowy i dzień tygodnia mogą mieć tylko jeden wykład w tygodniu. Ale nie mniejszy ich podzbiór. Mamy więc Weekly_Lecture CK(C_name, S_number, TS_name, WD_name)
. Dana klasa, przedział czasowy i dzień tygodnia mogą mieć tylko jeden wykład w tygodniu. Ale nie mniejszy ich podzbiór. Mamy więc Weekly_Lecture CK(CR_name, TS_name, WD_name)
.
Może dany kurs może być prowadzony tylko na jednym wydziale? Może dany numer sekcji może prowadzić tylko dany instruktor? Identyfikując wszystkie FD (zależności funkcjonalne) określamy wszystkie CK (klucze kandydatów). Następnie normalizacja używa ich do sugerowania "lepszych" wyborów dla tabel podstawowych.