1. Conceptes Teòrics i Casos d’Ús
Perquè la nostra base de dades funcioni sense errors, hem de seguir uns criteris clau a l’hora de triar les nostres claus:
- Clau Primària (PK): Un codi únic per a cada registre (fila). No es pot repetir mai i no pot estar buit (NOT NULL). Utilitzarem números que s’autoincrementen sols (
AUTO_INCREMENT). - Clau Forana (FK): Un camp que connecta una taula amb una altra. Serveix per enllaçar les dades i el sistema comprova que la dada connectada existeixi de veritat.
Relacions del Nostre Sistema
Usuari → Ticket (Relació 1:N)
- Explicació: Un usuari de la LAN Party pot obrir molts tickets d’incidència (per exemple: «No em funciona Internet», «Falta una cadira»).
- Com es connecten: La taula
ticketsté el campuser_idque apunta a la PK deusers. - Regla d’esborrat (ON DELETE RESTRICT): No podem esborrar un usuari de la base de dades si encara té tickets oberts. Primer s’haurien de tancar o gestionar els seus tickets.
Tècnic → Ticket (Relació 1:N)
- Explicació: Un tècnic de l’organització pot tenir assignats molts tickets de programari o xarxes, pero cada ticket només el repara un tècnic alhora.
- Com es connecten: La taula
ticketsté un camptechnician_idque apunta a la taulatechnicians. - Regla d’esborrat (ON DELETE SET NULL): Si un tècnic plega i l’esborrem del sistema, el ticket no s’esborra; simplement es queda en blanc (
NULL) esperant que s’assigni a un altre tècnic.
Usuari → Tècnic (Relació 1:1)
- Explicació: Un tècnic és, primer de tot, un usuari registrat a la LAN Party, però té un perfil especial amb eines de reparació.
- Com es connecten: El camp
user_idde la taulatechniciansés una FK que apunta ausers, però a més ésUNIQUE(únic), de manera que un usuari no pot ser dos tècnics alhora. - Regla d’esborrat (ON DELETE CASCADE): Si esborrem l’usuari del sistema, automàticament s’esborra la seva fitxa de tècnic.
2. Disseny de les Taules (Model Relacional)
A sota pots veure com es connecten les 4 taules principals del sistema LAN Party per garantir que cap dada es quedi perduda o incorrecta:
[users] (1) ————< (N) [tickets] (N) >———— (1) [zones]
| ^
| (1) |
v | (N)
[technicians] (1) ———————————+
[tickets] (1) ————< (N) [ticket_comments]
| ^
| (1) |
v | (N)
[technicians] (1) ———————————+
[tickets] (1) ————< (N) [ticket_comments]
3. Codi SQL per a la creació (Implementació)
Aquest és el codi en llenguatge SQL adaptat per introduir-lo directament a phpMyAdmin o MySQL Workbench a les pràctiques de classe:
-- 1. CREACIÓ DE LA TAULA USUARIS
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(100) NOT NULL,
phone VARCHAR(20),
role VARCHAR(20) DEFAULT 'assistant'
);
-- 2. CREACIÓ DE LA TAULA TÈCNICS (Depèn de users)
CREATE TABLE technicians (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT UNIQUE NOT NULL, -- UNIQUE fa que la relació sigui 1:1
specialization VARCHAR(50) DEFAULT 'Xarxes',
is_available BOOLEAN DEFAULT TRUE,
-- Unió amb la taula users
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
-- 3. CREACIÓ DE LA TAULA ZONES (Ubicacions de la LAN Party)
CREATE TABLE zones (
id INT PRIMARY KEY AUTO_INCREMENT,
zone_name VARCHAR(50) NOT NULL UNIQUE,
capacity INT
);
-- 4. CREACIÓ DE LA TAULA TICKETS (Depèn de users, technicians i zones)
CREATE TABLE tickets (
id INT PRIMARY KEY AUTO_INCREMENT,
ticket_number VARCHAR(20) NOT NULL UNIQUE,
title VARCHAR(150) NOT NULL,
description TEXT NOT NULL,
priority VARCHAR(10) DEFAULT 'Media',
status VARCHAR(15) DEFAULT 'Obert',
user_id INT NOT NULL,
technician_id INT,
zone_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Definició de Claus Foranes i normes de seguretat d'esborrat
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT,
FOREIGN KEY (technician_id) REFERENCES technicians(id) ON DELETE SET NULL,
FOREIGN KEY (zone_id) REFERENCES zones(id) ON DELETE RESTRICT
);
-- 5. CREACIÓ DE LA TAULA COMENTARIS (Depèn de tickets i users)
CREATE TABLE ticket_comments (
id INT PRIMARY KEY AUTO_INCREMENT,
ticket_id INT NOT NULL,
user_id INT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Si s'esborra el ticket, s'esborren els comentaris automàticament
FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT
);4. Taula Resum d’Integritat Referencial
Per comprovar ràpidament el funcionament de la nostra base de dades i repassar abans de l’examen de l’mòdul:
| Taula | Clau Primària (PK) | Claus Foranes (FK) | Què fa si s’esborra el pare? (ON DELETE) | Explicació pràctica |
|---|---|---|---|---|
| users | id | Cap | – | És la taula base. No depèn de cap altra taula. |
| technicians | id | user_id | CASCADE | Si l’usuari s’esborra, la seva fitxa de tècnic desapareix sola. |
| zones | id | Cap | – | Llistat de llocs físics (Ex: «Fila 3B», «Escenari»). |
| tickets | id | user_idtechnician_idzone_id | RESTRICTSET NULLRESTRICT | Bloqueja l’esborrat d’usuaris o zones amb tickets actius. Si el tècnic s’esborra, el ticket es queda buit per reassignar. |
| ticket_comments | id | ticket_iduser_id | CASCADERESTRICT | Si esborrem un ticket del sistema, tots els seus comentaris s’eliminen en cascada automàticament. |
5. Proves de Funcionament (Validació a l’aula)
Com podem comprovar a classe de SMX que el nostre disseny funciona correctament i no admet errors?
- Prova de la Clau Primària: Si intentes inserir manualment dos usuaris amb el mateix
ido el mateixusername, la base de dades llançarà un error de dades duplicades (Duplicate entry). - Prova del RESTRICT: Crea un usuari, afegeix un ticket assignat a aquest usuari i després intenta esborrar l’usuari de la taula
users. El MySQL ho bloquejarà per evitar que el ticket es quedi «orfe» (sense saber de qui és). - Prova del CASCADE: Crea un usuari i fes-lo tècnic. Elimina l’usuari a la taula
usersi veuràs com automàticament ha desaparegut el seu registre vinculat a la taulatechnicians.