Uma tabela para este relatório
Este relatório só funciona se 'Michel' identificar um instrutor. Caso contrário, você precisará de vários sub-relatórios para uma interseção de um dia da semana com um intervalo de tempo ou precisará de vários relatórios.
Cada sub-relatório não em branco em uma linha e coluna do seu relatório informa:
instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
. Portanto, o relatório informa a mesma coisa geral que uma tabela contendo as linhas onde:
instructor Michel teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Observe como pegamos cada coluna e linha de um relatório multidimensional como este e adicionamos uma coluna para ela na tabela para cada sub-relatório multidimensional onde eles se cruzam. Provavelmente você quer uma tabela dizendo a mesma coisa que todos os relatórios para todos os instrutores:
instructor
I
teaches course
C
in classroom
CR
to section
S
for department
D
in timeslot
TS
on weekday
WD
. Observe como pegamos um parâmetro no título e adicionamos uma coluna para ele na tabela. (Agora não precisamos nos preocupar se Michel identifica um instrutor.)
Um primeiro design para este relatório
Os nomes dos instrutores provavelmente não são exclusivos ou permanentes. Portanto, adicione ids a nomes e títulos de relatórios. Você provavelmente tem mais dados sobre instrutores, cursos e departamentos. Então, tem mesas para eles. Aparentemente, um número de seção é único dentro de um 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
Seus detalhes de design serão diferentes. Talvez os cursos e/ou departamentos tenham códigos únicos. Então você pode usá-los como FKs. Em seguida, adicione uma tabela. Aparentemente, uma seção pode estar ativa, o que quer que isso signifique.
CKs e normalização
Um determinado instrutor, horário e dia da semana só pode ter uma aula semanal. Mas nenhum subconjunto menor desses faz. Então temos
Weekly_Lecture CK(I_id, TS_name, WD_name)
. Um determinado curso, seção, horário e dia da semana só pode ter uma aula semanal. Mas nenhum subconjunto menor desses faz. Então temos Weekly_Lecture CK(C_name, S_number, TS_name, WD_name)
. Uma determinada sala de aula, horário e dia da semana só pode ter uma aula semanal. Mas nenhum subconjunto menor desses faz. Então temos Weekly_Lecture CK(CR_name, TS_name, WD_name)
. Talvez um determinado curso só possa ser ministrado para um departamento? Talvez um determinado número de seção só possa ser ensinado por um determinado instrutor? Ao identificar todos os FDs (dependências funcionais) determinamos todos os CKs (chaves candidatas). Em seguida, normalização usa-os para possivelmente sugerir escolhas "melhores" para tabelas base.