I vincoli interrelazionali più diffusi e significativi so i vincoli di integrità referenziale. In SQL per la loro definizione si usa l’apposito vincolo di foreign key, ovvero chiave esterna. Questo vincolo crea un legame tra i valori di un attributo della tabella su cui è definito (Tabella interna) e i valori di un’attributo di un’altra tabbella (Tabella esterna). Il vincolo impone che per ogni riga della tabella il valore dell’attributo specificate, se diverso dal valore nullo, sia presente nelle righe ella tabella esterna tra i valori del corrispondente attributo. L’unico requisito che la tabella impone è il vincolo unique in fatti tipicamente l’attributo della tabella esterna cui si fa riferimento rappresenta in effetti la chiave primaria della tabella. Se c’è un solo attributo coinvolto si può usare il costrutto sintattico references, con il quale si specifica che la tabella esterna e l’attributo della tabella esterna al quale l’attributo in questione deve essere legato.
Es:

create table Impiegato (
Matricola char ( 6 ) primary key,
Nome varchar ( 20 ) not null,
Cognome varchar ( 20 ) not null,
Dipart varchar ( 15 )
reference Dipartimento ( NomeDip ),
Ufficio numeric ( 13 ),
Stipendio numeric ( 9 ) default 0,
unique ( Cognome, Nome )
)

Il vincolo impone che l’attributo Dipart della tabella Impiegato possa assumere solo uno dei valori che le riche della tabella Dipartimento possiedono per l’attributo NomeDip.

Quando il legame invece è rappresentato da un’insieme di attributi, fa uso invece del costrutto foreign key, posto al termine della definizione degli attributi.
Es: Se si volesse prendere la tabella di prima e imporre che gli attributi Nome e Cognome debbano comparire in una tabella anagrafica, si potrebbe aggiungere il vincolo

foreing key ( Nome, Cognome )
reference Anagrafica ( Nome , Cognome )

Sia nella definizione dei domini sia nella definizione delle tabelle è possibile definire dei vincoli, ovvero delle propietà che devono essere verificate da ogni istanza nella base di dati. I più semplici vinconli intrarelazionali sono i vincoli not null, unique e primary key.

Not Null

Il vincolo not null indica che il valore nullo non è ammesso come valore dell’attributo; in tal caso, l’attributo deve sempre essere specificato, tipicamente in fase d’inserimento. Se all’attributo però associato un valore di default diverso dal valore nullo, allora diventa possibile effetuare l’insermiento anche senza fornire un valore per l’attributo , in quanto all’attributo viene automanticamente assegnato il valore di default. Il vincolo viene specificato facendo seguire alla defiizione dell’attributo la dichiarazione not null.

Es:

Cognome varchar ( 20 ) not null

Unique

Un vincolo unique si applica a un attributo o un insieme di attributi di una tabella e impone che i valori dell’attributo siano una (super)chiave, cioè righe differenti della tabella non possono avere gli stessi valori; viene fatta un’eccezione per il valore nullo, il quale può comparire su diverse righe senza violare il vincolo, in quanto si presume che i valori nulli siano tutti diversi fra di loro.
La defefinizione di questo vincolo può avvenire in due modi: la prima alternativa può essere usata unicamente quando bisogna definire il vincolo su un solo attributo.
Sintassi:

unique ( Attributo { , Attributo } )

Es:

Nome varchar ( 20 ) not null,
Cognome varchar ( 20 ) not null,
unique ( Cognome, Nome )

In questo caso, si impone che non ci siano due righe che abbiano uguali sia il Nome che il Cognome.

Es:

Nome varchar ( 20 ) not null unique,
Cognome varchar ( 20 ) not null unique

In questo caso più restrittivo, si ha una violazione se nelle righe compaiono più di una volta lo stesso nome o lo stesso cognome.

Primary Key

E’ di norma necessario specificare per ogni relazione la chiave primaria, il più importante tra gli identificatori della relazione. SQL permette così di specificare il vincolo primary key una sola volta per tabella. Come il vincolo unique, il vincolo primary key può essere definito direttamente su di un singolo attributo, oppure essere definito elencando più attributi che costituiscono l’identificatore. Gli attributi che fanno parte della chiave primaria non possono assumere il valore nullo; pertanto la definizione di primary key implica per tutti gli attributi della chiave primaria di una definizione not null, che può essere omessa.

Es: Per esempio , la definizione seguente impone che la coppia di attributi Nome e Cognome costituiscano la chiave primaria

Nome varchar ( 20 ),
Cognome varchar ( 20 ),
primary key ( Cognome, Nome )

