2001/02 - Banca del Tempo
Diagramma E/R
All'atto dell'iscrizione il socio dichiara la zona dove risiede e le categorie di prestazioni che offre
Se l'associazione ha un numero elevato di soci allora i soci dichiarano le singole prestazioni piuttosto che le categorie
Quando viene svolto un servizio si registrano i dati del socio donatore, del socio ricevitore e la prestazione (oltre che la data e le ore svolte)ZONA
- Una zona può ospitare uno o più soci
- Un socio abita in una zona
- Un socio offre la sua disponibilità per una o più prestazioni
- Un socio può prestare servizio a favore di uno più soci (svolgendo una o più prestazioni) in date diverse
- Un socio può ottenere un servizio da uno o più soci (usufruendo di una o più prestazioni) in date diverse
- Una categoria è costituita da una o più prestazioni
- Una prestazione appartiene a una categoria
- Una prestazione è offerta da uno o più soci
- Una prestazione può essere svolta da uno o più soci
- Una prestazione può essere ricevuta da uno o più soci.
Schema relazionale esteso

Lo schema relazionale differisce dai diagramma E/R (perché sono stati sviluppati in tempi diversi...)
Query
Chi può svolgere una prestazione in una zonaSELECT SOCIO.*
FROM ZONA INNER JOIN (SOCIO INNER JOIN
((CATEGORIA INNER JOIN PRESTAZIONE ON CATEGORIA.IDcategoria = PRESTAZIONE.categoriaID)
INNER JOIN SOCIO_CATEGORIA ON CATEGORIA.IDcategoria = SOCIO_CATEGORIA.categoriaID)
ON SOCIO.IDsocio = SOCIO_CATEGORIA.socioID) ON ZONA.IDzona = SOCIO.zonaID
WHERE (PRESTAZIONE.Descrizione = [Scegli la prestazione]) AND
(ZONA.Descrizione = [Scegli la zona])
FROM ZONA INNER JOIN (SOCIO INNER JOIN
((CATEGORIA INNER JOIN PRESTAZIONE ON CATEGORIA.IDcategoria = PRESTAZIONE.categoriaID)
INNER JOIN SOCIO_CATEGORIA ON CATEGORIA.IDcategoria = SOCIO_CATEGORIA.categoriaID)
ON SOCIO.IDsocio = SOCIO_CATEGORIA.socioID) ON ZONA.IDzona = SOCIO.zonaID
WHERE (PRESTAZIONE.Descrizione = [Scegli la prestazione]) AND
(ZONA.Descrizione = [Scegli la zona])
Classifica per ore ricevute
SELECT IDsocio, Nome, Cognome, Sum(Ore) AS [Ore ricevute]
FROM SOCIO INNER JOIN LAVORO ON (SOCIO.IDsocio = LAVORO.a_socioID)
GROUP BY IDsocio, Nome, Cognome
ORDER BY Sum(Ore) DESC
FROM SOCIO INNER JOIN LAVORO ON (SOCIO.IDsocio = LAVORO.a_socioID)
GROUP BY IDsocio, Nome, Cognome
ORDER BY Sum(Ore) DESC
Classifica per ore prestate
SELECT IDsocio, Nome, Cognome, Sum(Ore) AS [Ore prestate]
FROM SOCIO INNER JOIN LAVORO ON (SOCIO.IDsocio = LAVORO.da_socioID)
GROUP BY IDsocio, Nome, Cognome
ORDER BY Sum(Ore) DESC
FROM SOCIO INNER JOIN LAVORO ON (SOCIO.IDsocio = LAVORO.da_socioID)
GROUP BY IDsocio, Nome, Cognome
ORDER BY Sum(Ore) DESC
Classifica per prestazioni
SELECT IDprestazione, PRESTAZIONE.Descrizione, Sum(LAVORO.Ore) AS SommaDiOre
FROM PRESTAZIONE INNER JOIN LAVORO ON (PRESTAZIONE.IDprestazione = LAVORO.prestazioneID)
GROUP BY IDprestazione, PRESTAZIONE.Descrizione
ORDER BY Sum(LAVORO.Ore) DESC
FROM PRESTAZIONE INNER JOIN LAVORO ON (PRESTAZIONE.IDprestazione = LAVORO.prestazioneID)
GROUP BY IDprestazione, PRESTAZIONE.Descrizione
ORDER BY Sum(LAVORO.Ore) DESC
Chi ha diritto a una prestazione
SELECT SOCIO.*
FROM SOCIO
WHERE (SELECT Sum(LAVORO.Ore) AS SommaDiOreDa
FROM LAVORO
WHERE (LAVORO.da_socioID=SOCIO.IDsocio)) >
(SELECT Sum(LAVORO.Ore) AS SommaDiOreA
FROM LAVORO
WHERE (LAVORO.a_socioID=SOCIO.IDsocio))
FROM SOCIO
WHERE (SELECT Sum(LAVORO.Ore) AS SommaDiOreDa
FROM LAVORO
WHERE (LAVORO.da_socioID=SOCIO.IDsocio)) >
(SELECT Sum(LAVORO.Ore) AS SommaDiOreA
FROM LAVORO
WHERE (LAVORO.a_socioID=SOCIO.IDsocio))
Chi svolge altre attività oltre a SEGRETERIA
SELECT SOCIO.*
FROM SOCIO INNER JOIN (CATEGORIA INNER JOIN SOCIO_CATEGORIA
ON CATEGORIA.IDcategoria = SOCIO_CATEGORIA.categoriaID)
ON SOCIO.IDsocio = SOCIO_CATEGORIA.socioID
WHERE (CATEGORIA.Descrizione = "SEGRETERIA") AND
(SOCIO.IDsocio IN (SELECT SOCIO.IDsocio
FROM SOCIO INNER JOIN (CATEGORIA INNER JOIN SOCIO_CATEGORIA
ON CATEGORIA.IDcategoria = SOCIO_CATEGORIA.categoriaID)
ON (SOCIO.IDsocio = SOCIO_CATEGORIA.socioID)
WHERE (CATEGORIA.Descrizione <> "SEGRETERIA")))
FROM SOCIO INNER JOIN (CATEGORIA INNER JOIN SOCIO_CATEGORIA
ON CATEGORIA.IDcategoria = SOCIO_CATEGORIA.categoriaID)
ON SOCIO.IDsocio = SOCIO_CATEGORIA.socioID
WHERE (CATEGORIA.Descrizione = "SEGRETERIA") AND
(SOCIO.IDsocio IN (SELECT SOCIO.IDsocio
FROM SOCIO INNER JOIN (CATEGORIA INNER JOIN SOCIO_CATEGORIA
ON CATEGORIA.IDcategoria = SOCIO_CATEGORIA.categoriaID)
ON (SOCIO.IDsocio = SOCIO_CATEGORIA.socioID)
WHERE (CATEGORIA.Descrizione <> "SEGRETERIA")))