Una tabla para este informe
Este informe solo funciona si 'Michel' identifica a un instructor. De lo contrario, necesita varios subinformes para la intersección de un intervalo de tiempo de un día de la semana o necesita varios informes.
Cada subinforme que no esté en blanco en una fila y columna de su informe le dice:instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
.
Entonces, el informe le dice lo mismo en general que una tabla que contiene las filas donde:instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Observe cómo tomamos cada columna y fila de un informe multidimensional como este y agregamos una columna a la tabla para cada subinforme multidimensional donde se cruzan.
Probablemente desee una tabla que le diga lo mismo que todos los informes para todos los instructores:instructor
I
teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Observe cómo tomamos un parámetro en el título y le agregamos una columna a la tabla.
(Ahora no tenemos que preocuparnos de si Michel identifica a un instructor).
Un primer diseño para este informe
Los nombres de los instructores probablemente no sean únicos o permanentes. Así que agregue ID a los nombres y títulos de informes. Probablemente tengas más datos sobre instructores, cursos y departamentos. Así que ten mesas para ellos. Aparentemente, un número de sección solo es único dentro de un curso.
-- 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
Sus detalles de diseño serán diferentes. Tal vez los cursos y/o departamentos tengan códigos únicos. Entonces podría usarlos como FK. Luego agregue una tabla. Aparentemente, una sección puede estar activa, sea lo que sea que eso signifique.
CK y normalización
Un instructor, intervalo de tiempo y día de la semana determinados solo pueden tener una clase semanal. Pero ningún subconjunto más pequeño de ellos lo hace. Entonces tenemos Weekly_Lecture CK(I_id, TS_name, WD_name)
. Un curso, sección, intervalo de tiempo y día de la semana determinados solo pueden tener una clase semanal. Pero ningún subconjunto más pequeño de ellos lo hace. Entonces tenemos Weekly_Lecture CK(C_name, S_number, TS_name, WD_name)
. Un salón de clases, un intervalo de tiempo y un día de la semana determinados solo pueden tener una clase semanal. Pero ningún subconjunto más pequeño de ellos lo hace. Entonces tenemos Weekly_Lecture CK(CR_name, TS_name, WD_name)
.
¿Quizás un curso determinado solo se puede impartir para un departamento? ¿Quizás un número de sección determinado solo puede ser enseñado por un instructor determinado? Al identificar todas las FD (dependencias funcionales), determinamos todas las CK (claves candidatas). Luego normalización los usa para sugerir posibles opciones "mejores" para las tablas base.