Таблица за този отчет
Този отчет работи само ако „Мишел“ идентифицира един инструктор. В противен случай или имате нужда от множество подотчети за едно пресичане на ден от седмицата и часови интервал, или имате нужда от множество отчети.
Всеки непразен подотчет на ред и колона от вашия отчет ви казва:instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
.
Така че отчетът ви казва същото като цяло като таблица, съдържаща редовете, където:instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Забележете как вземаме всяка колона и ред от многоизмерен отчет като този и добавяме колона за него към таблицата за всеки многоизмерен подотчет, където се пресичат.
Вероятно искате таблица, която да ви казва същото като всички отчети за всички инструктори:instructor
I
teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Забележете как вземаме параметър в заглавието и добавяме колона за него към таблицата.
(Сега не е нужно да се притесняваме дали Мишел идентифицира един инструктор.)
Първи дизайн за този отчет
Имената на инструкторите вероятно не са уникални или непостоянни. Така че добавете идентификатори към имената и заглавията на отчетите. Вероятно имате повече данни за инструктори, курсове и отдели. Така че имайте маси за тях. Очевидно номерът на раздел е уникален само в рамките на курс.
-- 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
Детайлите на вашия дизайн ще се различават. Може би курсовете и/или отделите имат уникални кодове. Тогава можете да ги използвате като FK. След това добавете таблица. Очевидно даден раздел може да бъде активен, каквото и да означава това.
CK и нормализиране
Даден инструктор, времеви интервал и ден от седмицата може да има само една седмична лекция. Но нито една по-малка част от тях не го прави. Така че имаме Weekly_Lecture CK(I_id, TS_name, WD_name)
. Даден курс, раздел, времеви интервал и делничен ден може да има само една седмична лекция. Но нито една по-малка част от тях не го прави. Така че имаме Weekly_Lecture CK(C_name, S_number, TS_name, WD_name)
. Дадена класна стая, времеви интервал и делничен ден може да има само една седмична лекция. Но нито една по-малка част от тях не го прави. Така че имаме Weekly_Lecture CK(CR_name, TS_name, WD_name)
.
Може би даден курс може да се преподава само за един отдел? Може би даден номер на раздел може да се преподава само от даден инструктор? Чрез идентифициране на всички FD (функционални зависимости) ние определяме всички CK (кандидат ключове). След това нормализиране използва ги, за да предложи евентуално "по-добър" избор за базови таблици.