giovedì 9 settembre 2010

Una rubrica con... MySQL

Avete mai pensato di implementare una rubrica telefonica? Si possono usare molte tecnologie e linguaggi di programmazione. Una soluzione sicuramente elegante e professionale consiste nell'adozione di un database e lasciare al linguaggio di programmazione l'interazione fra utente e dati. Con MySQL possiamo realizzare in pochi passi il database per la nostra applicazione, se questa cosa vi interessa vi dico come procedere.
La rubrica che ho in mente è abbastanza semplice, deve contenere il nome e il cognome dei nostri contatti e l'eventuale numero di telefono. Un contatto può non avere necessariamente un numero di telefono. Una domanda che merita fin dall'inizio una risposta è la seguente: quanti numeri di telefono può avere un contatto? La risposta a questo quesito condiziona la progettazione del database. Se la cardinalità del numero di telefono di un contatto è fissata ad 1 non si hanno molti problemi, un unica tabella raccoglierà: nome, cognome e numero di telefono. Sappiamo bene che questa limitazione non ci rende felici. Ecco allora che modelleremo il database per contenere zero o più numeri telefonici (contenti?).
Nello schema che vi propongo ho individuato due entità: contatti e rubrica. Nell'entità contatti ho messo gli attributi nome e cognome. In rubrica, invece, ho il solo attributo telefono. Un numero di telefono può essere assegnato ad uno o più contatti.


Nell'entità contatti ho poi introdotto la chiave primaria id, in rubrica ho scelto come chiave primaria l'attributo telefono. Queste sono le istruzioni SQL per la descrizione del database:
CREATE DATABASE rubrica_telefonica;
USE rubrica_telefonica;
CREATE TABLE contatti (
 id INT(3) NOT NULL AUTO_INCREMENT,
 nome VARCHAR(30) NOT NULL,
 cognome VARCHAR(30) NOT NULL,
 UNIQUE (nome, cognome),
 PRIMARY KEY (id)
);

CREATE TABLE rubrica (
 telefono VARCHAR(30) NOT NULL,
 contatto INT(3) NOT NULL REFERENCES contatti(id),
 PRIMARY KEY (telefono,contatto)
);
Ho poi aggiunto i permessi per permettere a un utente l'interazione con il database e le tabelle appena create:
GRANT INSERT,SELECT
ON rubrica_telefonica.*
TO php_user IDENTIFIED BY 'php_user';
Osservazione: grazie alla riga UNIQUE (nome, cognome) non potranno esistere occorrenze dell'entità contatti che hanno lo stesso attributo nome e cognome. Potranno tuttavia esistere contatti con lo stesso nome o cognome. Il database per lo nostra applicazione è pronto per essere usato. Vi riporto, per comodità, qualche utile query per l'estrazione dei dati:

Ricerca 1: per nome
SELECT telefono, cognome
FROM rubrica R JOIN contatti C ON R.contatto=C.id
WHERE C.nome='Luca'
Ricerca 2: per cognome
SELECT telefono, nome
FROM rubrica R JOIN contatti C ON R.contatto=C.id
WHERE C.cognome='Petrosino'
Ricerca 3: per nome e cognome
SELECT telefono, cognome
FROM rubrica R JOIN contatti C ON R.contatto=C.id
WHERE C.nome='Luca' AND C.cognome='Petrosino'
Ricerca 4: per numero
SELECT nome, cognome
FROM rubrica R JOIN contatti C ON R.contatto=C.id
WHERE R.telefono='0123456789'
Ricerca 5: il numero finisce per... 789
SELECT nome, cognome, telefono
FROM rubrica R JOIN contatti C ON R.contatto=C.id
WHERE R.telefono LIKE "%789"
Ricerca 6: il numero inizia per... 012
SELECT nome, cognome, telefono
FROM rubrica R JOIN contatti C ON R.contatto=C.id
WHERE R.telefono LIKE "012%"
Ricerca 7: contiene il numero... 345
SELECT nome, cognome, telefono
FROM rubrica R JOIN contatti C ON R.contatto=C.id
WHERE R.telefono LIKE "%012%"

Nessun commento:

Posta un commento