PostgreSQL - Tipi di dati

Ciao هناك, futuri maghi dei database! ? Bentornati nel nostro emozionante viaggio nel mondo dei tipi di dati di PostgreSQL. Come il vostro amico insegnante di scienze informatiche del vicinato, sono entusiasta di guidarvi attraverso questo argomento affascinante. Non preoccupatevi se siete nuovi alla programmazione - inizieremo dalle basi e piano piano ci muoveremo verso l'alto. Allora, afferrate la vostra bacchetta virtuale (tastiera) e tuffiamoci!

PostgreSQL - Data Types

Tipi numerici

Ah, i numeri - i mattoni dell'informatica! PostgreSQL offre una varietà di tipi numerici per soddisfare diverse esigenze. Esploriamoli con alcuni esempi divertenti.

Tipi interi

PostgreSQL fornisce quattro tipi di interi:

Tipo Dimensione di archiviazione Intervallo
smallint 2 byte -32768 a +32767
integer 4 byte -2147483648 a +2147483647
bigint 8 byte -9223372036854775808 a +9223372036854775807
serial 4 byte 1 a 2147483647

Creiamo una tabella per memorizzare informazioni sui nostri libri preferiti:

CREATE TABLE favorite_books (
id serial PRIMARY KEY,
title VARCHAR(100),
publication_year smallint,
pages integer,
isbn bigint
);

In questo esempio:

  • id utilizza serial, che si incrementa automaticamente per ogni nuova voce.
  • publication_year utilizza smallint perché i libri non sono così vecchi (mi dispiace, per gli antichi rotoli!).
  • pages utilizza integer per la lunghezza dei libri.
  • isbn utilizza bigint per quei numeri ISBN così lunghi.

Tipi a virgola mobile

Per quando hai bisogno di precisione decimale:

Tipo Descrizione
real 6 cifre di precisione decimale
double precision 15 cifre di precisione decimale

Aggiungiamo alcuni dettagli in più alla nostra tabella dei libri:

ALTER TABLE favorite_books
ADD COLUMN rating real,
ADD COLUMN price double precision;

Ora possiamo memorizzare valutazioni dei libri (ad esempio, 4.5 stelle) e prezzi precisi.

Numeri a precisione arbitraria

Per quando hai bisogno di una precisione estrema:

CREATE TABLE scientific_constants (
name VARCHAR(50),
value numeric(1000, 900)
);

INSERT INTO scientific_constants (name, value)
VALUES ('Pi', 3.14159265358979323846264338327950288419716939937510);

numeric(1000, 900) permette fino a 1000 cifre totali con 900 dopo la virgola. Perfetto per gli appassionati di pi greco!

Tipi monetari

Il denaro fa girare il mondo, e PostgreSQL ha proprio il tipo giusto per questo:

CREATE TABLE product_prices (
product_name VARCHAR(50),
price money
);

INSERT INTO product_prices (product_name, price)
VALUES ('Penna elegante', '$9.99');

Il tipo money gestisce automaticamente i simboli monetari e i separatori di virgola.

Tipi di caratteri

Il testo è ovunque nei database. PostgreSQL offre tre principali tipi di caratteri:

Tipo Descrizione
character(n) Lunghezza fissa, riempita con spazi
varchar(n) Lunghezza variabile con limite
text Lunghezza variabile illimitata

Utilizziamo questi nella nostra banca dati dei libri:

ALTER TABLE favorite_books
ADD COLUMN author character(50),
ADD COLUMN description varchar(500),
ADD COLUMN full_text text;
  • author è fisso a 50 caratteri (spero che sia abbastanza per "J.K. Rowling"!).
  • description può variare ma non supererà i 500 caratteri.
  • full_text può memorizzare l'intero libro se lo desideriamo (ma non facciamolo, okay?).

Tipi di dati binari

A volte, devi memorizzare dati binari grezzi. Entra in gioco bytea:

