Analisi di Basi di dati Studio di un caso: Azienda Telefonica Progettazione concettuale anno trimestre mese regione provincia città cliente Attività cliente TempoUtilizzoAdsl SpesaAdsl TempoUtilizzoIsdn SpesaIsdn. servizi Adsl... Isdn status cliente nuovo cliente trasloco Sulla dimensione servizi ho un campo per ogni servizio gestito. Tali campi (Adsl, Isdn, ecc.) possono assumere uno dei seguenti valori: o Attivazione (il servizio è stato attivato nel mese in corso) o Disattivazione (il servizio è stato disattivato nel mese in corso) o Si (il servizio è attivo nel mese in corso, ed era già attivo nei mesi precedenti) o No (il servizio non è attivo, e non era attivo dei mesi precedenti) Relativamente alla dimensione status cliente i campi nuovo cliente e tasloco possono assumere i valori: o Si o No Per ogni servizio gestito ho 2 misure per il fatto analizzato: o Tempo di utilizzo del servizio o Spesa associata al servizio (costo delle telefonate )
Progettazione logica TEMPO (ID_TEMPO, MESE, TRIMESTRE, ANNO); SERVIZI((ID_SERVIZI, ADSL, ISDN, Un attributo per ogni altro servizio.); STATUSCLIENTE(ID_STATUS, STATUS_CLIENTE, NUOVOCLIENTE, TASLOCO); CLIENTE(ID_CLIENTE, CITTA, PROVINCIA, REGIONE); ATTIVITA_CLIENTI(ID_TEMPO, ID_STATUS, ID_CLIENTE, ID_SERVIZI, TEMPOUTILIZZOADSL, SPESAADSL,.. Tempo di utilizzo e spesa per tutti i servizi gestiti...); Interrogazioni SQL 1. Selezionare il numero di attivazioni di linee ISDN avvenute nell anno 2005 in funzione della città in cui si trova il cliente e del mese di attivazione. Selezionare inoltre il numero totale di attivazioni di linee ISDN avvenute nell anno 2005, il numero di attivazione di linee ISDN in ogni mese del 2005 (indipendentemente dalla città) e il numero di attivazioni di linee ISDN effettuate in ogni città, sempre nell anno 2005, indipendentemente dal mese. SELECT CITTA, MESE, COUNT(*) as NumAttivazioni FROM ATTIVITA_CLIENTI F, TEMPO T, SERVIZI S, CLIENTE C AND S.ISDN='Attivazione' GROUP BY CUBE(CITTA,MESE); 2. Per l anno 2005, selezionare per ogni coppia regione, mese il numero di clienti che nel corso dello stesso mese hanno disattivato la linea ISDN e hanno attivato una linea ADSL. SELECT REGIONE, MESE, COUNT(*) as NumAttivazioniADSLDisattivazioneISDN FROM ATTIVITA_CLIENTI F, TEMPO T, SERVIZI S, CLIENTE C AND S.ISDN='Disattivazione' AND S.ADSL='Attivazione' GROUP BY REGIONE,MESE;
2.bis Variante dell interrogazione 2 in cui l interrogazione è posta a livello di trimestre anzichè di mese. Per l anno 2005, selezionare per ogni coppia regione, trimestre il numero di clienti che nel corso dello stesso trimestre hanno disattivato la linea ISDN e hanno attivato una linea ADSL. SELECT REGIONE, TRIMESTRE, COUNT(DISTINCT F.ID_CLIENTE) as NumAttivazioniADSLDisattivazioneISDN FROM ATTIVITA_CLIENTI F, TEMPO T, SERVIZI S, CLIENTE C AND S.ISDN='Disattivazione' AND EXISTS (SELECT * FROM ATTIVITA_CLIENTI F2,TEMPO T2, SERVIZI S2 WHERE F2.ID_TEMPO=T2.ID_TEMPO AND F2.ID_SERVIZI=S2.ID_SERVIZI AND S.ADSL='Attivazione' AND F2.ID_CLIENTE=F.ID_CLIENTE AND T2.TRIMESTRE=T.TRIMESTRE AND T2.ANNO=2005) GROUP BY REGIONE, TRIMESTRE; 3. Per l anno 2005, selezionare per ogni coppia regione, trimestre l incasso associato alle chiamate effettuate tramite le linee ISDN, e l incasso associato alle chiamate effettuate tramite le linee ADSL. Ordinare i risultati in funzione dell incasso totale dato dalla somma degli incassi delle due tipologie di linee (ADSL+ISDN). SELECT REGIONE, TRIMESTRE, SUM(SPESAISDN) as INCASSO_ISDN, SUM(SPESAADSL) as INCASSO_ADSL GROUP BY REGIONE,TRIMESTRE ORDER BY SUM(SPESAADSL)+SUM(SPESAISDN); 3.bis Variante dell interrogazione precedente in cui si chiede di generare anche un attributo di rank. Per l anno 2005, selezionare per ogni coppia regione, trimestre l incasso associato alle chiamate effettuate tramite le linee ISDN, l incasso associato alle chiamate effettuate tramite le linee ADSL, e il RANK dato dall incasso totale dato dalla somma degli incassi delle due tipologie di linee (ADSL+ISDN). Ordinare i risultati in funzione dell incasso totale dato dalla somma degli incassi delle due tipologie di linee (ADSL+ISDN). SELECT REGIONE, TRIMESTRE, SUM(SPESAISDN) as INCASSO_ISDN, SUM(SPESAADSL) as INCASSO_ADSL, RANK() OVER (ORDER BY SUM(SPESAADSL)+SUM(SPESAISDN)) as RANKTOTALE GROUP BY REGIONE,TRIMESTRE ORDER BY RANKTOTALE;
4. Per l anno 2005, selezionare per ogni regione gli incassi mensili e gli incassi cumulativi da inizio anno. SELECT REGIONE, MESE, SUM(SPESAADSL)+..SUM spesa per tutti i servizi presenti..+ SUM(SPESAISDN) as INCASSO, SUM(SUM(SPESAADSL)+..SUM spesa per tutti i servizi presenti..+ SUM(SPESAISDN)) OVER (PARTITION BY REGIONE ORDER BY MESE ROWS UNBOUNDED PRECEDING) as INCASSOCUMULATIVO GROUP BY REGIONE,MESE; 5. Selezionare il numero di nuovi clienti e l'incasso totale per ogni mese dell anno 2005. Ordinare i mesi in funzione dell'incasso. SELECT MESE, SUM(CASE WHEN NUOVOCLIENTE= Si THEN 1 ELSE 0 END) as NUOVICLIENTI, SUM(SPESAADSL)+..SUM spesa per tutti i servizi presenti..+ SUM(SPESAISDN) as INCASSOTOTALE FROM ATTIVITA_CLIENTI F, TEMPO T, STATUSCLIENTE ST AND F.ID_STATUS=ST.ID_STATUS GROUP BY MESE ORDER BY INCASSOTOTALE; 5.bis Variante dell interrogazione precedente in cui si chiede di generare anche un attributo di rank. Per ogni mese dell anno 2005, selezionare il numero di nuovi clienti, l'incasso totale e il RANK dato dall incasso totale. Ordinare i mesi in funzione dell'incasso. SELECT MESE, SUM(CASE WHEN NUOVOCLIENTE= Si THEN 1 ELSE 0 END) as NUOVICLIENTI, SUM(SPESAADSL+..spesa per tutti i servizi presenti..+ SPESAISDN) as INCASSOTOTALE, RANK() OVER (ORDER BY SUM(SPESAADSL+..spesa per tutti i servizi presenti..+ SPESAISDN)) as RANKTOTALE FROM ATTIVITA_CLIENTI F, TEMPO T, STATUSCLIENTE ST AND F.ID_STATUS=ST.ID_STATUS GROUP BY MESE ORDER BY RANKTOTALE;
Viste materializzate Nel peggiore dei casi la tabella dei fatti contiene una riga per ogni possibile coppia (cliente,mese). Nel corso dello stesso mese ogni cliente è associato ad un solo valore di status cliente e ad una sola configurazione di servizi. La cardinalità massima della tabella dei fatti quindi è legata solo al numero di clienti e al numero di mesi gestiti. La cardinalità massima della tabella dei fatti è la seguente: 24 x 10000000 x 1 x 1 240 x 10 6 Interrogazioni 1 Per rispondere velocemente all interrogazione 1 potrebbe essere utile definire una vista materializzata associata all interrogazione stessa: SELECT CITTA, MESE, COUNT(*) as NumAttivazioni FROM ATTIVITA_CLIENTI F, TEMPO T, SERVIZI S, CLIENTE C AND S.ISDN='Attivazione' GROUP BY CUBE(CITTA,MESE); Cardinalità massima del risultato associato alla vista materializzata - numero città x 12 + numero città + 12 + 1 Nel testo non è specificato il numero di città gestite. In funzione di tale valore potrebbe essere utile oppure no definire la vista materializzata appena descritta (differenza di almeno un ordine di grandezza tra la cardialità delle tabella dei fatti e la cardinalità della vista materializzata). Tale vista materializzata permette di rispondere velocemente esclusivamente all interrogazione 1. Interrogazioni 2 Per l interrogazione 2 valgono considerazioni simili a quelle fatte per l interrogazione 1. Anche in questo caso per rispondere velocemente all interrogazione potrebbe essere utile definire una vista materializzata associata all interrogazione stessa. Cardinalità massima del risultato associato alla vista materializzata - numero regioni x 12 Nel testo non è specificato il numero di regioni. In funzione di tale valore potrebbe essere utile oppure no definire la vista materializzata appena descritta (differenza di almeno un ordine di grandezza tra la cardialità delle tabella dei fatti e la cardinalità della vista materializzata). Tale vista materializzata permette di rispondere velocemente esclusivamente all interrogazione 2. Interrogazioni 3 e 4 Per rispondere velocemente alle interrogazioni 3 e 4 potrebbe essere utile definire una sola vista materializzata associata alla seguente interrogazione: SELECT REGIONE, MESE, TRIMESTRE, SUM(SPESAADSL),...SUM spesa per tutti i servizi presenti.., SUM(SPESAISDN) GROUP BY REGIONE, MESE, TRIMESTRE;
Cardinalità massima del risultato associato alla vista materializzata - numero regioni x 12 Nel testo non è specificato il numero di regioni. In funzione di tale valore potrebbe essere utile oppure no definire la vista materializzata appena descritta (differenza di almeno un ordine di grandezza tra la cardialità delle tabella dei fatti e la cardinalità della vista materializzata). La vista materializzata appena descritta permette di rispondere velocemente sia all interrogazione 3 sia alla 4. Interrogazioni 5 Per l interrogazione 5 valgono considerazioni simili a quelle fatte per le interrogazioni 1 e 2. Anche in questo caso per rispondere velocemente all interrogazione potrebbe essere utile definire una vista materializzata associata all interrogazione stessa. Cardinalità massima del risultato associato alla vista materializzata - 12 Questa vista materializzata è sicuramente utile per rispondere più velocemente all interrogazione 5. Tale vista materializzata, però, è utile per rispondere esclusivamente all interrogazione 5.