Nella definizione delle tabelle si può far riferimento ai domini predefiniti del, linguaggio o a domini definiti dall’utente a partire dai domini predefiniti. Partendo dai domini predefiniti è possibile costruire nuovi domini tramite la primitiva create domain:

create domain NomeDominio as TipoDiDato [ ValoreDiDefault ] [ Vincolo ]

Un dominio è così caratterizato dal propio nome, da un dominio elementare (che può essere predefinito o definito dall’utente in precedenza), da un eventuale valore di default, e infine da un insieme di vincoli (eventualmente vuoto) che rappresenta un insieme di condizioni che devono essere rispettate dai valori del dominio. La dichiarazione di nuovi domini permette di associare un insieme di vincoli a un nome di dominio, il che è importante quando per esempio si deve ripetere la stessa definizione di attributo nell’ambito di diverse tabelle. Definendo un dominio apposito si rende la definizione più facile modificabile; se si vuole modificare la definizione di un insieme di attributi con lo stesso dominio (in modo partcolare il valore di default e i vincoli), risulta sufficiente modificare la definizione del dominio e la modifica si applicherà a tutte le tabelle in cui il dominio viene usato.

Una tabella SQL è costituita da una collezione ordinata di attributi e da un insieme (eventualmente vuoto) di vincoli. La sintassi per la definizione di tabelle è:

create table NomeTabella
( NomeAttributo Dominio [ ValoreDiDefault ] [ Vincoli ]
{ , NomeAttributo Dominio [ ValoreDiDefault ] [ Vincoli ] }
AltriVincoli
)

Es: Lo schema della Tabbella Dipartimento viene per esempio definito tramite la seguente istruzione SQL.

create table Dipartimento
( Nome varchar (20) primary key ,
Indirizzo varchar (50) ,
Città varchar (20)
)

La tabella possiede tre attributi di tipo stringa di caratteri e l’attributo Nome che costituisce la chiave primaria della tabella. Osserviamo che, come avviene normalmente nei linguaggi di programmazione, una qualsiasi sequenza di spazi e di caratteri di fine linea è equivalente a un singolo spazio; ciò deve essere sfruttato per aumentare la leggibilità dei comandi SQL, usando strutture allineate come nel comando visto sopra.

SQL consente la definizione di uno schema di base di dati come collezione di oggetti (tabbelle, domini, viste ecc..). Uno schema viene definito dalla seguente sintassi:

create schema [ NomeSchema ]  [ [ authorization ] Autorizzazione ] { DefElementoSchema }

Autorizzazione rappresenta il nome dell’utente dpropietario dello schema: se il termine viene omesso, si assume che il propietario sia l’utente che ha lanciato il comando.

Non è necessario che la definizione di tutti i componenti avvenga contemporaneamente alla creazione dello schema, ma può anzi avvenire in più fasi successive.

Default: Valore assunto da un attributo in assenza di specificazione

Default < Generic | User | Null >

Generic è un valore scelto (purchè nel dominio), User è l’ID dell’utente che inserisce l’update, Null è il default generico.

SQL (Esse-Qu-Elle) o (Se-Qu-El) da a disposizione varie tipi di famiglie.

Caratteri

Il dominio character permette di rappresentare singoli caratteri oppure stringhe.
La lunghezza delle stringhe può essere fissa o variabile. Per lunghezza variabile si intende la lunghezza massima. Per ogni schema si può definire la famiglia di caratteri di default.

La sintassi:

character [ varying ] [ ( lunghezza ) ]
[ character set NomeFamigliaCaratteri ]

Es: Se vogliamo definire una stringa di 20 caratteri e con un set di caratteri appartenente alla famiglia “Greek” dobbiamo fare.

character (20) character set Greek

Es2: Se vogliamo invece definire una stringa di massimo 100 caratteri e con un set di caratteri appartenente alla famiglia “Latin” dobbiamo fare.

character varying (100) character set Latin.

Inoltre sono implementate in SQL delle abbreviazioni per questi domini.

  • char =  character
  • varchar = character varying

Tipi Numerici Esatti

Questa famiglia contiene i domini che permettono di rappresentare i valori esatti, interi o con una parte decimale di lunghezza prefissata. I tipi numerici esatti messi a disposizione da SQL sono:

  • numeric [ ( Precisione [ , Scala ] ) ]
  • decimal [ ( Precisione [ , Scala ] ) ]
  • integer
  • smallint

Numeric e Decimal
Rappresentano numeri in base decimale. Dove Precisione specifica il numero di cifre che compone il valore e Scala la posizione della virgola. La differenza tra i domini numeric e decimal consiste nel fatto che la precisione per il dominio numeric rappresenta un valore esatto, mentre per il dominio decimal costituisce un requisito minimo.