ALTER TABLE favorite_books
ADD COLUMN cover_image bytea;

-- Inserendo un'immagine (immagina che questo sia dati binari effettivi)
UPDATE favorite_books
SET cover_image = '\x89504E470D0A1A0A'
WHERE id = 1;

Questo ci permette di memorizzare le copertine dei libri direttamente nel database.

Tipi di dati data/ora

Il tempo è denaro, e PostgreSQL lo ha coperto:

Tipo Descrizione
date Data (nessuna ora del giorno)
time Ora del giorno (nessuna data)
timestamp Entrambe data e ora
interval Intervallo di tempo

Teniamo traccia di quando leggiamo i nostri libri preferiti:

ALTER TABLE favorite_books
ADD COLUMN purchase_date date,
ADD COLUMN reading_start_time time,
ADD COLUMN last_read timestamp,
ADD COLUMN reading_duration interval;

UPDATE favorite_books
SET purchase_date = '2023-04-01',
reading_start_time = '20:30:00',
last_read = '2023-04-15 22:15:30',
reading_duration = '2 ore 30 minuti'
WHERE id = 1;

Ora possiamo analizzare le nostre abitudini di lettura! ?⏱️

Tipo booleano

Vero o falso, 1 o 0, sì o no - a volte la vita è binaria:

ALTER TABLE favorite_books
ADD COLUMN is_favorite boolean;

UPDATE favorite_books
SET is_favorite = true
WHERE rating > 4.5;

Semplice ed efficace!

Tipo enumerato

Quando hai un set fisso di opzioni, le enum sono la tua alleata:

CREATE TYPE book_genre AS ENUM ('Fiction', 'Non-Fiction', 'Science', 'History');

ALTER TABLE favorite_books
ADD COLUMN genre book_genre;

UPDATE favorite_books
SET genre = 'Fiction'
WHERE id = 1;

Niente più errori di battitura nei nomi dei generi!

Tipi geometrici

Per tutti voi appassionati di forme:

CREATE TABLE geometric_objects (
id serial PRIMARY KEY,
name VARCHAR(50),
location point,
area box
);

INSERT INTO geometric_objects (name, location, area)
VALUES ('La mia casa', '(10,20)', '((0,0),(100,100))');

Perfetto per mappare la tua campagna di Dungeons & Dragons!

Tipo di indirizzo di rete

Nel nostro mondo interconnesso, memorizzare informazioni di rete è cruciale:

CREATE TABLE network_devices (
id serial PRIMARY KEY,
name VARCHAR(50),
ip inet,
mac macaddr
);

INSERT INTO network_devices (name, ip, mac)
VALUES ('Il mio router', '192.168.1.1', '08:00:2b:01:02:03');

Ora puoi tenere traccia di tutti i dispositivi sulla tua rete!

Tipo di stringa binaria

A volte, devi lavorare con bit grezzi:

CREATE TABLE permissions (
user_id integer,
access_flags bit(8)
);

INSERT INTO permissions (user_id, access_flags)
VALUES (1, B'10110000');

Ogni bit può rappresentare una diversa autorizzazione. Quanto è efficiente?

Tipo di ricerca testuale

PostgreSQL ha il supporto integrato per la ricerca full-text:

ALTER TABLE favorite_books
ADD COLUMN search_vector tsvector;

UPDATE favorite_books
SET search_vector = to_tsvector('english', title || ' ' || description);

CREATE INDEX textsearch_idx ON favorite_books USING GIN (search_vector);

Ora puoi eseguire ricerche fulminee sulla tua collezione di libri!

Tipo UUID

Gli Identificatori Unici Universali sono fantastici per i sistemi distribuiti:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE distributed_data (
id uuid DEFAULT uuid_generate_v4(),
data TEXT
);

INSERT INTO distributed_data (data) VALUES ('Some distributed data');

Niente più collisioni di ID tra diversi server!

Tipo XML

