# Database management system

Un database management system (in acronimo DBMS, lett. "sistema di gestione della base di dati" in italiano) è un sistema software progettato per consentire la creazione, la manipolazione e l'interrogazione di una o più basi di dati in modo corretto ed efficiente. Talvolta ci si riferisce ai DBMS utilizzando impropriamente il termine database (o "base di dati" in italiano), a causa dell'accoppiamento tipicamente stretto tra l'archivio dati e il software di gestione.

## Descrizione

Se in passato i DBMS erano diffusi principalmente presso le grandi aziende e istituzioni che potevano permettersi l'impegno economico derivante dall'acquisto delle grandi infrastrutture hardware necessarie per realizzare un sistema di database efficiente, oggi il loro utilizzo è diffuso praticamente in ogni contesto. L'espressione applicazione enterprise, che nel gergo informatico si riferisce ad applicazioni legate al business delle aziende che le utilizzano, implica quasi "per definizione" la presenza di una o più basi di dati amministrate da uno o più DBMS.
Un DBMS è differente dal concetto generale di applicazione sulle banche dati in quanto è progettato per sistemi multi-utente: i DBMS si appoggiano a kernel che supportano nativamente il multitasking e il collegamento in rete, infatti una tipica applicazione per la gestione dei database non includerebbe queste funzionalità, ma si appoggerebbe al sistema operativo per consentire all'utente di usufruirne.
Un DBMS controlla anche la sicurezza e l'integrità del database e può essere costituito da un insieme complesso di programmi software che controllano l'organizzazione, la memorizzazione e il reperimento dei dati (campi, record e archivi) in un database. Il DBMS accetta richieste di dati da parte del programma applicativo e "istruisce" il sistema operativo per il trasferimento dei dati appropriati, svolgendo un ruolo fondamentale in applicazioni informatiche di ogni genere, dalla contabilità, alla gestione delle risorse umane e alla finanza fino a contesti tecnici come la gestione di rete o la telefonia.

### Funzionalità tipiche
#### Controllo degli accessi

Il sistema di sicurezza dei dati impedisce agli utenti non autorizzati di visualizzare o aggiornare il database. Mediante l'uso di password (parole d'ordine) agli utenti è permesso l'accesso all'intero database o a un suo sottoinsieme: in questo secondo caso si parla di subschema. Per esempio, un database di impiegati può contenere tutti i dati riguardanti un singolo soggetto e un gruppo di utenti può essere autorizzato a vedere solamente i dati riguardanti lo stipendio, mentre altri utenti possono essere autorizzati a vedere solamente le informazioni che riguardano la sua storia lavorativa e la situazione sanitaria.

#### Mantenimento dell'integrità

Il DBMS può mantenere l'integrità del database non consentendo a più utenti di modificare lo stesso record contemporaneamente (blocco del record). Il database può impedire l'immissione di due record duplicati; per esempio può essere impedita l'immissione nel database di due clienti con lo stesso numero identificativo ("campi chiave"). Le regole che determinano l'integrità e la consistenza di una base di dati prendono il nome di vincoli di integrità referenziale (proprietà "ACID").

#### Gestione delle transazioni

I linguaggi di interrogazione del database mediante query (interrogazioni) e i generatori di report permettono agli utenti di interrogare in maniera interattiva il database e di analizzarne i dati.
Se il DBMS fornisce un modo per aggiornare e immettere nuovi dati nel database, oltre che per interrogarlo, questa capacità permette di gestire database personali. Comunque queste funzionalità non danno la possibilità di mantenere traccia delle revisioni e non forniscono gli strumenti necessari alla gestione di una organizzazione multi-utente. Questi controlli sono disponibili solamente quando un insieme di programmi applicativi è appositamente costruito per gestire e coordinare ciascuna funzione di immissione o modifica dei dati.

#### Astrazione della base dati
## Architettura

