Progettazione: relazione N:N - partecipazione parziale

Lezione 7

Problema

Vogliamo creare un piccolo database per tenere traccia di tutti i medicinali che abbiamo in casa.
Per ogni medicinale vogliamo conoscere i seguenti dati: il nome, il tipo (sciroppo, capsule, supposte, ecc.), il costo, la data di scadenza e le malattie curate.

Schema Concettuale: ER

image/svg+xml Layer 1 dataDiScadenza costo tipo(...) MEDICINE nome (0,N) CURANO descrizione MALATTIE (1,N)

Nota.

In una relazione N:N un elemento della prima entità può essere collegato a più di un elemento della seconda entità e viceversa.

Nota.

Il primo valore in parentesi indica la quantità minima di corrispondenze. In questo caso lo zero indica che non tutte le istanze della entità MALATTIE parteciperanno alla relazione. Questa condizione si chiama partecipazione parziale.

Schema logico: relazionale

medicine (id, nome, tipo, costo, dataDiScadenza)

malattie (id, descrizione)

medicinePerMalattie (id, idMedicina, idMalattia)

Nota.

Il mapping di una associazione N:N tra le entità A e B avviene creando una relazione che ha le due chiavi esterne su entrambe le entità A e B.

Nota.

La chiave primaria di questa relazione può essere la solita chiave fittizia id ma anche la congiunzione delle due chiavi esterne.

Esempio di istanza

medicine
id nome tipo costo dataDiScadenza
1 Ribex tosse sciroppo 12.00 '2016-10-25'
2 Zepelin compresse 6.00 '2018-9-10'
3 Moment compresse 7.50 '2016-6-1'

malattie
id descrizione
4 Mal di testa
5 Raffreddore
6 Tosse
7 Dolori articolari
8 Pediculosi

medicinePerMalattie
id idMedicina idMalattia
9 1 6
10 2 4
11 2 7
12 3 4
13 3 7

Interrogazione - 1

Mostrare il nome e la data di scadenza di tutte le compresse.

select nome, dataDiScadenza
from medicine
where (tipo = 'compresse')
nome dataDiScadenza
Zepelin '2018-9-10'
Moment '2016-6-1'

Interrogazione - 2

Mostrare il nome e la data di scadenza di tutte le medicine da usare contro il mal di testa.

select nome, dataDiScadenza
from medicine as me, malattie as ma, medicinePerMalattie as mpm
where
    (ma.descrizione = 'Mal di testa') and
    (ma.id = mpm.idMalattia) and
    (mpm.idMedicina = me.id)
nome dataDiScadenza
Zepelin '2018-9-10'
Moment '2016-6-1'

Interrogazione - 3

Mostrare un elenco di tutte le malattie in ordine alfabetico con accanto il medicinale disponibile e la sua data di scadenza.

select descrizione, nome, dataDiScadenza
from medicine as me, malattie as ma, medicinePerMalattie as mpm
where (ma.id = mpm.idMalattia) and (mpm.idMedicina = me.id)
order by descrizione
descrizione nome dataDiScadenza
Dolori articolari Zepelin '2018-9-10'
Dolori articolari Moment '2016-6-1'
Mal di testa Zepelin '2018-9-10'
Mal di testa Moment '2016-6-1'
Tosse Ribex tosse '2016-10-25'

Interrogazione - 4

Mostrare un elenco di tutte le medicine la cui data di scadenza è superiore a una certa data (supponiamo 01/01/2017) con il relativo costo.

select nome, costo
from medicine
where (dataDiScadenza > '2017-01-01')
nome costo
Zepelin 6.00

Interrogazione - 5

Mostrare il nome e la data di scadenza di tutti gli sciroppi e di tutte le supposte da usare contro il mal di testa. Vogliamo l'elenco in ordine alfabetico e vogliamo solo i medicinali che scadono prima del 2023.

select me.nome, me.dataDiScadenza
from medicine as me, malattie as ma, medicinePerMalattie as mpm
where
    (ma.descrizione = 'Mal di testa') and
    (ma.id = mpm.idMalattia) and
    (mpm.idMedicina = me.id) and
    ( (m.tipo = 'sciroppo') or (m.tipo = 'supposte'))
order by
    (me.nome)
nome dataDiScadenza
Ribex Tosse '2016-10-25'

Challenge

Challenge - 1

Realizzare una interrogazione che produca questo risultato.

malattie
Dolori articolari
Mal di testa
Pediculosi
Raffreddore
Tosse

Challenge - 2

Realizzare una interrogazione che produca questo risultato.

formato
compresse
sciroppo

Challenge - 3

Realizzare una interrogazione che produca questo risultato.

medicina malattie
Moment Dolori articolari
Moment Mal di testa
Ribex tosse Tosse
Zepelin Dolori articolari
Zepelin Mal di testa

Challenge - 4

Se volessimo conservare informazioni relative alla casa farmaceutica dei medicinali, in che modo cambierebbero il diagramma ER e lo schema relazionale?

Challenge - 5

Se volessimo conservare informazioni relative alla farmacia (nome e ubicazione) dove sono stati acquistati i farmaci, in che modo cambierebbero il diagramma ER e lo schema relazionale?