Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errorsSome 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:
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.
#1 Best Overall
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.
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,contabilitaereporting. - 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.
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.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →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.
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.
Esempio completo con due namespace
Il seguente esempio è adatto a PostgreSQL o SQL Server, con gli eventuali adattamenti richiesti dal prodotto:
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.
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_pathesqlite_schemanon sono SQL universale. - Usare nomi non qualificati senza controllare il contesto: in PostgreSQL
search_pathpuò scegliere un oggetto omonimo in uno schema precedente. - Eseguire
DROP SCHEMA ... CASCADEalla 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
- Identifica il DBMS e la sua versione.
- Stabilisci se “schema” indica la struttura complessiva o un namespace concreto.
- Controlla il proprietario e i privilegi necessari.
- Decidi se la tabella va riferita con
schema.tabella. - Verifica il namespace predefinito:
search_pathin PostgreSQL, schema predefinito dell’utente in SQL Server o Oracle. - Adatta i comandi: non assumere che
CREATE SCHEMAabbia lo stesso effetto ovunque. - 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.
Quick Recap
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.

