Modello Relazionale : valori nulli CODCOR CORSO NOME CODDOC C1 C2 C3 C4 C5 C6 Fisica 1 Analisi 1 Fisica 2 Analisi 2 Meccanica Storia D1 D2 D1 D2 null null t1 t2 t3 t4 t5 t6 Un valore nullo è diverso da ogni altro valore: t4[CODDOC]≠t5[CODDOC] 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 1 Modello Relazionale : Vincolo di Entity Integrity CODCOR CORSO NOME CODDOC C1 C2 C3 C4 C5 null null Fisica 1 Analisi 1 Fisica 2 Analisi 2 Meccanica Storia Musica D1 D2 D1 D2 null D3 null t1 t2 t3 t4 t5 t6 t7 t6[CODCOR]≠t7[CODCOR] : la definizione di chiave è rispettata! … però non posso identificare t6 e t7 ==> Vincolo di Entity Integrity 2 Modello Relazionale : Key e Foreign Key Key CODCOR CORSO NOME CODDOC C1 C2 C3 C4 C5 Fisica 1 Analisi 1 Fisica 2 Analisi 2 Meccanica D1 D2 D1 D2 null CODDOC D1 D2 D3 D4 DOCENTE CF CF1 CF2 CF3 CF4 CITTA MO BO MO Fi Foreign Key ==> una foreign key può essere nulla 3 CHIAVE PRIMARIA e CHIAVE ALTERNATIVA DOCENTE (CODDOC, CF, CITTÀ) AK: CF CODDOC : chiave primaria CF : chiave alternativa SQL (In Laboratorio) fornisce Primary Key Foreign Key … References Ma non Alternative Key (AK) Che verrà realizzato tramite NOT NULL + UNIQUE 4 NOTAZIONE DEL VINCOLO DI INTEGRITÀ REFERENZIALE CORSO (CODCOR,NOME,CODDOC) FK: CODDOC REFERENCES DOCENTE(CODDOC) dove: CORSO: DOCENTE: relazione/tabella dipendente o correlata 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 5 ESEMPI DI SCHEMI RELAZIONALI DOCENTE (CODDOC, CF, CITTÀ) AK: CF CORSO (CODCOR,NOME,CODDOCENTEDELMIOCORSO) FK: CODDOCENTEDELMIOCORSO REFERENCES DOCENTE TASSE(ANNO,CFDOCENTE,IMPORTO) FK: CFDOCENTE REFERENCES DOCENTE(CF) 6 ESEMPI DI SCHEMI RELAZIONALI DOCENTE (CODDOC, CF, CITTÀ) AK: CF CORSO (CODCOR,NOME,CODDOC) FK: CODDOC REFERENCES DOCENTE STUDENTE (MATR,NOME) ESAME(MATRSTUD,CORSO,VOTO,DATA) FK: MATRSTUD REFERENCES STUDENTE FK: CORSO REFERENCES CORSO DOMANDEESAME(NUMDOM,MATRSTUD,CORSO,GIUDIZIO) FK: MATRSTUD,CORSO REFERENCES ESAME L’ordine è importante: non posso scrivere DOMANDEESAME(NUMDOM,MATRSTUD,CORSO,GIUDIZIO) 7 FK: CORSO,MATRSTUD REFERENCES ESAME 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 8 FK: CORSO REFERENCES CORSO ESEMPI DI SCHEMI RELAZIONALI IMPIEGATO(CODIMP,SEDE,CODCAPO) FK: CODCAPO REFERENCES IMPIEGATO IMPIEGATO CODIMP SEDE CODCAPO C1 C2 Centrale Auto null C! C3 Auto C! C4 Motori C2 C5 C6 Motori Motori C2 C5 9 ESEMPI DI SCHEMI RELAZIONALI IMPIEGATO(CODIMP,CODREPARTO) FK: CODREPARTO REFERENCES REPARTO REPARTO(CODREP,CODCAPOREPARTO) FK: CODCAPOREPARTO REFERENCES IMPIEGATO Nello schema relazionale l’ordine 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 l’altra con FK e quindi si aggiunge 10 La FK alla prima tramite ALTER TABLE VISTE ESAME(MATR,NOMECORSO,VOTO) Query VISTA_ESAME SELECT NOMECORSO,VOTO FROM ESAME VISTA_ESAME(NOMECORSO,VOTO) Query VISTA_ESAME SELECT NOMECORSO,VOTO FROM ESAME JOIN DOCENTE ON (ESAME.DOCENTE = DOCENTE.DOCENTE) Nuovo Schema ESAME(MATR,DOCENTE,VOTO) DOCENTE(DOCENTE,NOMECORSO) 11