Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Mysql : come gestire opzioni numeriche non esclusive

Ha fatto scalpore la vicenda di Atef Abu Bilal, calciatore palestinese squalificato per... 99 anni per via sia di una irregolarità nel tesseramento, sia di un bug nel software. Un bug che nasce da esigenze molto frequenti nei software che ci troviamo a sviluppare tutti i giorni

Mysql

Atef Abu Bilal è un calciatore palestinese di 30 anni, relativamente famoso in patria visto che ha giocato anche in nazionale, entrato in questi giorni nel gusiness dei primati per via di una maxi squalifica che lo terrà lontano dai campi di gioco fino a quando compirà 129 anni .

Il calciatore infatti è stato tesserato contemporaneamente  dallo Segev Shalom, squadra di quinta divisione in Israele, e dall'Al Khaleek, campionato palestinese. La federazione israeliana intendeva radiare a vita il giocatore ma il software non consentiva questa opzione e così si è ovviato con una squalifica ridotta, si fa per dire, al massimo della pena inseribile nel programma: 99 anni.

Questo bug non è un caso isolato, spesso nei nostri sofware abbiamo a che fare con situazioni "ibride" che prevedono:

  • l'inserimento di un valore numerico
  • OPPURE un'altra opzione

Nel caso della federazione israeliana, il software prevedeva evidentemente una sola opzione numerica per la gestione delle squalifiche ma non consentiva di gestire l'eccezione (in questo caso,  la squalifica senza limite, a vita).
Come venir fuori da situazioni del genere?
Una soluzione può essere quella di aggiungere, nella nostra tabella, un flag. Nel caso di una tabella "squalifiche", la base dati potrà assumere una struttura di questo tipo:

squalifica_id //chiave auto-increment
giocatore_id //id della tabella "giocatori"
squalifica_illimitata //campo enum: true/false
squalifica_mesi //campo numerico
squalifica_data_inizio //campo data

Se il campo "squalifica_illimitata" assume valore true, il campo squalifica_mesi deve assumere -attraverso un controllo via codice php- un valore nullo o pari a zero. O comunque, il software deve dar per scontato che se il campo è true, tutto il resto va ignorato.

Un'altra soluzione può essere quella di rendere il campo "squalifica_mesi" di tipo "signed": in questo modo possiamo assegnare valore "-1" se la squalifica è illimitata, altrimenti un valore superiore a zero se va considerato un dato temporale. Il software dovrà solo eseguire un controllo sull'importo numerico (if valore == -1, "squalifica a vita") senza considerare altri campi.

Ricordiamo però che un valore signed dimezza i valori assegnabili ad un campo. Un Tinyint unsigned può contenere 256 valori (0-255), signed arriva solo 127 valori positivi (-127 / 127). Per 99 anni di squalifica, sarebbero stati comunque sufficienti.