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 auto può ereditare da veicoli, acquisendo automaticamente le colonne targa e anno:

    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 tipo indirizzo, puoi creare una funzione citta(indirizzo) che ne estrae il campo città e richiamarla nelle query come se fosse una proprietà della colonna: invece di scrivere (indirizzo_cliente).citta ogni 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.