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!
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
utilizzaserial
, che si incrementa automaticamente per ogni nuova voce. -
publication_year
utilizzasmallint
perché i libri non sono così vecchi (mi dispiace, per gli antichi rotoli!). -
pages
utilizzainteger
per la lunghezza dei libri. -
isbn
utilizzabigint
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