Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

In SQL, “schema” ha due significati collegati ma distinti: può indicare la struttura logica dei dati (tabelle, colonne, chiavi e vincoli) oppure un namespace, cioè un contenitore interno che raggruppa e qualifica oggetti come vendite.ordini. Il significato concreto dipende dal DBMS: PostgreSQL e SQL Server gestiscono schemi separati, Oracle li associa agli account, MySQL usa “schema” come sinonimo di database e SQLite non offre namespace equivalenti.

Schema del database: la definizione generale

Nel senso più ampio, lo schema è il progetto formale del database: descrive come i dati sono organizzati e quali regole devono rispettare. Non coincide con le righe memorizzate, ma con le definizioni che stabiliscono la loro forma.

Database
├── Tabelle
├── Colonne
├── Chiavi primarie
├── Chiavi esterne
├── Vincoli
├── Indici
├── Viste
└── Trigger

Per esempio, queste definizioni descrivono una parte dello schema strutturale:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
CREATE TABLE clienti (
    id          INTEGER PRIMARY KEY,
    nome        VARCHAR(100) NOT NULL,
    email       VARCHAR(255) UNIQUE
);

CREATE TABLE ordini (
    id_cliente  INTEGER NOT NULL,
    totale      DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (id_cliente) REFERENCES clienti(id)
);

Qui lo schema comprende colonne, tipi, chiave primaria, vincolo UNIQUE e relazione tra le tabelle. È diverso dallo schema fisico, che riguarda invece file, pagine, segmenti, tablespace, partizioni e altri dettagli di memorizzazione scelti dal DBMS.

Schema come namespace

Nei DBMS che implementano lo schema come oggetto, esso funziona come un namespace: un’area logica che contiene tabelle, viste, funzioni, tipi e altri oggetti. L’analogia con una cartella è utile solo per orientarsi; gli schemi non sono necessariamente cartelle del filesystem, non sono in genere annidabili e non rappresentano da soli un isolamento di rete.

Due schemi possono contenere oggetti con lo stesso nome senza conflitto:

CREATE SCHEMA vendite;
CREATE SCHEMA magazzino;

CREATE TABLE vendite.ordini (
    id INT PRIMARY KEY
);

CREATE TABLE magazzino.ordini (
    id INT PRIMARY KEY
);

PostgreSQL documenta questo modello di namespace e la qualificazione dei nomi nella documentazione sugli schemi.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Database, schema, tabella e vista: che differenza c’è?

Concetto Funzione
Database Contenitore logico più ampio, quando il DBMS lo prevede.
Schema Struttura logica del modello oppure namespace interno per gli oggetti.
Tabella Oggetto che conserva righe organizzate in colonne.
Vista Query salvata esposta come oggetto interrogabile.
Catalogo Metadati che descrivono tabelle, viste, indici, trigger e altri oggetti.

La gerarchia non è universale. In PostgreSQL, per esempio, un cluster contiene database, ogni database contiene più schemi e gli schemi contengono oggetti. Una connessione accede a un database alla volta.

Perché usare uno schema?

  • Organizzazione: separare aree come vendite, contabilita e reporting.
  • Nomi senza conflitti: moduli diversi possono avere ciascuno una tabella configurazione.
  • Permessi: assegnare privilegi a uno schema o ai suoi oggetti.
  • Separazione applicativa: distinguere gli oggetti di applicazioni o componenti differenti nello stesso database.
  • Multi-tenancy limitata: usare schemi distinti per gruppi o clienti quando il modello operativo e i controlli degli accessi lo rendono appropriato.

Uno schema non è però automaticamente una barriera di sicurezza completa: in PostgreSQL, schemi diversi appartengono allo stesso database e un account può accedervi se possiede i privilegi necessari.

Come si usa schema.tabella

La forma qualificata è:

SELECT *
FROM vendite.ordini;

Gli esempi comuni includono public.clienti in PostgreSQL e dbo.Clienti in SQL Server. Specificare lo schema rende esplicito l’oggetto richiesto, soprattutto quando esistono nomi uguali in namespace diversi.

Se si omette il prefisso, il DBMS applica le proprie regole. In PostgreSQL la ricerca segue search_path:

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
SHOW search_path;

Il primo schema adatto trovato viene usato per risolvere il nome; il primo schema utilizzabile del percorso è anche la destinazione predefinita per nuovi oggetti. Per query, migrazioni e codice sensibile è quindi preferibile qualificare i nomi.

Come cambiano gli schemi tra i DBMS

DBMS Significato prevalente Esempio o catalogo
PostgreSQL Namespace interno a un database, con tabelle, viste, funzioni, tipi e altri oggetti. vendite.ordini; spesso è presente public.
SQL Server Contenitore a livello di database, con proprietario e autorizzazioni proprie. dbo.Clienti o nome_database.nome_schema.nome_tabella.
Oracle Insieme degli oggetti posseduti da un account; lo schema ha normalmente lo stesso nome dell’utente. L’utente HR possiede lo schema HR e può usare hr.employees.
MySQL “Schema” e “database” sono sostanzialmente sinonimi. database_name.table_name.
SQLite Non esiste un namespace separato equivalente a quello PostgreSQL. Il catalogo interno sqlite_schema descrive gli oggetti.

Le fonti ufficiali spiegano queste differenze: SQL Server, MySQL, Oracle e SQLite.

Creare, usare ed eliminare uno schema

PostgreSQL

CREATE SCHEMA vendite;

CREATE TABLE vendite.ordini (
    id          INTEGER PRIMARY KEY,
    data_ordine DATE NOT NULL
);

DROP SCHEMA vendite;