Nel caso non sia importante la rappresentazione frazionaria diventa possibile utilizare integer e smallint.
Per questi domini non esiste un vincolo sulla rappresentazione ed essi sono generalmente basati sulla rappresentazione binaria interna del calcolatore.

Tipi numerici approsimati

Per la rappresentazione di valori reali approsimati (utili per esempio per la rappresentazione di grandezze fisiche), SQL fornisce i seguenti tipi:

  • float [ ( Precisione ) ]
  • real
  • double precision

ES: 1.6E12
A float può essere assegnata esplicitamente una precision, interne al numero di cifre della mantissa.

Per gli altri due la precisione dipende dal sistema di calcolo, ma la precision di double precision è ≥ a real (normalmente doppia).

Istanti Temporali

Questa famiglia di domini sono stati introdotti in SQL-2 per descrivere informazioni temporali e permette di rappresentare istanti di tempo in tre diverse forme:

  • date
  • time [ ( Precisione ) ] [ whit time zone ]
  • timestamp [ ( Precisione ) ]  [ whit time zone ]

Sono strutturati nelle seguenti maniere.
La forma  date accetta il modello americano year-month-day con la regola “(yyyy:mm:dd)
La forma  time accetta il modello hour-minute-second “(hh:mm:ss)”
Di default Precision è 0(s) per time e di 6 per timestamp (μs) metre per “whit time zone” fa riferimento all’ora di Greenwich, questo apre la possibilità di accedere ad altri 2 campi, timezone_hour e timezone_minute. la formula per completo agli standard UTC è 01:03:04+1:00. Timestamp non è nient’altro che date+time.

Intervalli Temporali

Questa famiglia di domini permette di rappresentare intervalli di tempo, come per esempio la durata di un’evento. La sintassi è:

interval PrimaUnitàDiTempo [ to UltimaUnitàDiTempo ]

Specifica un intervallo di tempo cioè un valore relativo utilizzabile per incrementare/decrementare un valore date, time o timestamp.

Es: interval years (5) to month
Permette di rappresentare intervalli temporali fino a 99.999 anni e 11 mesi.

Es: interval day(4) to second (6)
Permette di rappresentare intervalli temporali fino a 9.999 giorni 23 ore, 59 minuti e 59,999999 secondi, con una precisione al milionesimo di secondi.

Definizione di nuovi Domini

E’ possibile definire nuovi domini a partire da quelli elementari alternativamente è possibile dichiarare il dominio e usarlo (peggiora la leggibilità)

create domain NomeDominio as TipoDato [ ValoreDiDefault ] [ Vincolo ]

Es: create domain copie_vendute as smallint default 0

Ormai sono quasi sei mesi che sono iscritto al corso d’informatica umanistica. Oggi ho deciso di dedicare questo blog a quello che il mio mondo universitario. Facendo le categorie per materie e per quello che sono i miei interessi.

I Love PHP

Come si è chiarito nel precedente articolo, Cos’è PHP?, il linguaggio di programmazione PHP è gratuito. Appunto per questo motivo molta gente diffida ad utilizarlo. Per alcune filosofie di vita si crede che tutto quello che paghi sia migliore di quello che è gratuito, in effetti come regola di vita quotidiana può anche essere vero ma teniamo conto che in internet è una cosa ben distinta dalla vita quotidiana, penso d’altronde che se ti metti a parlare con un linguaggio di programmazione per strada, l’impressione che darai non sarà tra le migliori. (continua…)

php info

Tratto da Wikipedia – L’eciclopedia Libera.
Nato nel 1994 ad opera del danese Rasmus Lerdorf, PHP era in origine una raccolta di script CGI che permettevano una facile gestione delle pagine personali. Per questo motivo il significato originario dell’acronimo pare fosse Personal Home Page (sull’origine dell’acronimo ci sono tuttora alcuni dubbi, alimentati dallo stesso Lerdorf che ha contribuito volontariamente a generare attorno al nome questo alone di mistero). Il pacchetto originario venne in seguito esteso e riscritto dallo stesso Lerdorf in C, aggiungendo funzionalità quali il supporto al database mSQL e prese a chiamarsi PHP/FI, dove FI sta per Form Interpreter (interprete di form), prevedendo la possibilità di integrare il codice PHP nel codice HTML in modo da semplificare la realizzazione di pagine dinamiche. In quel periodo, 50.000 domini internet annunciavano di aver installato PHP. (continua…)

Pagina Successiva »