• Non ci sono risultati.

4.9 Proof of Concept Il Database

4.9.1 Database Gestione periferiche

Questa parte del database deve contenere tutto il necessario alla gestione dei terminali. È necessario quindi che consenta di:

- definire un elenco di tipi di terminali ammessi all'invio di informazioni

- inserire dinamicamente nuovi tipi, per consentirne la gestione

- definire in quale modo vengono trasmesse informazioni dai vari tipi di terminali

È altrettanto necessario poter:

- definire un elenco di periferiche inizializzate e quindi abilitate all'invio - controllare se una determinata periferica sia già stata inizializzata o meno - inizializzare una periferica.

Queste necessità si traducono in due entità: Tipi e Periferiche_inizializzate.

L'entità Tipi deve contenere un attributo ID_Tipo di tipo contatore numerico, che si autoincrementa ogni qual volta venga aggiunto un nuovo tipo: questo campo è la chiave primaria dell'entità. Ciò significa che tramite il numero progressivo contenuto in questo campo è possibile riferirsi univocamente ad un tipo.

Tipo_periferica, invece, è l'attributo contenente la stringa di testo che identifica univocamente il tipo di periferica. È qui che viene inserito l'insieme di caratteri con il quale il rilevatore identifica il proprio tipo.

È particolarmente importante che Tipo_periferica non ammetta duplicati, in quanto, se ci fosse più di una riga che identifica lo stesso tipo, si genererebbe confusione e si rischierebbe di inizializzare più volte lo stesso terminale, non sapendo a quale terminale attribuire correttamente i dati che arrivano.

Ad esempio, se il tipo "GPS" avesse come ID_Tipo sia 1 che 47, alla richiesta di inizializzazione di una nuova periferica di tipo GPS non si saprebbe se inizializzarla con identificativo 1 o 47: si rischierebbe di averla inizializzata con entrambi, e si avrebbe confusione perché ad ogni ricezione di dati il sistema non saprebbe a quale dei due identificativi farli corrispondere.

Questa necessità di non avere duplicati, se specificata nell'ambiente di gestione tramite un controllo precedente all'inserimento di un nuovo tipo, non sarebbe stata comunque sufficientemente rispettata in quanto, considerando la possibilità di richieste concomitanti di aggiunta dello stesso tipo, il sistema avrebbe potuto segnalare più volte che il tipo non è presente e avrebbe potuto accogliere contemporaneamente più richieste di inserimento, generando dei duplicati.

Esiste invece in PostgreSQL una proprietà chiamata "UNIQUE", assegnabile ad un attributo, che consente che sia il RDBMS stesso a verificare l'unicità dei valori.

Tipo_periferica è quindi "UNIQUE".

L'ultimo attributo di questa relazione è Istruzioni_inizializzazione.

In esso viene salvato l'elenco degli attributi necessari ad una relazione per contenere i dati inviati da un terminale del tipo in questione.

Ad esempio, per il tipo "GPS", Istruzioni_inizializzazione potrà avere come valore "a int, b int, c int, d int" che sta a specificare quattro attributi che possono contenere dei numeri interi (sufficienti a specificare una posizione GPS tridimensionale).

È molto importante che i valori di questo attributo vengano scritti con la seguente sintassi: nome_attributo1 spazio tipo_attributo1 virgola spazio nome_attributo2 etc, fino all'ennesimo ed ultimo attributo senza virgola e spazio finali.

Questo poiché il contenuto dell'attributo Istruzioni_inizializzazione viene utilizzato come parte di un comando SQL per creare un'entità del database, e, se il valore non viene inserito correttamente, la tabella non potrà essere creata, o non sarà adatta a contenere le informazioni che verranno inviate.

La relazione Periferiche_inizializzate deve contenere un attributo ID_Periferica di tipo contatore numerico, che si autoincrementi ad ogni inizializzazione di una nuova periferica. Questo campo è la chiave primaria dell'entità: ciò significa che, tramite il numero progressivo contenuto in questo campo, è possibile riferirsi univocamente ad uno dei terminali presenti su una delle unità della flotta.

È necessario inoltre che contenga un attributo ID_Tipo_riferimento che riporti lo stesso numero utilizzato nella tabella Tipi per indicare il tipo della periferica in oggetto.

Ad esempio, se è stato inserito il Tipo "GPS" e gli è stato assegnato in ID_Tipo il numero progressivo 25, tutte le periferiche di tipo "GPS" che verranno inizializzate riporteranno 25 in ID_Tipo_riferimento.

Possiamo quindi affermare che questo attributo rappresenta la chiave esterna collegata all'entità Tipi.

L'ultimo attributo della tabella è Periferica_seriale. In esso viene memorizzata una stringa di caratteri che riporta il numero seriale della periferica. Per evitare duplicati è necessario controllare che non esistano due periferiche inizializzate aventi lo stesso ID_Tipo_riferimento e anche il medesimo Periferica_seriale.

È infatti impossibile che esistano due periferiche del medesimo tipo e con uguale seriale (teoricamente è assai improbabile che esistano due periferiche con lo stesso seriale anche senza coinvolgere il tipo, però, considerando le ampie possibilità di espansione del database e il numero e l’eterogeneità di terminali con i quali si potrà avere a che fare, questa eventualità è stata in ogni caso prevista e valutata).

La coppia ID_Tipo_riferimento e Periferica_seriale è quindi “UNIQUE”.

Quando si assegna questa proprietà ad una coppia di attributi, ciò significa che è possibile per ognuno dei due avere dei duplicati, ma non è possibile che esistano due tuple della tabella contenenti lo stesso valore per un attributo e che abbiano, nel contempo, un altro valore comune per l'altro attributo.

La relazione che lega queste due entità è, come esplicato, tra l'attributo ID_Tipo di Tipi e l'attributo ID_Tipo_riferimento di Periferiche_inizializzate, ed è di tipo uno a molti. La cardinalità dalla parte di Tipi è uno, mentre la cardinalità dalla parte di Periferiche_inizializzate è n. Ciò significa che ad ogni tipo di periferica possono corrispondere n periferiche inizializzate.

Di seguito nella Figura 4.5 è possibile vedere una rappresentazione grafica di questa parte del database.

Figura 4.5: Database - Relazioni tabelle Tipi e Periferiche_inizializzate

A titolo di esempio il codice utilizzato per la creazione delle due tabelle è il seguente:

CREATE TABLE Tipi ( ID_Tipo SERIAL PRIMARY KEY,

Tipo_periferica varchar(20) UNIQUE, Istruzioni_inizializzazione varchar);

CREATE TABLE Periferiche_inizializzate ( ID_Periferica SERIAL PRIMARY KEY, ID_Tipo_riferimento int REFERENCES Tipi (ID_Tipo), Periferica_seriale varchar(40),