DROP SCHEMA funziona se lo schema è vuoto. La variante seguente elimina anche gli oggetti contenuti e quelli dipendenti:

DROP SCHEMA vendite CASCADE;

Usare CASCADE solo dopo aver verificato dipendenze e contenuti, in un ambiente controllato e, quando possibile, dentro una transazione. La sintassi e i privilegi sono descritti dalla documentazione PostgreSQL.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

SQL Server

CREATE SCHEMA Vendite;
CREATE SCHEMA Vendite AUTHORIZATION SalesRole;

La creazione richiede il permesso CREATE SCHEMA sul database; indicare un proprietario diverso può richiedere autorizzazioni aggiuntive. In SQL Server Management Studio il percorso è Databases → Security → New → Schema. Gli schemi del database corrente si possono elencare con:

Rank #3
SELECT *
FROM sys.schemas;

Riferimenti: guida Microsoft alla creazione degli schemi e sintassi CREATE SCHEMA.

MySQL

Poiché schema e database sono sinonimi nel modello MySQL, non bisogna trasferire automaticamente la semantica PostgreSQL. Si lavora con un database e si qualificano gli oggetti così:

database_name.table_name

La documentazione MySQL conferma l’equivalenza terminologica tra schema e database.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Oracle

Oracle non usa normalmente CREATE SCHEMA per creare un namespace indipendente come PostgreSQL. Lo schema appartiene a un account: amministrare l’utente e i suoi privilegi significa amministrare anche il relativo schema. Un riferimento non qualificato cerca anzitutto gli oggetti dello schema dell’utente connesso.

SQLite

SQLite non offre schemi separati nello stesso senso. Per ispezionare le definizioni registrate nel catalogo interno:

SELECT type, name, tbl_name, sql
FROM sqlite_schema
ORDER BY type, name;

sqlite_schema è il catalogo dei metadati: contiene le definizioni di tabelle, indici, viste e trigger, non un namespace da creare con CREATE SCHEMA.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Esempio completo con due namespace

Il seguente esempio è adatto a PostgreSQL o SQL Server, con gli eventuali adattamenti richiesti dal prodotto:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
CREATE SCHEMA vendite;
CREATE SCHEMA report;

CREATE TABLE vendite.clienti (
    id       INTEGER PRIMARY KEY,
    nome     VARCHAR(100) NOT NULL
);

CREATE VIEW report.clienti_totali AS
SELECT COUNT(*) AS totale
FROM vendite.clienti;

SELECT *
FROM vendite.clienti;

vendite e report sono namespace distinti; clienti è una tabella e clienti_totali una vista. La vista riferisce un oggetto di un altro schema, purché i privilegi lo consentano.

Schema predefinito, proprietario e permessi

PostgreSQL: public e search_path

In una configurazione standard, il percorso predefinito include in forma semplificata "$user", public, e molti oggetti creati senza prefisso finiscono in public. public non è però una regola dello standard SQL. Controllare sempre il percorso con SHOW search_path.

Il percorso ha anche implicazioni di sicurezza: se utenti non affidabili possono creare oggetti in uno schema presente nel search_path, possono influenzare la risoluzione dei nomi o l’esecuzione di funzioni. Nei contesti sensibili, qualificare i nomi e limitare il privilegio CREATE sugli schemi del percorso.

SQL Server: dbo

dbo è un nome molto comune per lo schema predefinito o per il proprietario del database, ma account e configurazioni possono avere schemi predefiniti diversi. Non trattarlo come un valore universale.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Utente e schema non sono sempre la stessa cosa

  • In Oracle account e schema sono strettamente associati e condividono normalmente il nome.
  • In SQL Server lo schema è distinto dall’utente e può essere posseduto da un utente, un ruolo o un application role.
  • In PostgreSQL lo schema ha proprietario e privilegi propri, ma non è sinonimo di utente.
  • In MySQL “schema” indica il database.

Errori comuni e come evitarli

  • Confondere database e schema: in PostgreSQL un database può contenere molti schemi; in MySQL i due termini coincidono.
  • Usare comandi del DBMS sbagliato: public, dbo, search_path e sqlite_schema non sono SQL universale.
  • Usare nomi non qualificati senza controllare il contesto: in PostgreSQL search_path può scegliere un oggetto omonimo in uno schema precedente.
  • Eseguire DROP SCHEMA ... CASCADE alla cieca: oltre alle tabelle può rimuovere viste, funzioni, tipi e oggetti dipendenti.
  • Dimenticare oggetti diversi dalle tabelle: uno schema può contenere anche sequenze, indici, trigger, funzioni e viste.
  • Hard-codificare lo schema nelle migrazioni: configurare il nome per ambiente e verificare che le query, i ruoli e i permessi usino lo stesso schema.

Checklist pratica

  1. Identifica il DBMS e la sua versione.
  2. Stabilisci se “schema” indica la struttura complessiva o un namespace concreto.
  3. Controlla il proprietario e i privilegi necessari.
  4. Decidi se la tabella va riferita con schema.tabella.
  5. Verifica il namespace predefinito: search_path in PostgreSQL, schema predefinito dell’utente in SQL Server o Oracle.
  6. Adatta i comandi: non assumere che CREATE SCHEMA abbia lo stesso effetto ovunque.
  7. Prima di usare CASCADE, elenca oggetti e dipendenze e assicurati di poter ripristinare i dati.

The Bottom Line

Prima di usare o creare uno schema, identifica il DBMS: la stessa parola può indicare un namespace PostgreSQL, un contenitore con proprietario in SQL Server, lo schema dell’utente in Oracle, un database in MySQL oppure solo il catalogo degli oggetti in SQLite.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.