di: Ermanno Ancona 10 Febbraio 2005
In questo articolo vedremo come sia possibile ottimizzare una tabella di database sfruttando, nella gestione dei dati memorizzati, le operazioni tra numeri binari. Per tranquillizzare quanti alle parole "numeri binari" siano tentati di abbandonare queste pagine, anticiperò che la trattazione sarà sia teorica che pratica. Inoltre l'applicazione dei concetti esposti risulterà molto semplice... tanto da poter dimenticare, dopo poco, la teoria su cui si poggia.
Immaginiamo di voler raccogliere le preferenze sportive dei nostri utenti fornendo loro la possibilità di scegliere una o più opzioni tra calcio, basket, tennis, sci e volley. La soluzione più comune consiste nel predisporre una tabella con tanti campi quante sono le possibili scelte. Tali campi funzioneranno da flag, ovvero saranno impostati a vero o falso a seconda che l'utente esprima o meno una preferenza per questa o quella disciplina sportiva. Un simile approccio risulta per alcuni aspetti poco flessibile e difficilmente scalabile. Ogniqualvolta si decida di ampliare il numero di opzioni disponibili si dovrà aggiungere un nuovo campo.
Ma, a pensarci bene, un numero intero non è altro che una serie di bit impostati a 0 o 1, quindi, una perfetta sequenza di flag adatta a memorizzare le informazioni desiderate. Sulla base di quest'idea potremmo sostituire i cinque campi previsti con un unico campo numerico intero. Chiaramente non dovrà risultare eccessivamente complicato manipolare i bit altrimenti pagheremmo l'ottimizzazione del database con un maggior appesantimento del codice PHP.
Per meglio inquadrare il discorso partiamo dalle basi. Come si è detto nel sistema binario un numero intero viene rappresentato mediante una sequenza di cifre (bit) che possono assumere solo i valori 1 o 0. 00000011 è un esempio di numero binario. In questo tipo di notazione la posizione delle cifre viene numerata da destra a sinistra a partire da zero. Il primo bit, quello di posizione zero, viene detto meno significativo mentre l'ultimo, quello più a sinistra, si definisce più significativo. La tabella seguente presenta gli elementi essenziali della rappresentazione binaria.
| posizione | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| potenza decimale | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
| valore decimale | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
In base allo schema proposto 00000011 corrisponde al numero decimale 3, infatti sono posti a 1 solo i bit di posizione zero e uno, con un semplice calcolo si ottiene (21 + 20) = (2 + 1) = 3; analogamente 00000100 corrisponde a 4 infatti l'unico bit posto a 1 è quello di posizione due, da cui 22= 4 e così via.
Torniamo al nostro esempio e cominciamo con l'assegnare un valore numerico a ciascuna opzione secondo il seguente schema:
| calcio: | 1 |
| basket: | 2 |
| tennis: | 4 |
| sci: | 8 |
| volley: | 16 |
che corrisponde in termini di bit a:
| calcio: | 00000001 |
| basket: | 00000010 |
| tennis: | 00000100 |
| sci: | 00001000 |
| volley: | 00010000 |
Come si può notare assegnando tali valori impostiamo ad 1 uno solo dei bit della sequenza, ovvero impostiamo il famoso flag. Per quanto riguarda la tabella di database, riferendoci a MySQL, potremo utilizzare un campo tinyint unsigned per memorizzare le preferenze degli utenti. Questo ci garantisce un range di valori da 0 a 255. Se prevedete un numero maggiore di opzioni utilizzate un campo intero più grande.
Per semplicità di esposizione creiamo un array corrispondente alle diverse discipline sportive. In una situazione reale sarà più comune estrarli mediante una query da una tabella del database destinata a contenere tali valori in modo che siano facilmente amministrabili.
<?php
$choice = array(
'calcio' => 1,
'basket' => 2,
'tennis' => 4,
'sci' => 8,
'volley' => 16
);
?>
Vediamo di seguito le principali operazioni con cui dovremo confrontarci adottando una simile soluzione.
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |