Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso fazer uma tabela de horários para instrutor a partir de tabelas criadas


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.