Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso creare una tabella di pianificazione per l'istruttore dalle tabelle create

Una tabella per questo rapporto

Questo rapporto funziona solo se "Michel" identifica un istruttore. In caso contrario, sono necessari più rapporti secondari per un'intersezione tra giorni feriali e fasce orarie oppure sono necessari più rapporti.

Ogni sottoreport non vuoto in una riga e in una colonna del tuo rapporto ti dice:instructor Michel teaches course C in classroom CR to section S for department D .

Quindi il rapporto ti dice in generale la stessa cosa di una tabella che contiene le righe in cui:instructor Michel teaches course C in classroom CR to section S for department D in timeslot TS on weekday WD . Nota come prendiamo ogni colonna e riga di un report multidimensionale come questo e aggiungiamo una colonna alla tabella per ogni sottoreport multidimensionale in cui si intersecano.

Probabilmente vuoi una tabella che ti dice la stessa cosa di tutti i rapporti per tutti gli istruttori:instructor I teaches course C in classroom CR to section S for department D in timeslot TS on weekday WD . Nota come prendiamo un parametro nel titolo e aggiungiamo una colonna per esso alla tabella.

(Ora non dobbiamo preoccuparci se Michel identifichi un istruttore.)

Un primo progetto per questo rapporto

I nomi degli istruttori sono probabilmente non univoci o non permanenti. Quindi aggiungi gli ID ai nomi e i titoli dei rapporti. Probabilmente hai più dati su istruttori, corsi e dipartimenti. Quindi hanno dei tavoli per loro. Apparentemente un numero di sezione è unico solo all'interno di un corso.

-- 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

I dettagli del tuo design saranno diversi. Forse i corsi e/o i dipartimenti hanno codici univoci. Quindi potresti usarli come FK. Quindi aggiungi una tabella. Apparentemente una sezione può essere attiva, qualunque cosa significhi.

CK e normalizzazione

Un determinato istruttore, fascia oraria e giorno feriale può avere solo una lezione settimanale. Ma nessun sottoinsieme più piccolo di quelli lo fa. Quindi abbiamo Weekly_Lecture CK(I_id, TS_name, WD_name) . Un determinato corso, sezione, fascia oraria e giorno della settimana può avere solo una lezione settimanale. Ma nessun sottoinsieme più piccolo di quelli lo fa. Quindi abbiamo Weekly_Lecture CK(C_name, S_number, TS_name, WD_name) . Una data classe, fascia oraria e giorno feriale può avere solo una lezione settimanale. Ma nessun sottoinsieme più piccolo di quelli lo fa. Quindi abbiamo Weekly_Lecture CK(CR_name, TS_name, WD_name) .

Forse un determinato corso può essere insegnato solo per un dipartimento? Forse un determinato numero di sezione può essere insegnato solo da un determinato istruttore? Identificando tutte le FD (dipendenze funzionali) determiniamo tutte le CK (chiavi candidate). Quindi normalizzazione li usa per suggerire possibilmente scelte "migliori" per le tabelle di base.