Le organizzazioni possono usare un DBMS per gestire il normale processo quotidiano delle transazioni e in un secondo tempo spostare il dettaglio in un altro computer che usa un altro DBMS più adatto per gestire interrogazioni casuali e l'attività di analisi. Le decisioni globali circa l'architettura dei sistemi informativi sono gestite dagli analisti di sistema e dagli amministratori dei dati. La progettazione di dettaglio del database è demandata agli amministratori del database stesso.
I tre tipi di organizzazione più comuni sono il modello gerarchico, il modello reticolare e il modello relazionale. Il modello dominante oggi è quello relazionale, normalmente utilizzato con il linguaggio di interrogazione SQL. Molti DBMS supportano le API (Application programming interface) dell'Open Database Connectivity (ODBC) o Java DataBase Connectivity (JDBC, lo standard per Java), che forniscono ai programmatori strumenti standardizzati per l'accesso ai database.
I database server sono computer ottimizzati per ospitare i programmi che costituiscono il database reale e sui quali girano solo il DBMS e il software a esso correlato, nelle situazioni reali spesso questi computer svolgono anche altre funzioni non correlate con la gestione del database. Di solito si tratta di macchine multiprocessore e con dischi fissi configurati in modalità RAID per una memorizzazione stabile e affidabile dei dati per garantire la continuità del servizio anche in caso di guasto a un componente (sistemi fault tolerant o ad alta affidabilità e disponibilità). In ambienti dove vengono processate transazioni con moli di dati particolarmente elevate vengono utilizzati anche componenti hardware che hanno la funzione specifica di acceleratori di database e che sono collegati a uno o più server attraverso canali preferenziali ad alta velocità di trasmissione.
Sempre più frequentemente si assiste alla integrazione delle basi di dati e di Internet: una vasta classe di applicazioni della Rete fa uso di informazioni presenti su basi di dati; esempi di questo tipo di applicazioni vanno dai cataloghi delle imprese alle edizioni on-line dei giornali e dei quotidiani. Per garantire un linguaggio di modellizzazione che consenta di passare dalla visualizzazione dei dati in un formato compatibile con le basi di dati a una "vista" concettuale del futuro sito web esiste un linguaggio specifico chiamato WebML.

### Servizi implementati

Un DBMS è uno strumento per la creazione e la gestione efficiente di grandi quantità di dati che consente di conservarli in modo sicuro per lunghi periodi di tempo. Un DBMS fornisce agli utenti questi servizi:
* Persistent storage: come un file system, un DBMS permette la memorizzazione di grandi quantità di dati, ma garantisce una flessibilità molto più elevata
* Programming interface: permette agli utenti di accedere e modificare i dati attraverso un potente linguaggio di interrogazione
* Transaction management: supporta l'accesso concorrente ai dati evitando conseguenze indesiderate dovute a crash del sistema o dell'applicazione
Si considerano due diversi tipi di utenti:
* utenti convenzionali/applicazioni che modificano dati e formulano interrogazioni
* l'amministratore della base di dati (database administrator - DBA) responsabile per la struttura, lo schema e la gestione della base di dati
Nell'architettura di un DBMS abbiamo le seguenti sezioni:
* Dischi e file
* Storage manager
* Buffer manager
* Index/file/record manager
* Execution engine
* Query compiler
* Concurrency control
* Logging/recovery
* Transaction manager
* Recovery management
Una suddivisione alternativa semplificata (ma parziale), utile a comprendere per linee generali il comportamento di un DBMS, potrebbe essere questa:
* Gestore delle interrogazioni
* Gestore dei metodi di accesso
* Gestore del buffer (Buffer manager)

### Gestore delle interrogazioni

