A la primera lliçó vam definir el SGBD des de fora: el programari que s'interposa entre les aplicacions i els fitxers del disc. Ha arribat el moment d'obrir la caixa. Entendre què hi ha dins d'un gestor de bases de dades no és un luxe teòric: és el que et permetrà, més endavant, comprendre per què una consulta triga deu mil·lisegons i una altra gairebé idèntica en triga trenta segons, per què existeixen els índexs, què garanteix realment una transacció i què està passant quan alguna cosa es bloqueja.
La lliçó té dues parts. La primera és conceptual: els components interns d'un SGBD, el viatge complet d'una consulta, l'arquitectura de tres nivells que fa possible la independència de dades, la diferència entre client-servidor i incrustat, i els rols humans que treballen al voltant d'una base de dades. La segona és pràctica: en acabar-la tindràs PostgreSQL i SQLite instal·lats, sabràs connectar-te a tots dos i hauràs creat la base de dades biblioredb, on s'executarà tot el SQL de la resta del curs. No deixis aquesta lliçó a mitges: el mòdul 2 comença escrivint SQL, i necessitaràs l'entorn a punt.
Contingut
- Els components interns d'un SGBD
- El viatge d'una consulta, pas a pas
- L'arquitectura ANSI/SPARC de tres nivells
- Independència de dades lògica i física
- Client-servidor davant de base de dades incrustada
- Rols humans al voltant d'una base de dades
- Instal·lació de PostgreSQL
- Primers passos amb
psqli creació debiblioredb - Instal·lació i primers passos amb SQLite
- Alternatives: Docker i consoles en línia
- Errors habituals i consells
- Exercicis
- Conclusió
- Els components interns d'un SGBD
Un SGBD modern és un sistema complex, però s'organitza en un conjunt de components força estable, comuns a PostgreSQL, MySQL, Oracle o SQL Server (SQLite també els té tots, encara que en versió reduïda).
Gestor de connexions i control d'accés
És la porta d'entrada. Rep la connexió del client, autentica l'usuari (contrasenya, certificat, sistema operatiu) i li assigna una sessió. A partir d'aquí, cada operació passa pel control d'autorització: comprovar que aquest usuari té permís sobre aquesta taula i aquesta operació.
A BiblioRed, aquest component és el que farà que l'usuari del taulell pugui inserir préstecs però no esborrar socis. Els permisos en detall es veuen a la lliçó 06-04.
Processador i optimitzador de consultes
El cervell del sistema. Rep una consulta en SQL —un text que diu què es vol— i produeix un pla d'execució que diu com obtenir-ho. Les seves fases:
- Anàlisi sintàctica (parser): comprova que el SQL està ben escrit i el converteix en un arbre.
- Anàlisi semàntica: verifica contra el catàleg que les taules i columnes existeixen i que els tipus encaixen.
- Reescriptura: aplica transformacions equivalents (expandir vistes, simplificar condicions).
- Optimització: genera diversos plans possibles, estima el cost de cadascun fent servir estadístiques sobre les dades i tria el més barat.
- Execució: recorre el pla escollit i produeix les files.
Aquesta peça és l'herència directa de System R (lliçó 01-03) i és la que fa que SQL pugui ser declaratiu.
Motor d'emmagatzematge
És qui sap com són realment les dades al disc: en quins fitxers, organitzades en pàgines o blocs (habitualment de 4 o 8 KB), amb quin format de fila, i quins índexs existeixen per arribar abans a una fila concreta. Ofereix a la resta del sistema operacions elementals: "dóna'm la fila X", "recorre aquesta taula", "cerca en aquest índex".
Gestor de memòries intermèdies (memòria cau)
Llegir de disc és ordres de magnitud més lent que llegir de memòria. El gestor de memòries intermèdies manté a la RAM les pàgines més utilitzades i decideix quines expulsar quan falta espai. És responsable que la segona vegada que consultes alguna cosa sigui molt més ràpida que la primera.
A PostgreSQL aquest espai s'anomena shared buffers; a la pràctica, un servidor ben dimensionat serveix la immensa majoria de les lectures des de memòria.
Gestor de transaccions i recuperació
Garanteix que un conjunt d'operacions s'apliqui sencer o gens, fins i tot si es talla la llum a mitges. Es recolza en dos mecanismes:
- El registre d'escriptura anticipada (write-ahead log, WAL): abans de modificar les dades, s'escriu en un registre seqüencial el que es farà. Si el sistema cau, en arrencar es rellegeix aquest registre i es reconstrueix l'estat coherent.
- El control de concurrència: bloqueigs o versionat (PostgreSQL fa servir MVCC, Multi-Version Concurrency Control) perquè moltes sessions simultànies no es corrompin entre si.
És el que impedeix que dos taulells de BiblioRed prestin el mateix exemplar alhora. Les transaccions i els nivells d'aïllament són el contingut de les lliçons 06-01 i 06-02.
Catàleg o diccionari de dades
La base de dades sobre la mateixa base de dades: quines taules existeixen, amb quines columnes, tipus, restriccions, índexs, vistes, usuaris i permisos. I també estadístiques sobre les dades (quantes files té cada taula, com es distribueixen els valors), que l'optimitzador fa servir per decidir.
L'interessant és que en un sistema relacional el catàleg són taules normals, consultables amb SQL com qualsevol altra. A PostgreSQL viu a l'esquema information_schema i a les taules pg_catalog.
Utilitats
Al voltant del nucli hi ha eines de càrrega massiva, còpia de seguretat i restauració, replicació i monitoratge. Solen ser programes independents (pg_dump, pg_restore, psql).
- El viatge d'una consulta, pas a pas
Vegem el recorregut complet amb una consulta concreta de BiblioRed. Encara no cal entendre la sintaxi —això és el mòdul 2—; el que importa és el camí.
SELECT s.nom, l.titol, p.data_prestec
FROM prestecs p
JOIN socis s ON s.soci_id = p.soci_id
JOIN exemplars e ON e.exemplar_id = p.exemplar_id
JOIN llibres l ON l.llibre_id = e.llibre_id
WHERE p.data_devolucio IS NULL
AND e.sucursal_id = 2;En llenguatge planer: "digues-me quins préstecs continuen oberts a la sucursal Nord, amb el nom del soci i el títol del llibre".
flowchart TD
A["Client<br/>(psql o aplicació)"] --> B["Gestor de connexions<br/>autentica la sessió"]
B --> C["Parser<br/>valida sintaxi, construeix arbre"]
C --> D["Analitzador semàntic<br/>consulta el catàleg:<br/>existeixen taules i columnes?"]
D --> E["Reescriptor<br/>expandeix vistes, simplifica"]
E --> F["Optimitzador<br/>genera plans i estima costos"]
F --> G["Executor<br/>recorre el pla escollit"]
G --> H["Gestor de memòries intermèdies<br/>és la pàgina a la RAM?"]
H -->|Sí| J["Motor d'emmagatzematge<br/>retorna les files"]
H -->|No| I[("Disc<br/>llegeix la pàgina")]
I --> J
J --> K["Control d'accés<br/>filtra segons permisos"]
K --> A
D -.->|consulta| CAT[("Catàleg<br/>pg_catalog")]
F -.->|estadístiques| CAT
G -.->|visibilitat de files| T["Gestor de transaccions<br/>MVCC"]
Recorrem les decisions interessants:
-
Connexió i autenticació. El client obre una sessió. A PostgreSQL, el procés principal llança un procés dedicat per atendre-la.
-
Parser. Si vas escriure
SELCTen comptes deSELECT, aquí s'atura amb un error de sintaxi. Encara no s'ha mirat cap dada. -
Anàlisi semàntica. Es consulta el catàleg: existeix la taula
prestecs? té columnadata_devolucio?e.sucursal_idés comparable amb el número 2? Els errors de "columna inexistent" neixen aquí. -
Reescriptura. Si
prestecsfos una vista, se substituiria per la seva definició. -
Optimització. Aquí hi ha el més substanciós. El sistema ha de decidir, entre moltes opcions:
- En quin ordre unir les quatre taules? Unir primer
prestecsambexemplarsfiltrant per sucursal pot deixar 300 files; començar perllibresen deixaria 40.000. L'ordre canvia el temps d'execució en ordres de magnitud. - Recórrer la taula sencera (sequential scan) o fer servir un índex? Si només hi ha 300 préstecs oberts entre un milió de files històriques, un índex guanya; si cal llegir el 80 % de la taula, recórrer-la sencera és més ràpid.
- Quin algorisme d'unió? Bucle imbricat, unió per barreja o unió per dispersió (hash join), segons les mides.
Aquestes decisions es prenen amb les estadístiques del catàleg. Per això una base de dades amb estadístiques desactualitzades tria malament. A la lliçó 06-03 aprendràs a llegir el pla escollit amb
EXPLAIN. - En quin ordre unir les quatre taules? Unir primer
-
Execució. L'executor recorre el pla demanant pàgines. Cada petició passa pel gestor de memòries intermèdies: si la pàgina és a la memòria, se serveix a l'instant; si no, es llegeix de disc i es desa a la memòria cau.
-
Visibilitat transaccional. Cada fila candidata es comprova contra el gestor de transaccions: sota MVCC, una fila modificada per una transacció encara no confirmada no és visible per a aquesta sessió. Així es llegeix sense bloquejar qui escriu.
-
Permisos i resultat. Es verifica que l'usuari pot llegir aquestes taules i les files viatgen de tornada al client.
La idea que t'ha de quedar: tu escrius el què; el SGBD decideix el com, i aquesta decisió és on es juga el rendiment. És exactament la independència que va proposar Codd, funcionant.
- L'arquitectura ANSI/SPARC de tres nivells
El 1975, el comitè ANSI/X3/SPARC va proposar un marc per organitzar qualsevol SGBD en tres nivells d'abstracció. Continua sent la referència conceptual amb què s'expliquen les bases de dades, perquè descriu per què es pot canviar una capa sense trencar les altres.
flowchart TD
subgraph EXT["Nivell extern (vistes)"]
V1["Vista taulell<br/>préstecs i socis<br/>de la meva sucursal"]
V2["Vista catàleg públic<br/>títol, autor,<br/>disponibilitat"]
V3["Vista direcció<br/>estadístiques agregades,<br/>sense dades personals"]
end
subgraph CON["Nivell conceptual (esquema lògic)"]
C["Totes les taules de BiblioRed:<br/>socis, llibres, exemplars,<br/>prestecs, reserves, sucursals,<br/>amb les seves relacions i restriccions"]
end
subgraph INT["Nivell intern (esquema físic)"]
I["Fitxers, pàgines, format de fila,<br/>índexs B-tree, compressió,<br/>ubicació al disc"]
end
V1 --> C
V2 --> C
V3 --> C
C --> I
I --> D[("Disc")]
Nivell extern (o de vistes)
El que cada tipus d'usuari veu. No n'hi ha un de sol: n'hi ha tants com perfils d'ús. Cada vista externa mostra un subconjunt de les dades, potser reorganitzat o calculat, i amaga la resta.
A BiblioRed:
- El taulell veu els préstecs i els socis de la seva sucursal, amb les dades de contacte necessàries per reclamar una devolució.
- El catàleg públic del web veu títol, autor, portada i disponibilitat. No veu qui té prestat cada exemplar: seria una bretxa de privacitat.
- La direcció veu totals agregats per sucursal i mes, sense noms de socis.
Els tres perfils estan mirant les mateixes dades, presentades de manera diferent.
Nivell conceptual (o lògic)
La descripció completa i única de quines dades conté la base de dades: totes les entitats, tots els atributs, totes les relacions i totes les restriccions d'integritat. És independent de qui les faci servir i de com es guardin.
És el nivell on treballa el dissenyador, i el que produirem al mòdul 4 amb els diagrames entitat-relació i la seva transformació a esquema relacional.
Nivell intern (o físic)
Com s'emmagatzema realment: quins fitxers hi ha, com s'agrupen les files en pàgines, quins índexs existeixen i de quin tipus, què es comprimeix, a quin disc viu cada taula.
És responsabilitat de l'administrador i del mateix SGBD, i l'usuari normal no hauria de necessitar conèixer-lo per escriure consultes correctes (sí per escriure-les ràpides, i d'aquí la lliçó 06-03).
| Nivell | Respon a | Qui el gestiona | Exemple a BiblioRed |
|---|---|---|---|
| Extern | Què veu cada usuari? | Desenvolupador d'aplicacions | Vista cataleg_public sense dades personals |
| Conceptual | Quines dades hi ha i com es relacionen? | Dissenyador / administrador | Taules socis, llibres, exemplars, prestecs |
| Intern | Com es guarda físicament? | SGBD i administrador | Índex B-tree sobre prestecs.soci_id, pàgines de 8 KB |
- Independència de dades lògica i física
El motiu d'existir dels tres nivells són les dues independències. Són la propietat més valuosa d'un SGBD, i la que faltava per complet en els models anteriors al relacional.
Independència física
Es pot canviar el nivell intern sense tocar el nivell conceptual ni les aplicacions.
Exemples a BiblioRed:
- L'administrador crea un índex sobre
prestecs.data_prestecperquè els informes mensuals van lents. Cap consulta no canvia; simplement passen a executar-se més ràpid. - Es mou la taula històrica de préstecs a un disc diferent, o es comprimeix. Les aplicacions no se n'assabenten.
- Es migra el servidor a un altre emmagatzematge. El SQL continua sent el mateix.
Aquesta independència és molt sòlida en els SGBD actuals: és pràcticament total.
Independència lògica
Es pot canviar el nivell conceptual sense tocar les vistes externes ni les aplicacions que les fan servir.
Exemples a BiblioRed:
- Es decideix dividir la taula
socisensocisisocis_contacteper separar les dades personals. Si les aplicacions consulten una vista anomenadasocisque reuneix totes dues taules, continuen funcionant sense canvis. - S'afegeix una columna
idioma_preferitasocis. Cap aplicació existent no es veu afectada, perquè cap no la demanava. - S'afegeix l'entitat
reserves, nova al sistema. Les aplicacions de préstecs ni se n'assabenten.
Aquesta independència és més difícil d'assolir que la física, i només s'aconsegueix si s'ha tingut la disciplina que les aplicacions accedeixin a través de vistes en comptes de directament a les taules. És una decisió de disseny, no un regal del sistema.
| Independència física | Independència lògica | |
|---|---|---|
| Què canvia | Com s'emmagatzema | Quina estructura lògica hi ha |
| Què queda intacte | Esquema conceptual i aplicacions | Vistes externes i aplicacions |
| Exemple | Afegir un índex, comprimir, canviar de disc | Dividir una taula, afegir una columna |
| Dificultat real | Baixa: gairebé total | Mitjana: requereix fer servir vistes |
- Client-servidor davant de base de dades incrustada
Els dos gestors del curs representen els dos extrems de l'arquitectura de desplegament, i comparar-los aclareix molt.
Arquitectura client-servidor: PostgreSQL
El SGBD és un procés independent —sovint en una altra màquina— que escolta en un port de xarxa (5432 a PostgreSQL). Els clients es connecten per xarxa, envien SQL i reben resultats.
flowchart LR
A["App web<br/>BiblioRed"] -->|"TCP :5432"| S["Procés servidor<br/>PostgreSQL"]
B["psql de<br/>l'administrador"] -->|"TCP :5432"| S
C["Terminal del<br/>taulell Nord"] -->|"TCP :5432"| S
S --> D[("Fitxers de dades")]
Implica:
- Accés concurrent real des de moltes màquines, gestionat pel servidor.
- Control d'accés centralitzat: usuaris, rols i permisos.
- Administració: cal instal·lar-lo, arrencar-lo, configurar-lo, actualitzar-lo i fer-ne còpies (o pagar algú que ho faci, com vam veure amb els serveis gestionats a la lliçó 01-03).
- Latència de xarxa a cada operació, normalment menyspreable però no nul·la.
Arquitectura incrustada: SQLite
No hi ha servidor. El motor és una biblioteca enllaçada dins del mateix programa, i la base de dades sencera és un fitxer al disc local. Quan la teva aplicació consulta, no parla per xarxa: crida una funció.
flowchart LR
subgraph P["Un sol procés"]
A["Aplicació"] --> L["Biblioteca SQLite"]
end
L --> F[("biblioredb.sqlite<br/>un fitxer")]
Implica:
- Zero administració: no hi ha servei, ni port, ni usuaris. Copiar la base de dades és copiar un fitxer.
- Latència mínima: no hi ha xarxa ni serialització entre processos.
- Concurrència limitada: molts lectors simultanis sí, però un sol escriptor alhora sobre el fitxer.
- Sense control d'accés propi: la seguretat és la del sistema de fitxers. Qui pot llegir el fitxer, ho llegeix tot.
Comparació
| PostgreSQL (client-servidor) | SQLite (incrustada) | |
|---|---|---|
| Procés | Servidor independent | Biblioteca dins de l'app |
| Accés | Per xarxa (port 5432) | Crida a funció, fitxer local |
| Concurrència d'escriptura | Alta, moltes sessions | Un escriptor alhora |
| Usuaris i permisos | Sí, complets | No (permisos del sistema de fitxers) |
| Administració | Necessària | Pràcticament nul·la |
| Còpia de seguretat | pg_dump, WAL, rèpliques |
Copiar el fitxer |
| Ús típic | Servidor d'aplicació, sistema multiusuari | Apps d'escriptori i mòbils, proves, aprenentatge |
| A BiblioRed | El sistema real en producció | Practicar i prototipar |
Cap no és millor que l'altra: resolen problemes diferents. SQLite és, de bon tros, el motor de base de dades més desplegat del món (és a cada telèfon, cada navegador i cada avió), i no competeix amb PostgreSQL: competeix amb fopen().
Per a BiblioRed en producció l'elecció és PostgreSQL, perquè hi ha quatre sucursals escrivint alhora i dades personals per protegir. Per aprendre, SQLite és perfecte i per això el tindrem com a alternativa durant tot el curs.
- Rols humans al voltant d'una base de dades
En una organització petita una sola persona fa els tres papers; en una de gran són equips diferents. Convé saber què s'espera de cadascun.
Administrador de bases de dades (DBA)
Responsable que el sistema funcioni, sigui segur i no perdi dades:
- Instal·lar, configurar i actualitzar el SGBD.
- Definir usuaris, rols i permisos.
- Planificar i provar les còpies de seguretat i la restauració (una còpia no verificada no és una còpia).
- Monitorar el rendiment, ajustar la configuració i crear índexs.
- Planificar capacitat, replicació i recuperació davant de desastres.
A BiblioRed seria qui garanteix que el servidor de la sucursal central tingui còpia cada nit i que el personal només vegi el que li pertoca.
Desenvolupador de bases de dades / d'aplicacions
Responsable que l'esquema i les consultes siguin correctes i eficients:
- Dissenyar taules, relacions i restriccions (mòduls 4 i 5).
- Escriure i optimitzar consultes SQL.
- Gestionar les migracions d'esquema amb control de versions.
- Integrar la base de dades amb l'aplicació.
És el rol per al qual aquest curs prepara de manera més directa.
Analista de dades
Responsable d'extreure informació de les dades existents:
- Escriure consultes d'anàlisi i agregació (lliçó 02-05).
- Construir informes i quadres de comandament.
- Detectar problemes de qualitat de dades.
A BiblioRed, qui respon a "quins gèneres convé reforçar a la sucursal Sud?".
| Rol | Pregunta que respon | Eines típiques |
|---|---|---|
| DBA | És disponible, segur i té còpia? | psql, configuració, monitoratge, pg_dump |
| Desenvolupador | El model és correcte i les consultes eficients? | SQL, migracions, ORM, EXPLAIN |
| Analista | Què ens diuen les dades? | SQL analític, eines de visualització |
Un quart rol, l'arquitecte de dades, decideix en sistemes grans quines tecnologies es fan servir i com s'integren; és qui prendria les decisions de la lliçó 01-02.
- Instal·lació de PostgreSQL
A partir d'aquí, mans a l'obra. Tria el teu sistema operatiu.
Linux (Debian / Ubuntu)
# Actualitzar l'índex de paquets i instal·lar servidor i client
sudo apt update
sudo apt install -y postgresql postgresql-contrib
# Comprovar que el servei està actiu
sudo systemctl status postgresqlpostgresql instal·la el servidor; postgresql-contrib afegeix extensions útils. A Debian i Ubuntu el servei arrenca sol després de la instal·lació.
Linux (Fedora / RHEL)
sudo dnf install -y postgresql-server postgresql-contrib
# A Fedora cal inicialitzar el directori de dades a mà
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresqlmacOS
L'alternativa gràfica és Postgres.app, que es descarrega, s'arrossega a Aplicacions i arrenca amb un clic. És l'opció més còmoda si prefereixes no fer servir Homebrew.
Windows
- Descarrega l'instal·lador d'EDB des de
postgresql.org/download/windows. - Executa'l i accepta les opcions per defecte, anotant la contrasenya que defineixis per a l'usuari
postgres: la necessitaràs per connectar-te. - Deixa marcat pgAdmin si vols una interfície gràfica, i Command Line Tools (imprescindible, inclou
psql).
Després, des del menú d'inici, obre SQL Shell (psql) i prem Enter a cada pregunta fins a la contrasenya.
Comprovar la versió
En qualsevol sistema, verifica que el client respon:
Si l'ordre no es troba a macOS amb Homebrew, afegeix el directori al PATH:
- Primers passos amb
psql i creació de biblioredb
psql i creació de biblioredbpsql és el client de línia d'ordres de PostgreSQL. És l'eina que farem servir durant tot el curs: és la més directa i la que està disponible a qualsevol servidor.
Connectar-se
A Linux, la instal·lació crea un usuari del sistema anomenat postgres que és el superusuari de la base de dades:
A macOS amb Homebrew, el teu propi usuari sol ser superusuari:
A Windows, fes servir l'accés directe SQL Shell (psql).
Veuràs un avís com aquest:
El prompt postgres=# indica: base de dades actual postgres, i # significa superusuari (un > indicaria usuari normal).
Comprovar la versió des de dins
version ---------------------------------------------------------------- PostgreSQL 16.2 on x86_64-pc-linux-gnu, compiled by gcc 12.2.0 (1 row)
Fixa't en dues coses: la instrucció acaba en punt i coma (sense ell, psql esperarà més text), i el resultat es presenta com una taula amb el nombre de files al final.
Crear un usuari propi (recomanat a Linux)
Treballar sempre com a superusuari és mala pràctica. Crea un usuari amb el teu nom:
CREATEDB li permet crear bases de dades, que és el que necessitem.
Crear la base de dades del curs
Aquesta resposta escarida és la confirmació que ha funcionat. biblioredb és la base de dades on executarem tot el SQL del curs: les taules de socis, llibres, exemplars i préstecs que dissenyarem a partir del mòdul 2 viuran aquí.
Metaordres essencials de psql
Les ordres que comencen per barra invertida no són SQL: són instruccions per al client psql i no porten punt i coma.
| Metaordre | Què fa |
|---|---|
\l |
Llista les bases de dades del servidor |
\c biblioredb |
Es connecta a la base de dades indicada |
\dt |
Llista les taules de la base de dades actual |
\d nom_taula |
Descriu una taula: columnes, tipus, índexs |
\du |
Llista els usuaris i rols |
\conninfo |
Mostra a quina base i amb quin usuari estàs connectat |
\x |
Alterna la sortida a format vertical (útil amb moltes columnes) |
\? |
Ajuda de les metaordres |
\h SELECT |
Ajuda de sintaxi SQL d'una instrucció |
\q |
Sortir |
Provem-les:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype |
------------+----------+----------+-------------+-------------+
biblioredb | alumne | UTF8 | ca_ES.UTF-8 | ca_ES.UTF-8 |
postgres | postgres | UTF8 | ca_ES.UTF-8 | ca_ES.UTF-8 |
template0 | postgres | UTF8 | ca_ES.UTF-8 | ca_ES.UTF-8 |
template1 | postgres | UTF8 | ca_ES.UTF-8 | ca_ES.UTF-8 |
(4 rows)Aquí està biblioredb. Les bases template0 i template1 són plantilles internes del sistema: no les toquis.
postgres=# \c biblioredb You are now connected to database "biblioredb" as user "postgres". biblioredb=# \dt Did not find any relations.
El prompt ha canviat a biblioredb=#: ja som a dins. I \dt diu que no hi ha taules, cosa que és correcta: la base de dades és buida i l'omplirem al mòdul 2.
Connectar-se directament des del terminal
Per a les properes sessions, estalvia passos connectant-te d'un sol cop:
-U alumne: usuari.-d biblioredb: base de dades.-h localhost: servidor (necessari perquè demani contrasenya en comptes de fer servir l'autenticació del sistema).
També pots executar una consulta sense entrar a la sessió interactiva:
- Instal·lació i primers passos amb SQLite
SQLite és el pla B (i de vegades el pla A) per practicar: no hi ha servidor que arrencar.
Instal·lació
# Debian / Ubuntu
sudo apt install -y sqlite3
# Fedora / RHEL
sudo dnf install -y sqlite
# macOS: ve preinstal·lat; per a la versió més recent
brew install sqliteA Windows, descarrega el paquet sqlite-tools des de sqlite.org/download.html, descomprimeix-lo en una carpeta (per exemple C:\sqlite) i afegeix aquesta carpeta al PATH, o simplement executa sqlite3.exe des d'allà.
Comprovar la versió
Crear la base de dades del curs
A SQLite, crear una base de dades és crear un fitxer. No hi ha CREATE DATABASE:
Un detall important: el fitxer no es crea al disc fins que hi escriguis alguna cosa a dins. Si surts sense crear cap taula, no hi haurà fitxer.
Metaordres essencials de sqlite3
Aquí les ordres del client comencen per punt, no per barra invertida:
| Metaordre | Què fa | Equivalent a psql |
|---|---|---|
.tables |
Llista les taules | \dt |
.schema taula |
Mostra el SQL de creació d'una taula | \d taula |
.databases |
Mostra els fitxers de base de dades oberts | \l (parcialment) |
.open fitxer.sqlite |
Obre una altra base de dades | \c |
.headers on |
Mostra els noms de columna als resultats | (per defecte a psql) |
.mode box |
Formata la sortida com a taula amb vores | (per defecte a psql) |
.help |
Ajuda | \? |
.quit |
Sortir | \q |
Els dos primers que hauries d'executar sempre en obrir sqlite3, perquè la sortida per defecte és molt austera:
sqlite> .headers on sqlite> .mode box sqlite> SELECT sqlite_version(); ┌──────────────────┐ │ sqlite_version() │ ├──────────────────┤ │ 3.45.1 │ └──────────────────┘
Buit, com esperàvem.
Perquè .headers on i .mode box s'apliquin sempre, crea un fitxer .sqliterc a la teva carpeta personal amb aquestes dues línies.
Diferències que convé saber des d'ara
| PostgreSQL | SQLite | |
|---|---|---|
| Crear base de dades | CREATE DATABASE nom; |
Obrir un fitxer nou |
| Metaordres | \l, \c, \dt, \d |
.databases, .open, .tables, .schema |
| Tipus de dades | Estrictes: una columna INTEGER rebutja text |
Flexibles per defecte: accepta gairebé qualsevol valor |
| Usuaris | Sí | No |
| Sortir | \q |
.quit |
La diferència de tipus és la més rellevant per aprendre: SQLite és permissiu i deixarà passar coses que PostgreSQL rebutjaria. Si practiques a SQLite, sigues conscient que PostgreSQL serà més estricte — i aquesta estrictesa és una virtut, no un obstacle, com vam veure a la lliçó 01-01.
- Alternatives: Docker i consoles en línia
Si no pots o no vols instal·lar res al teu equip, hi ha dues sortides perfectament vàlides.
Docker
Aixeca un PostgreSQL exprés en un contenidor:
# Descarregar i arrencar un PostgreSQL 16 en segon pla
docker run --name pg-biblioredb \
-e POSTGRES_PASSWORD=biblioRed2026 \
-e POSTGRES_DB=biblioredb \
-p 5432:5432 \
-d postgres:16Què fa cada opció:
--name pg-biblioredb: nom del contenidor, per referir-t'hi després.-e POSTGRES_PASSWORD=...: contrasenya de l'usuaripostgres(obligatòria).-e POSTGRES_DB=biblioredb: crea la base de dades del curs en arrencar.-p 5432:5432: exposa el port a la teva màquina.-d: en segon pla.
Per entrar amb psql sense instal·lar-lo localment:
Gestió del contenidor:
docker stop pg-biblioredb # aturar
docker start pg-biblioredb # tornar a arrencar (les dades continuen allà)
docker rm -f pg-biblioredb # eliminar: ES PERDEN LES DADESTingues present aquest darrer advertiment: sense un volum muntat, esborrar el contenidor esborra la base de dades.
Consoles SQL en línia
Sense instal·lar absolutament res, serveixen per seguir el curs i fer els exercicis:
- db-fiddle.com i sqliteonline.com: permeten triar PostgreSQL o SQLite i executar SQL al navegador.
- pgexercises.com: PostgreSQL amb exercicis integrats.
La seva limitació és que no persisteixen entre sessions: guarda els teus scripts en un fitxer .sql a part. Per al mòdul 2 són suficients; per treballar amb comoditat a partir del mòdul 4, és preferible una instal·lació local o Docker.
Interfícies gràfiques (opcional)
Si prefereixes una interfície visual, pgAdmin (ve amb l'instal·lador de Windows), DBeaver (multiplataforma, serveix per a PostgreSQL, SQLite i MongoDB) o DB Browser for SQLite són bones opcions. Recomanació: aprèn primer amb psql i sqlite3. La línia d'ordres t'obliga a entendre el que passa i està disponible a qualsevol servidor al qual et connectis.
Errors Habituals i Consells
- Oblidar el punt i coma a
psql. Si escriusSELECT version()i prems Enter, el prompt canvia apostgres-#i sembla que s'ha penjat. No ho està: espera que acabis la instrucció. Escriu;i Enter. - Confondre metaordres amb SQL.
\dtno porta punt i coma i només funciona apsql;.tablesnomés funciona asqlite3. No formen part del llenguatge SQL i no funcionen des d'una aplicació. psql: FATAL: role "tu_usuario" does not exista Linux. Passa en executarpsqla seques: PostgreSQL intenta autenticar-te amb el nom del teu usuari del sistema, que no existeix com a rol. Solució:sudo -u postgres psqli crea el teu usuari, com a l'apartat 8.could not connect to server. El servidor no està arrencat. Comprova-ho ambsudo systemctl status postgresql(Linux) obrew services list(macOS) i arrenca'l si cal.- Creure que SQLite crea el fitxer en obrir-lo. Només es materialitza quan hi escrius alguna cosa. Si
lsno mostrabiblioredb.sqlite, no és cap fallada: és que encara no has creat cap taula. - Practicar només a SQLite i endur-se una sorpresa. SQLite accepta text en una columna
INTEGER; PostgreSQL no. Si l'objectiu és treballar amb PostgreSQL, practica a PostgreSQL sempre que puguis. - Treballar sempre com a superusuari. Funciona, però no ensenya res sobre permisos i en un entorn real és perillós. Crear un usuari
alumnecosta una línia. - Consell: guarda les teves consultes en fitxers
.sqldes del primer dia, i executa'ls ambpsql -f script.sqlo amb.read script.sqla SQLite. Tenir la feina en fitxers versionables és la diferència entre practicar i construir alguna cosa.
Exercicis
Exercici 1: Identificar el component responsable
Per a cada situació, indica quin component del SGBD intervé principalment i en quin nivell ANSI/SPARC se situa el canvi (si escau):
- Escrius
SELCT * FROM socis;i reps un error de sintaxi. - Escrius
SELECT nom FROM socsi;i reps "la relació no existeix". - La mateixa consulta triga 400 ms la primera vegada i 8 ms la segona.
- L'administrador crea un índex i un informe passa de 30 s a 0,2 s, sense canviar la consulta.
- Es talla la llum a mitja realització d'un préstec i, en arrencar, la base de dades és coherent.
- L'usuari del taulell executa
DELETE FROM socis;i rep "permís denegat". - Es divideix la taula
socisen dues, però les aplicacions continuen funcionant gràcies a una vista.
Exercici 2: Verificar l'entorn
Fes aquestes comprovacions i anota la sortida de cadascuna:
- Comprova la versió de
psqldes del terminal. - Connecta't a PostgreSQL i mostra la versió del servidor amb SQL.
- Crea la base de dades
biblioredbsi encara no la tens, i comprova amb una metaordre que apareix al llistat. - Connecta't a
biblioredbi comprova que no té taules. - Amb SQLite, crea
biblioredb.sqlite, activa capçaleres i mode taula, i mostra la versió. - A
psql, esbrina a quina base de dades i amb quin usuari estàs connectat fent servir una sola metaordre.
Exercici 3: Triar arquitectura
Per a cada escenari, decideix entre PostgreSQL (client-servidor) i SQLite (incrustada), i justifica-ho en dues frases:
- El sistema real de BiblioRed, amb quatre sucursals registrant préstecs simultàniament.
- Una aplicació mòbil que permet als socis consultar el seu historial sense connexió a internet.
- Les proves automatitzades de l'aplicació de BiblioRed, que han de crear i destruir una base de dades neta a cada execució.
- Un tauler de direcció al qual accedeixen vuit persones des d'edificis diferents.
- Un programa d'escriptori que un bibliotecari fa servir per preparar l'inventari anual al seu portàtil.
Solucions
Solució 1
| # | Component | Nivell ANSI/SPARC |
|---|---|---|
| 1 | Parser (anàlisi sintàctica). L'error es detecta abans de mirar el catàleg o les dades. | No aplica: és previ |
| 2 | Analitzador semàntic, consultant el catàleg. La sintaxi és correcta, però la taula socsi no existeix. |
Conceptual (s'hi comprova) |
| 3 | Gestor de memòries intermèdies. La primera execució llegeix de disc; la segona troba les pàgines a la memòria. | Intern |
| 4 | Optimitzador i motor d'emmagatzematge. És un exemple pur d'independència física: canvia el nivell intern i cap consulta no es modifica. | Intern |
| 5 | Gestor de transaccions i recuperació, mitjançant el registre d'escriptura anticipada (WAL). | Intern |
| 6 | Control d'accés (autorització). | Extern/conceptual, segons com s'hagin definit els permisos |
| 7 | Canvi a l'esquema conceptual absorbit pel nivell extern: és un exemple d'independència lògica. | Conceptual, amb vistes externes intactes |
Solució 2
biblioredb ha d'aparèixer al llistat.
-- 4 postgres=# \c biblioredb You are now connected to database "biblioredb". biblioredb=# \dt Did not find any relations.
-- 6 biblioredb=# \conninfo You are connected to database "biblioredb" as user "alumne" on host "localhost" at port "5432".
Si els sis passos funcionen, tens l'entorn del curs a punt.
Solució 3
| # | Elecció | Justificació |
|---|---|---|
| 1 | PostgreSQL | Quatre sucursals escrivint alhora exigeixen concurrència d'escriptura real i control d'accés centralitzat; SQLite admet un únic escriptor. |
| 2 | SQLite | És un magatzem local per dispositiu, sense connexió i d'un sol usuari. És exactament el cas per al qual es va dissenyar el model incrustat. |
| 3 | SQLite | Crear i destruir un fitxer (o una base en memòria) és instantani i no requereix servidor, cosa que fa les proves ràpides i aïllades. Convé validar també contra PostgreSQL abans de desplegar, perquè els tipus són més estrictes allà. |
| 4 | PostgreSQL | Accés remot des de diverses màquines i necessitat de permisos per rol: és client-servidor per definició. |
| 5 | SQLite | Un usuari, una màquina, feina local i sense administració. Les dades se sincronitzarien després amb el sistema central. |
Conclusió
Amb aquesta lliçó tanquem el mòdul introductori, i ho fem amb l'entorn de treball en marxa. Hem vist:
- Els components interns d'un SGBD: gestor de connexions i control d'accés, processador i optimitzador de consultes, motor d'emmagatzematge, gestor de memòries intermèdies, gestor de transaccions i recuperació, i catàleg de dades.
- El viatge complet d'una consulta, des de l'anàlisi sintàctica fins a les files retornades, amb l'optimització basada en costos com a peça decisiva del rendiment.
- L'arquitectura ANSI/SPARC de tres nivells —extern, conceptual i intern— i les dues independències de dades: la física (canviar l'emmagatzematge sense tocar les consultes) i la lògica (canviar l'esquema sense trencar les aplicacions que fan servir vistes).
- La diferència entre client-servidor i incrustat, amb PostgreSQL i SQLite com a representants de cada extrem, i per què BiblioRed farà servir el primer en producció i el segon per practicar.
- Els rols humans: administrador, desenvolupador i analista.
- I, a la pràctica: instal·lació de PostgreSQL i SQLite a Linux, macOS i Windows, connexió amb
psqlisqlite3, comprovació de versions, creació de la base de dadesbiblioredbi maneig de les metaordres bàsiques (\l,\c,\dt,\d,.tables,.schema), a més de les alternatives amb Docker i consoles en línia.
Ja sabem què és una base de dades i quins problemes resol, quines famílies existeixen i com triar entre elles, d'on ve tot això, què passa dins del gestor i com s'organitza. I, sobretot, tenim biblioredb esperant, buida. Al mòdul 2, Bases de Dades Relacionals, comencem a omplir-la: la lliçó 02-01, Model Relacional, formalitza què és exactament una relació, què són les claus primàries i foranes i quines regles d'integritat regeixen el model; a partir d'aquí, la lliçó 02-02 introdueix SQL i escriurem les primeres instruccions reals sobre les taules de socis, llibres, exemplars i préstecs de BiblioRed. La teoria s'acaba aquí; a partir de la propera lliçó, es tecleja.
Fonaments de Bases de Dades
Mòdul 1: Introducció a les Bases de Dades
- Conceptes Bàsics de Bases de Dades
- Tipus de Bases de Dades
- Història i Evolució de les Bases de Dades
- Sistemes Gestors de Bases de Dades i Arquitectura
Mòdul 2: Bases de Dades Relacionals
- Model Relacional
- Llenguatge SQL
- Operacions Bàsiques en SQL
- Consultes Multitaula: JOIN i Subconsultes
- Agregació i Agrupació de Dades
- Integritat Referencial
Mòdul 3: Bases de Dades No Relacionals
- Introducció a NoSQL
- Tipus de Bases de Dades NoSQL
- Modelatge de Dades en NoSQL
- Comparació entre Bases de Dades Relacionals i No Relacionals
Mòdul 4: Disseny d'Esquemes
- Principis de Disseny d'Esquemes
- Diagrames Entitat-Relació (ER)
- Transformació de Diagrames ER a Esquemes Relacionals
- Tipus de Dades i Restriccions
Mòdul 5: Normalització
Mòdul 6: Transaccions, Rendiment i Seguretat
- Transaccions i Propietats ACID
- Concurrència i Nivells d'Aïllament
- Índexs i Optimització de Consultes
- Seguretat, Permisos i Còpies de Seguretat
Mòdul 7: Exercicis Pràctics
- Exercicis de SQL
- Exercicis de Disseny d'Esquemes
- Exercicis de Normalització
- Exercicis de Consultes Avançades i Transaccions
Mòdul 8: Casos d'Estudi
- Cas d'Estudi: Base de Dades Relacional
- Cas d'Estudi: Base de Dades No Relacional
- Cas d'Estudi: Persistència Poliglota
