Capire le basi della gestione degli schemi è fondamentale per costruire e mantenere un database PostgreSQL efficace. In questo articolo, esamineremo il modo tradizionale di gestire uno schema Postgres e un modo più recente ed efficace per farlo visivamente, senza dover scrivere alcuna riga di codice.
Cos’è uno schema PostgreSQL?
Prima di tutto, per porre le basi dell’articolo, chiariamo un po’ di terminologia. In Postgres, lo schema è anche chiamato spazio dei nomi. Lo spazio dei nomi può essere associato a un nome di famiglia. È usato per identificare e differenziare certi oggetti nel database (tabelle, viste, colonne, ecc.). Non è permesso creare due tabelle con lo stesso nome in uno schema, ma è possibile farlo in due schemi diversi. Per esempio, possiamo avere due tabelle chiamate entrambe table1 presenti negli schemi public e postgres.
Perché usare gli schemi?
Gli schemi sono molto utili per organizzare gli oggetti del database in gruppi logici ed evitare collisioni di nomi. Oltre a questo, gli schemi sono spesso usati per permettere a diversi utenti di lavorare con il database senza interferire tra loro. Un esempio comune è quando ogni utente del database lavora sul proprio schema, senza interferire con altri utenti ed evitando conflitti.
Il modo classico di gestire gli schemi di PostgreSQL
Tutte le query seguenti saranno eseguite dall’interno della shell di PostgreSQL.
Creazione di uno schema
Quando si crea un nuovo database in Postgres, lo schema di default è pubblico. Un nuovo schema può essere creato eseguendo la prossima query:
Prima di aggiungervi alcune tabelle, spiegherò due concetti importanti: nomi qualificati e non qualificati.
-
Un nome qualificato è il nome dello schema e il nome della tabella separati da un punto. Questo specificherà lo schema in cui vogliamo creare la nostra tabella:
xxxxxxxxxx
CREATE TABLE schema_name.table_name (...);
-
Un nome non qualificato consiste solo nel nome della tabella. Questo creerà la tabella nel database selezionato che è pubblico per impostazione predefinita. Questo può essere cambiato tramite il search_path, ma lo vedremo in dettaglio più avanti. Un esempio di denominazione non qualificata è:
xxxxxxxxxx
CREATE TABLE table_name (...);
Le colonne delle tabelle saranno definite all’interno delle parentesi delle query precedenti (…).
Per creare una nuova tabella nel nostro nuovo schema, eseguiremo:
xxxxxxxxxx
CREATE TABLE schema_1.persons (name text, age int);
Per eliminare lo schema, abbiamo due possibilità. Se lo schema è vuoto (non contiene alcuna tabella, vista o altri oggetti), possiamo eseguire:
xxxxxxxxxx
Se lo schema contiene oggetti database, inseriremo il comando a cascata:
xxxxxxxxxx
DROP SCHEMA schema_1 CASCADE;
In PostgreSQL è anche possibile creare uno schema di proprietà di un altro utente con:
xxxxxxxxxx
CREATE SCHEMA schema_name AUTHORIZATION username;
Percorso di ricerca
Quando esegue un comando con un nome non qualificato, Postgres segue un percorso di ricerca per determinare quali schemi usare. Per impostazione predefinita, il percorso di ricerca è impostato sullo schema pubblico. Per visualizzarlo, esegui
xxxxxxxxxx
SHOW search_path;
Se nulla è stato cambiato nel vostro database, questa query dovrebbe portare il prossimo risultato:
xxxxxxxxxx
search_path
--------------
"$user",public
Il percorso di ricerca può essere modificato in modo che il sistema scelga automaticamente un altro schema se si usa un nome non qualificato. Il primo schema nel percorso di ricerca è chiamato schema corrente. Per esempio, imposterò schema_1 come schema corrente:
xxxxxxxxxx
SET search_path TO schema_1,public;
La prossima query userà un nome non qualificato per creare una tabella. Questo la creerà automaticamente in schema_1:
xxxxxxxxxx
CREATE TABLE address (city text, street text, number int);
La Nuova Via: Gestisci senza il codice!
C’è un modo più semplice per fare tutti i compiti di gestione dello schema, senza dover scrivere alcuna riga di codice. Usando DbSchema è possibile eseguire tutte le query di cui sopra da una GUI intuitiva con pochi clic. La connessione al database richiede solo pochi secondi. Dall’inizio, puoi selezionare su quale schema lavorare.
Lo schema o gli schemi selezionati saranno invertiti da DbSchema e mostrati nel layout.
Per creare un nuovo schema, basta cliccare con il tasto destro del mouse sulla cartella dello schema nel menu di sinistra e selezionare Create Schema.
Per creare una nuova tabella nello schema cliccare con il tasto destro del mouse sul layout e scegliere Create Table.
Lo schema può essere eliminato cliccando con il tasto destro sul suo nome dal menu di sinistra.
Per aggiungere un altro schema dal database, scegliete Refresh From Database.
Utilizzando DbSchema, non avrete bisogno di usare la sintassi show_path perché potete creare le tabelle direttamente nel layout. Un layout può essere paragonato a un tavolo da disegno sul quale puoi aggiungere le tabelle e modificarle. Ogni layout ha uno schema associato ad esso, quindi se sei sul layout schema_1, le tabelle saranno create automaticamente lì.
Lavoro offline
DbSchema memorizza un’immagine locale dello schema in un file di progetto locale. Questo significa che il file di progetto può essere aperto senza connettività al database (offline). Mentre si è offline, si possono fare tutte le azioni presentate sopra e altre ancora, ma senza dati. Dopo la riconnessione al database, puoi confrontare il file di progetto con il database e scegliere quali azioni mantenere o abbandonare.
La stessa cosa può essere fatta tra due versioni diverse dello stesso file di progetto. Per esempio, se lavori in un team, può succedere che ci siano più schemi (produzione, test, sviluppo) ognuno con il suo file di progetto. Se un cambiamento appare nello sviluppo e vuoi implementarlo sugli altri due schemi, puoi semplicemente confrontare e sincronizzare i due file di progetto.
Conclusione
La comprensione dei concetti sopra elencati vi aiuterà a gestire facilmente i vostri schemi PostgreSQL. Usare un designer visuale come DbSchema renderà il vostro lavoro ancora più facile, permettendovi di fare tutto visivamente, senza dover scrivere una sola riga di codice.