Si occupa di elaborare le richieste dell'utente, di solito espresse in SQL, quindi in un linguaggio di tipo dichiarativo (un tipo di linguaggio in cui si descrivono i dati che si vogliono ottenere), e di tradurle in un insieme di operazioni (una procedura), che saranno poi effettivamente eseguite. Di solito vi sono più modi diversi di tradurre un'interrogazione e la funzione principale del gestore delle interrogazioni è quella di scegliere fra le varie alternative quella migliore, quella cioè che richiede un minor tempo di elaborazione e una minore occupazione di memoria. Ad esempio, un'ottimizzazione in grandi database consiste nell'anticipare sempre le operazioni di selezione, in modo da diminuire fin dall'inizio il numero di record da elaborare, con ovvi miglioramenti nell'occupazione di memoria e nella velocità. Un'altra ottimizzazione è nel caso di un database piccolo, all'esecuzione delle istruzioni SQL un puntatore scorrerà e selezionerà le righe di dati della tabella interessati, e stamperà i risultati della ricerca su una nuova tabella, senza la creazione di una tabella temporanea. Altre ottimizzazioni sono sempre fatte basandosi su criteri di tipo statistico: la grandezza di una tabella, come le tabelle sono fisicamente memorizzate, ecc. Alla fine dell'elaborazione il gestore delle interrogazioni darà delle direttive al gestore dei metodi di accesso per trovare le tuple.

### Gestore del metodo di accesso

Si occupa di individuare il blocco in cui è presente la tupla di interesse.
Un utente con privilegi di amministratore dichiara al sistema come gestire gli accessi, tramite una tavola CRUD.
Il DBMS dovrebbe consentire l'accesso in scrittura a una generica risorsa informatica, a un solo utente alla volta. Se due utenze accedono alla stessa risorsa, apportando modifiche, si hanno due casi:
* se salvano contemporaneamente il loro lavoro, sorge un conflitto di edizione;
* se salvano le modifiche in momenti diversi, chi pubblica per ultimo sovrascrive il lavoro dell'utente precedente.
Il DBMS può includere delle utility per fare dei merge fra versioni differenti della stessa risorsa.

### Gestore del buffer

Un DBMS deve gestire una grossa mole di dati, e nel corso delle elaborazioni lo spazio richiesto per i blocchi di dati sarà spesso maggiore dello spazio di memoria disponibile. Per questo vi è la necessità di gestire un'area di memoria in cui caricare e scaricare i blocchi. Il gestore del buffer si occupa principalmente di gestire le operazioni inerenti al salvataggio e il caricamento dei blocchi. In effetti, le operazioni che mette a disposizione il gestore del buffer sono queste:
* FIX: con questo comando si dice al gestore del buffer di caricare un blocco dal disco e restituire il puntatore all'area di memoria in cui lo si è caricato. Se il blocco era già in memoria, il gestore del buffer deve solo restituire il puntatore, altrimenti deve caricarlo dal disco e portarlo in memoria. Se il buffer in memoria è pieno però si possono avere due situazioni:
** esiste la possibilità di liberare una porzione di memoria perché occupata da transazioni già terminate. In questo caso prima di liberare l'area si scrive il contenuto sul disco se qualche blocco di quest'area era stato modificato.
** Non esiste la possibilità di liberare memoria perché occupata tutta da transizioni ancora in corso. In questo caso il gestore del buffer può lavorare in 2 modalità: nella prima modalità (STEAL) il gestore del buffer libera della memoria occupata da una transizione già attiva, salvando eventualmente le modifiche sul disco; nella seconda modalità (NOT STEAL) la transizione che ha richiesto il blocco viene fatta attendere finché non si libera memoria.
* SET DIRTY: richiamando questo comando si contrassegna un blocco in memoria come modificato.
Prima di introdurre gli ultimi 2 comandi si deve anticipare che il DBMS può operare in 2 modalità: FORCE e NOT FORCE. Quando lavora in modalità FORCE, il salvataggio su disco avviene in modalità sincrona con il commit di una transazione. Quando lavora in modalità NOT FORCE il salvataggio viene effettuato di tanto in tanto in maniera asincrona. In genere i database commerciali operano in modalità NOT FORCE perché ciò consente un aumento delle prestazioni: il blocco può subire più modifiche in memoria prima di essere salvato, poi è possibile scegliere di effettuare i salvataggi quando il sistema è più scarico.
* FORCE: Con questo comando si forza il gestore del buffer a effettuare la scrittura in modo sincrono con la conclusione (commit) della transazione
* FLUSH: Con questo comando si forza il gestore del buffer a eseguire il salvataggio, quando ci si trova in modalità NOT FORCE.

