Corso PHP: 24.2 – Organizzare un database MySQL

24.2 Organizzare un database MySQL.

In questa sede tralasciamo i consigli sulla “best practice” nella costruzione di un database e ci concentriamo solamente sulle operazioni da compiere per la costruzione di un database basandoci su un caso pratico, se pur molto semplificato.

Inoltre come strumento tecnico useremo PHPMyAdmin messo a disposizione sul nostro computer da xampp (vedi quanto descritto al cap. 2 di questo corso).

Supponiamo quindi di dover costruire un database per un applicazione di gestione degli ordini cliente.

Il nostro database avrà bisogno di diverse tabelle:

  • Clienti: dove inseriremo tutte le informazioni anagrafiche dei nostri clienti
  • Testate ordini: dove memorizzeremo le informazioni relative a ciascun ordine con esclusione dei prodotti ordinati, che non sapendo quanti possano essere andranno memorizzati uno per riga e di conseguenza in una tabella a parte.
  • Dettagli ordini: dove inseriremo tutti i prodotti ordinati per ciascun ordine.
  • Prodotti: i prodotti a magazzino con le informazioni di prodotto inclusi prezzo di vendita, costo, disponibilità di magazzino ecc.
  • Fatture: dove inseriremo tutti gli ordini già fatturati con i relativi dati di fattura.

Per semplicità di esposizione ci fermiamo qui alle tabelle essenziali. Per lo stesso motivo anche le informazioni che prevederemo in ciascuna tabella saranno ridotte all’osso, giusto quanto serve per analizzare la dinamica di costruzione del database, i tipi dei campi, le relazioni tra le tabelle e gli indici.

Innanzitutto stabiliamo quali informazioni dovremo gestire nelle diverse tabelle. Incominciamo con la tabella Clienti dove inseriremo le seguenti informazioni:

CLIENTI
Codice cliente
Ragione sociale
Partita IVA
Indirizzo
Città
Provincia
CAP
Stato
Telefono
email

Prima di proseguire con la definizione delle altre tabelle, passiamo a creare il database con PHPMyAdmin e quindi a creare la tabella Clienti all’interno del nostro DB.

Apriamo quindi PHPMyAdmin e si presenterà una schermata come quella mostrata in figura:

Creazione Database MySQL
Creazione Database MySQL

Clicchiamo su New nella barra laterale sinistra e si presenterà la schermata successiva dove nei due campi ‘Nome Database’ e ‘Codifica Caratteri’ inseriremo ‘gestione_ordini’ come nome del nostro database e ‘utf8_general_ci’ come codifica. La codifica scelta dipende dal fatto che la lingua italiana richiede anche caratteri accentati non presenti nella codifica ISO.

Creazione Database MySQL (2)
Creazione Database MySQL (2)

A questo punto il nostro database è stato creato e vedremo il suo nome nella barra laterale sinistra. Cliccando sul nome apparirà la schermata successiva che ci consentirà di inserire il nome della nuova tabella. La schermata proporrà anche un numero di campi di default che può essere corretto qui, ma non è essenziale perché ovviamente questo potrà essere fatto anche successivamente in qualsiasi momento.

Creazione tabella di database MySQL
Creazione tabella di database MySQL

Inseriamo ‘clienti’ nel campo ‘Nome tabella’ e 11 nel campo ‘Numero dei campi’. Come avrete notato ho indicato come numero il reale numero dei campi previsti (10) + 1; questo perché è buona norma prevedere come primo campo un numeratore dei record che verrà gestito da MySQL e che fungerà da chiave univoca principale.

A questo punto saremo pronti ad inserire tutti i campi della nostra prima tabella nella schermata successiva che si presenterà come in figura:

Inserimento campi di tabella in DB MySQL
Inserimento campi di tabella in DB MySQL

In ciascuna riga inseriremo il nome del campo, il tipo, la lunghezza (ove necessario) e, a discrezione gli altri campi che vedete in figura (non obbligatori).

Prima di procedere all’inserimento dei nostri campi bisogna però chiarire i concetti fondamentali relativi ai tipi di campi. Nelle tabelle qui sotto riepiloghiamo i diversi tipi di dati in modo sintetico:

 

Numeri Interi
Tipo Intervallo di valori Solo se positivi (UNSIGNED)
TINYINT da -128 a +127 da 0 a 255
BOOLEAN Sinonimo di TINYINT Sinonimo di TINYINT
SMALLINT da -32768 a +32767 da 0 a 65535
MEDIUMINT da -8388608 a +8388608 da 0 a 16777215
INT da -2147483648 a +2147483647 da 0 a 4294967295
BIGINT da -9223372036854775808 a +9223372036854775807 da 0 a 18446744073709550615
SERIAL Sinonimo di BIGINT Sinonimo di BIGINT
 Numeri decimali
