1 Modello Relazionale : valori nulli Un valore nullo è diverso da ogni altro valore: t4[CODDOC]t5[CODDOC] nullMeccanicaC5 D2Analisi 1C2 D1Fisica 2C3 nullStoriaC6 D2Analisi 2C4 D1Fisica 1C1 CODDOCNOMECODCO R CORSO t1 t2 t3 t4 t5 t6 Due valori nulli sono diversi tra di loro: t5[CODDOC]t6[CODDOC] Nei nostri schemi relazionali, come in SQL, se non specificato diversamente, assumeremo che un attributo possa assumere dei valori null vincolo NOT NULL : NOME NOT NULL
2 Modello Relazionale : Vincolo di Entity Integrity t6[CODCOR]t7[CODCOR] : la definizione di chiave è rispettata! nullMeccanicaC5 D2Analisi 1C2 D1Fisica 2C3 nullMusicanull D3Storianull D2Analisi 2C4 D1Fisica 1C1 CODDOCNOMECODCO R CORSO t1 t2 t3 t4 t5 t6 t7 … però non posso identificare t6 e t7 ==> Vincolo di Entity Integrity
3 CORSO CODCORNOMECODDOC C1Fisica 1D1 C2Analisi 1D2 C3Fisica 2D1 C4Analisi 2D2 C5Meccanicanull Modello Relazionale : Key e Foreign Key DOCENTE CODDOCCFCITTA D1CF1MO D2CF2BO D3CF3MO D4CF4Fi Key Foreign Key ==> una foreign key può essere nulla
4 DOCENTE (CODDOC, CF, CITTÀ) AK: CF CODDOC : chiave primaria CF : chiave alternativa CHIAVE PRIMARIA e CHIAVE ALTERNATIVA SQL (In Laboratorio) fornisce Primary Key Foreign Key … References Ma non Alternative Key (AK) Che verrà realizzato tramite NOT NULL + UNIQUE
5 CORSO (CODCOR,NOME,CODDOC) FK: CODDOC REFERENCES DOCENTE(CODDOC) dove: CORSO:relazione/tabella dipendente o correlata DOCENTE: relazione/tabella riferita o primaria Essendo CODDOC la chiave primaria della relazione riferita DOCENTE, si può omettere in DOCENTE(CODDOC) CORSO (CODCOR,NOME,CODDOC) FK: CODDOC REFERENCES DOCENTE NOTAZIONE DEL VINCOLO DI INTEGRITÀ REFERENZIALE
6 DOCENTE (CODDOC, CF, CITTÀ) AK: CF ESEMPI DI SCHEMI RELAZIONALI CORSO (CODCOR,NOME,CODDOCENTEDELMIOCORSO) FK: CODDOCENTEDELMIOCORSO REFERENCES DOCENTE TASSE(ANNO,CFDOCENTE,IMPORTO) FK: CFDOCENTE REFERENCES DOCENTE(CF)
7 DOCENTE (CODDOC, CF, CITTÀ) AK: CF ESEMPI DI SCHEMI RELAZIONALI CORSO (CODCOR,NOME,CODDOC) FK: CODDOC REFERENCES DOCENTE ESAME(MATRSTUD,CORSO,VOTO,DATA) FK: MATRSTUD REFERENCES STUDENTE FK: CORSO REFERENCES CORSO STUDENTE (MATR,NOME) DOMANDEESAME(NUMDOM,MATRSTUD,CORSO,GIUDIZIO) FK: MATRSTUD,CORSO REFERENCES ESAME Lordine è importante: non posso scrivere DOMANDEESAME(NUMDOM,MATRSTUD,CORSO,GIUDIZIO) FK: CORSO,MATRSTUD REFERENCES ESAME
8 ESEMPI DI SCHEMI RELAZIONALI Per riferirmi ad ESAME devo usare la sua chiave: DOMANDEESAME(NUMDOM,MATRSTUD,CORSO,GIUDIZIO) FK: MATRSTUD,CORSO REFERENCES ESAME e non le singole componenti della chiave di ESAME: DOMANDEESAME(NUMDOM,MATRSTUD,CORSO,GIUDIZIO) FK: MATRSTUD REFERENCES STUDENTE FK: CORSO REFERENCES CORSO anche ripeterle è un errore (ridondanza): DOMANDEESAME(NUMDOM,MATRSTUD,CORSO,GIUDIZIO) FK: MATRSTUD,CORSO REFERENCES ESAME FK: MATRSTUD REFERENCES STUDENTE FK: CORSO REFERENCES CORSO
9 ESEMPI DI SCHEMI RELAZIONALI IMPIEGATO(CODIMP,SEDE,CODCAPO) FK: CODCAPO REFERENCES IMPIEGATO IMPIEGATO CODIMPSEDECODCAPO C1Centralenull C2AutoC! C3AutoC! C4MotoriC2 C5MotoriC2 C6MotoriC5
10 ESEMPI DI SCHEMI RELAZIONALI IMPIEGATO(CODIMP,CODREPARTO) FK: CODREPARTO REFERENCES REPARTO REPARTO(CODREP,CODCAPOREPARTO) FK: CODCAPOREPARTO REFERENCES IMPIEGATO Nello schema relazionale lordine delle relazioni è irrilevante. In SQL quando ci si riferisce ad una relazione, tale relazione deve già esistere, ovvero deve essere stata già creata Nei casi ciclici come il precedente: prima si definisce una relazione senza FK, poi laltra con FK e quindi si aggiunge La FK alla prima tramite ALTER TABLE
11 VISTE ESAME(MATR,NOMECORSO,VOTO) VISTA_ESAME(NOMECORSO,VOTO) SELECT NOMECORSO,VOTO FROM ESAME Query VISTA_ESAME ESAME(MATR,DOCENTE,VOTO) DOCENTE(DOCENTE,NOMECORSO) Nuovo Schema SELECT NOMECORSO,VOTO FROM ESAME JOIN DOCENTE ON (ESAME.DOCENTE = DOCENTE.DOCENTE) Query VISTA_ESAME