### Gestore delle operazioni di ripristino

Il recovery manager è responsabile di garantire la coerenza l'atomicità, la persistenza e di realizzare i comandi transazionali fondamentali quali begin transaction, end transaction, commit work, rollback work. L'obiettivo del recovery manager è quello di gestire il rollback di una transazione, ricostruire uno stato consistente del DB e che ne rispetti la semantica delle transazioni, in seguito ad un guasto del DBMS.
Un DBMS deve essere in grado di fronteggiare diverse tipologie di guasti:
* guasti di sistema;
* guasti di memoria secondaria o di un dispositivo di memorizzazione.
Un guasto di sistema può essere un system crash dovuto ad un errore software o hardware, un errore di sistema di applicativo, dovuto ad esempio ad una divisione per zero, un errore generato dalle condizioni logiche durante l'esecuzione di una transazione. Questo tipo di guasto causa la perdita dei dati contenuti nel buffer ma la memoria di massa rimane comunque valida.
Un guasto di memoria secondaria è più complesso da gestire e può essere causato da eventi catastrofici che non permettono di avere una memoria ancora valida. Questo tipo di guasto causa una perdita fisica dei dati memorizzati ma non dei log che vengono salvati in una memoria stabile.

#### Strategie

Per risolvere il problema dei guasti un DBMS può utilizzare diverse strategie:
* system log: file sequenziale scritto in memoria sicura che registra tutte le attività svolte dalle transazioni e gli eventi del sistema quali checkpoint o dump;
* dump: copia della memoria secondaria su una memoria dislocata in un punto differente geografico;
* checkpoint: evento di sistema che permette di fotografare lo stato del DBMS al momento dell'esecuzione delle transazioni.
Per ripristinare situazioni non congruenti derivate da crash del sistema, il DBMS ha disposizione l'operazione di redo e l'operazione di undo da utilizzare tramite la lettura del log.
Per le transazioni che al momento di un guasto sono nello stato di committed, dato che bisogna garantire la proprietà di persistenza, sarà necessario rifare le azioni che sono state salvate nel log tramite l'istruzione redo.
Per le transazioni che invece si trovano nello stato di uncommitted è necessario annullare le operazioni che stavano facendo tramite l'operazione di undo.

## Principali sistemi esistenti

* Software proprietario
** 4th Dimension
** CUBRID
** dBase
** IBM DB1/2
** Caché (InterSystems)
** Dataphor un RDBMS "veramente-relazionale" che rispetta tutte le regole di Codd.
** FileMaker Pro (FileMaker Inc., posseduta da Apple)
** Informix (IBM)
** INGRES (Computer Associates)
** InterBase (Borland)
** Microsoft SQL Server (Microsoft)
** Microsoft Access (Microsoft)
** mSQL
** Netezza
** Oracle (Oracle Corporation)
** Paradox (Borland)
** SQL Anywhere Studio
** Sybase SQL Server
** Teradata (NCR Corporation)
** TimesTen (TimesTen, Inc.)
* Open source o free software
** Apache Derby
** Berkeley DB (Sleepycat Software)
** Drizzle
** Firebird SQL (The FirebirdSQL Foundation; derivato da InterBase)
** GigaBASE
** HSQL Database Engine
** HyperNetDatabase
** MaxDB (prima SAP DB e Adabas)
** Metakit
** MySQL (MySQL AB)
** MariaDB (MariaDB Foundation)
** Percona Server (Percona)
** Orient ODBMS
** PicoSQL (un DBMS italiano)
** PostgreSQL, in precedenza Postgres (PostgreSQL Global Development Group)
** SQLite (di pubblico dominio)
** Visual FoxPro (FoxBase)
** ZODB
** SADAS