Tipo Formato e precisione Note
FLOAT N, D – singola precisione (4 bytes) N=numero totale di cifre-D=decimali
DOUBLE N, D – doppia precisione (8 bytes) N=numero totale di cifre-D=decimali
REAL N, D – doppia precisione (8 bytes) Sinonimo di DOUBLE
DECIMAL N, D come double N=numero totale di cifre-D=decimali
Stringhe
Tipo Lunghezza richiesta Dimensione massima
CHAR(n) SI 255 caratteri
BINARY SI 255 caratteri
VARCHAR(n) SI 65535 caratteri
VARBINARY SI 65535 caratteri
TINYTEXT NO 255 caratteri
TINYBLOB NO 255 caratteri
TEXT NO 65535 caratteri
BLOB NO 65535 caratteri
MEDIUMTEXT NO 16.777.215 caratteri
MEDIUMBLOB NO 16.777.215 caratteri
LONGTEXT NO 4,294,967,295 caratteri
LONGBLOB NO 4,294,967,295 caratteri
Date
Tipo Formato Validità
DATETIME AAAA-MM-GG HH:MM:SS Da 1000-01-01 00:00:00.000000 a
9999-12-31 23:59:59.999999
DATE AAAA-MM-GG Da 1000-01-01 a 9999-12-31
TIME HH:MM:SS Da -838:59:59 a 838:59:59
YEAR AAAA Da 1901 a 2155
TIMESTAMP AAAA-MM-GG HH:MM:SS Da 1970-01-01 00:00:01.000000 a
2038-01-19 03:14:07.999999

 

Vediamo di aggiungere qualche nota a quanto sintetizzato in tabella.

  1. Campi numerici interi: è incluso tra questi il campo BOOLEAN vale a dire che può assumere i valori logici di VERO o FALSO. E’ un sinonimo di TINYINT in quanto in PHP, così come in C ed in altri linguaggi, i valori di vero e falso sono rappresentati dalle cifre 0 (FALSE) e ≠0 (TRUE).
  2. Campi numerici decimali:
    • N sta, come detto per numero totale delle cifre e D per numero di decimali. Ad esempio il numero 451.325987 richiede un campo definito come 9,6.
      il punto decimale e l’eventuale segno non vengono conteggiati nel totale.
    • avrete notato che il campo REAL è definito ‘sinonimo di DOUBLE’, mentre DECIMAL è indicato con lo stesso formato di DOUBLE, ma non è un sinonimo. Questo perché il comportamento è leggermente differente. Spieghiamo con un esempio: se dividete il numero 1, contenuto in un campo DOUBLE, per tre mettendo il risultato in 3 campi differenti e poi sommate questi 3 campi otterrete 0.9999999999 (il numero di decimali dipende dal fatto che sia stato limitato o no nella definizione del campo). Se fate la stessa operazione con un campo DECIMAL otterrete 1. Essendo la somma di ⅓ + ⅓ + ⅓ sembrerebbe logico ottenere 3/3 cioè 1, ma il primo risultato è in realtà quello esatto se si sommano i 3 campi che sono di per sé troncati e che quindi rappresentano un numero inferiore ad ⅓. La scelta di un tipo di campo rispetto all’altro sarà quindi basata sul tipo di applicazione (finanziaria o matematica).
  3. Stringhe:
    • La differenza tra CHAR e VARCHAR non è solamente la lunghezza massima del campo come si evince dalla tabella. CHAR è un campo a lunghezza fissa e quindi la colonna avrà quella dimensione in tutte le righe della tabella, mentre VARCHAR è a lunghezza variabile e quindi la colonna avrà la dimensione del campo più lungo della colonna. In questo caso la dimensione indicata si intende come massima.
    • BINARY e VARBINARY si comportano come CHAR e VARCHAR con la sola differenza che contengono stringhe binarie.
    • I 4 campi di testo TINYTEXT, TEXT, MEDIUMTEXT e LONGTEXT si comportano esattamente come i corrispondenti TINYBLOB, BLOB, MEDIUMBLOB e LONGBLOB con la sola differenza che questi ultimi contengono stringhe binarie, mentre i campi TEXT stringhe alfanumeriche non binarie.

 

Nella prossima lezione continueremo con la nostra applicazione di esempio iniziando con la definizione delle tabelle di database.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.