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
Scarica

FK - DBGroup