1995 – Notiziario settimanale

Il problema

Il diagramma E/R viene costruito passo passo.

Gli articoli e le lettere

1995_1ARTICOLO

  • Un articolo può essere pubblicato in un numero della rivista

NUMERO

  • Un numero della rivista contiene uno o più articoli

LETTERA

  • Una lettera è inviata da un abbonato

ABBONATO

  • Un abbonato può inviare una o più lettere

Le lettere pubblicate

1995_2Un numero settimanale contiene anche alcune lettere

ARTICOLO

  • Un articolo può essere pubblicato in un numero della rivista

NUMERO

  • Un numero della rivista contiene uno o più articoli
  • Un numero della rivista può contenere una o più lettere

LETTERA

  • Una lettera è inviata da un abbonato
  • Una lettera può essere pubblicata in un numero

ABBONATO

  • Un abbonato può inviare una o più lettere

Autore?

1995_3Anche gli articoli hanno un autore (o più di uno?)

AUTORE

  • Un autore può scrivere uno o più articoli

ARTICOLO

  • Un articolo può essere pubblicato in un numero della rivista
  • Un articolo è stato scritto da un autore

NUMERO

  • Un numero della rivista contiene uno o più articoli
  • Un numero della rivista può contenere una o più lettere

LETTERA

  • Una lettera è inviata da un abbonato
  • Una lettera può essere pubblicata in un numero

ABBONATO

  • Un abbonato può inviare una o più lettere

Ancora?

Il database potrebbe essere arricchito con ulteriori informazioni

  • Gli accessi degli abbonati agli articoli
  • Il voto, da parte dei lettori, per ogni articolo
  • Un abbonato si abbona più volte, in periodi diversi
  • Un articolo potrebbe avere più di un autore

Schema relazionale

Considera prima i diversi sottoschemi e poi riuniscili.

Gli articoli e le lettere

1995_rivista0

Query

Articoli per titolo

SELECT ARTICOLO.*
FROM   ARTICOLO
WHERE  (Titolo LIKE "*" & [Parola chiave?] & "*")

Articoli per settimana

SELECT ARTICOLO.*
FROM   ARTICOLO INNER JOIN NUMERO ON (ARTICOLO.pubblicatoIN = NUMERO.IDnumero)
WHERE  (IDnumero = [Numero rivista?])

Articoli per titolo e settimana

SELECT ARTICOLO.*
FROM   ARTICOLO INNER JOIN NUMERO ON (ARTICOLO.pubblicatoIN = NUMERO.IDnumero)
WHERE  (Titolo LIKE "*" & [Parola chiave] & "*") AND (IDnumero = [Numero rivista?])

Lettere per nome dell’autore

SELECT LETTERA.*
FROM   LETTERA INNER JOIN ABBONATO ON (LETTERA.scrittaDA = ABBONATO.IDabbonato)
WHERE  (Cognome = [Cognome abbonato?]) AND (Nome = [Nome abbonato?])

Lettere per periodo

SELECT LETTERA.*
FROM   LETTERA
WHERE  (DATA BETWEEN [Dal...] AND [Al...])

Lettere per nome e per periodo

SELECT LETTERA.*
FROM   LETTERA INNER JOIN ABBONATO ON (LETTERA.scrittaDA = ABBONATO.IDabbonato)
WHERE  (Cognome = [Cognome abbonato?]) AND
       (Nome = [Nome abbonato?]) AND
       (DATA BETWEEN [Dal...] AND [Al...])

Articoli non pubblicati

SELECT ARTICOLO.*
FROM   ARTICOLO
WHERE  (pubblicatoIN IS NULL)

Le lettere pubblicate

1995_rivista1

Query

Le lettere di un abbonato, dati nome e cognome

SELECT LETTERA.*
FROM   ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato = LETTERA.scrittaDA)
WHERE  (Cognome=[Cognome abbonato?]) AND
       (Nome=[Nome abbonato?])

Gli articoli che trattano “arte” nel titolo

SELECT *
FROM   ARTICOLO
WHERE  (Titolo LIKE "*arte*")

Gli articoli che NON trattano “arte” nel titolo

SELECT *
FROM   ARTICOLO
WHERE  (Titolo NOT LIKE "*arte*")

Gli articoli che trattano un certo TESTO nel titolo

SELECT *
FROM   ARTICOLO
WHERE  (Titolo LIKE "*" & [Testo contenuto?] & "*")

Quanti articoli in archivio?

SELECT COUNT(*)
FROM   ARTICOLO

Quanti articoli PUBBLICATI?

SELECT COUNT(pubblicatoIN)
FROM   ARTICOLO

oppure

SELECT COUNT(*)
FROM   ARTICOLO
WHERE  (pubblicatoIN IS NOT NULL)

Quante lettere ricevute in un certo periodo?

SELECT COUNT(*)
FROM   LETTERA
WHERE  (DATA BETWEEN [Dalla DATA?] AND [Alla DATA?])

Gli abbonati che hanno scritto almeno una lettera

SELECT DISTINCT ABBONATO.*
FROM   ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA)

oppure

SELECT *
FROM   ABBONATO
WHERE  IDabbonato IN (SELECT scrittaDA
                      FROM LETTERA)

Gli abbonati che hanno scritto almeno X lettere

SELECT IDabbonato, cognome, nome
FROM   ABBONATO
WHERE  IDabbonato IN (SELECT   scrittaDA
                      FROM     LETTERA
                      GROUP BY scrittaDA
                      HAVING   (COUNT(*) >= [Numero minimo lettere?]))

oppure

SELECT   IDabbonato, cognome, nome
FROM     ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA)
GROUP BY IDabbonato, cognome, nome
HAVING   (COUNT(*) >= [Numero minimo lettere?])

…, e quante

SELECT   IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere]
FROM     ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA)
GROUP BY IDabbonato, cognome, nome
HAVING   (COUNT(*) >= [Numero minimo lettere?])

Classifica per numero di lettere scritte

SELECT   IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere]
FROM     ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA)
GROUP BY IDabbonato, cognome, nome
ORDER BY COUNT(*) DESC

Classifica per numero di lettere scritte (i primi 5)

SELECT   TOP 5 IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere]
FROM     ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA)
GROUP BY IDabbonato, cognome, nome
ORDER BY COUNT(*) DESC

Classifica per numero di lettere scritte, almeno X

SELECT   IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere]
FROM     ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA)
GROUP BY IDabbonato, cognome, nome
HAVING   (COUNT(*) >= [Numero minimo lettere?])
ORDER BY COUNT(*) DESC

Finale

Schema esaustivo delle richieste?

1995_rivista2