ORDBMS (Object-Relational Database Management System) — letteralmente "sistema di gestione di database oggetto-relazionale" — è un sistema che combina il modello relazionale tradizionale con alcuni concetti tipici della programmazione orientata agli oggetti: tipi personalizzati, ereditarietà, metodi associati ai dati.
A differenza di un RDBMS classico, un ORDBMS supporta:
-
Tipi di dato personalizzati che permettono di modellare strutture dati complesse direttamente nel database
-- creazione di un tipo personalizzato CREATE TYPE indirizzo AS ( via TEXT, citta TEXT, cap TEXT ); -
Ereditarietà tra tabelle, con la possibilità di creare tabelle figlie che ereditano colonne e struttura dalla tabella padre. Ad esempio, una tabella
autopuò ereditare daveicoli, acquisendo automaticamente le colonnetargaeanno:CREATE TABLE veicoli ( targa TEXT, anno INT ); CREATE TABLE auto ( num_porte INT ) INHERITS (veicoli); -- auto eredita targa e anno da veicoli -
Funzioni associate ai tipi personalizzati, ovvero funzioni che operano su un tipo definito con
CREATE TYPE. Ad esempio, se definisci un tipoindirizzo, puoi creare una funzionecitta(indirizzo)che ne estrae il campo città e richiamarla nelle query come se fosse una proprietà della colonna: invece di scrivere(indirizzo_cliente).cittaogni volta, deleghi la logica alla funzione.-- creazione di un tipo personalizzato CREATE TYPE indirizzo AS ( via TEXT, citta TEXT, cap TEXT ); -- creazione di una tabella `clienti` con la colonna indirizzo_cliente come tipo personalizzato CREATE TABLE clienti ( id SERIAL PRIMARY KEY, nome TEXT, indirizzo_cliente indirizzo ); -- estrapola la città dall'indirizzo CREATE FUNCTION citta(indirizzo) RETURNS TEXT AS $$ SELECT $1.citta; $$ LANGUAGE SQL; -- per ogni riga, citta() riceve il valore della colonna `indirizzo_cliente` -- (che è di tipo `indirizzo`) ed estrae solo il campo citta SELECT citta(indirizzo_cliente) FROM clienti; -
Array e tipi composti
CREATE TABLE clienti ( id SERIAL PRIMARY KEY, nome TEXT, telefoni TEXT[] -- array di stringhe ); INSERT INTO clienti (nome, telefoni) VALUES ('Mario Rossi', ARRAY['02-1234567', '339-9876543']); -- recupera tutti i clienti che hanno un certo numero SELECT nome FROM clienti WHERE '02-1234567' = ANY(telefoni);
PostgreSQL è l'esempio più diffuso di ORDBMS.