Per quando hai bisogno di memorizzare dati XML strutturati:

CREATE TABLE xml_documents (
id serial PRIMARY KEY,
doc xml
);

INSERT INTO xml_documents (doc)
VALUES (
'<book>
<title>PostgreSQL for Beginners</title>
<author>Your Favorite Teacher</author>
</book>'
);

XML nel database? Perché no!

Tipo JSON

nell'era dei servizi web, JSON è il re:

ALTER TABLE favorite_books
ADD COLUMN metadata jsonb;

UPDATE favorite_books
SET metadata = '{"tags": ["educational", "fun"], "reviews": [{"user": "Alice", "rating": 5}, {"user": "Bob", "rating": 4}]}'
WHERE id = 1;

Il tipo jsonb permette un'archiviazione e una query efficiente dei dati JSON.

Tipo array

A volte, devi memorizzare più valori in una colonna:

ALTER TABLE favorite_books
ADD COLUMN keywords text[];

UPDATE favorite_books
SET keywords = ARRAY['database', 'programming', 'awesome']
WHERE id = 1;

Gli array ti permettono di memorizzare elenchi di valori senza creare tabelle separate.

Tipi composti

Crea i tuoi tipi personalizzati combinando quelli esistenti:

CREATE TYPE address AS (
street VARCHAR(100),
city VARCHAR(50),
country VARCHAR(50)
);

ALTER TABLE favorite_books
ADD COLUMN publisher_address address;

UPDATE favorite_books
SET publisher_address = ROW('123 Book St', 'Libraryville', 'Bookland')
WHERE id = 1;

I tipi composti ti aiutano a organizzare i dati correlati più logicamente.

Tipi di intervallo

Quando hai bisogno di rappresentare un intervallo di valori:

CREATE TABLE hotel_bookings (
id serial PRIMARY KEY,
room_number integer,
stay daterange
);

INSERT INTO hotel_bookings (room_number, stay)
VALUES (101, '[2023-07-01, 2023-07-07)');

Il tipo daterange rende facile controllare le prenotazioni sovrapposte!

Tipi di identificatori oggetto

Questi tipi sono utilizzati internamente da PostgreSQL:

CREATE TABLE table_info (
table_name VARCHAR(50),
oid oid
);

INSERT INTO table_info (table_name, oid)
SELECT 'favorite_books', 'favorite_books'::regclass::oid;

Anche se potresti non usarli spesso, sono cruciali per le operazioni interne di PostgreSQL.

Tipi pseudonimi

Questi non sono tipi reali, ma vengono utilizzati nelle dichiarazioni di funzione:

CREATE FUNCTION multiply_any(anyelement, anyelement)
RETURNS anyelement AS $$
SELECT $1 * $2;
$$ LANGUAGE SQL;

SELECT multiply_any(5, 3);  -- Restituisce 15
SELECT multiply_any(5.5, 2);  -- Restituisce 11.0

I tipi pseudonimi come anyelement permettono definizioni di funzione più flessibili.

E вот что, miei curiosi studenti! Abbiamo esplorato il vasto paesaggio dei tipi di dati di PostgreSQL. Ricorda, scegliere il tipo di dati giusto è fondamentale per le prestazioni, l'efficienza di archiviazione e l'integrità dei dati. È come scegliere lo strumento giusto per il lavoro - non useresti un martello per appendere un quadro, vero?

Mentre continui il tuo viaggio con PostgreSQL, scoprirai sempre più sfumature e trucchetti con questi tipi di dati. Continua a sperimentare, rimani curioso e, soprattutto, divertiti con i tuoi database! Chi lo sa, potresti diventare il prossimo mago dei database in città. ?‍♂️?

Ora, vai avanti e crea database straordinari! E ricorda, nel mondo di PostgreSQL, ogni tipo di dati ha il suo posto - proprio come ogni libro ha il suo posto sulla scaffale di una biblioteca. Buon codice! ??

Credits: Image by storyset