Objectiu de la tasca

Necessitava crear l’esquelet de la base de dades MySQL per a la nostra Intranet. Això vol dir dissenyar les taules que guardaran tota la informació: usuaris, tornejos, partides, xat, etc.

Per completar aquesta tasca, he utilitzat Claude (Anthropic) com a eina d’intel·ligència artificial. Claude m’ha ajudat a:

  • Estructurar les taules de manera professional seguint les millors pràctiques
  • Aplicar correctament la normalització fins a la Tercera Forma Normal (3FN)
  • Generar documentació tècnica completa i visualitzacions
  • Crear scripts SQL funcionals amb triggers i vistes

Les 10 taules que he creat

He organitzat la base de dades en 4 àrees funcionals:

1️⃣ Àrea d’usuaris

  • rols: He creat aquesta taula per separar els tipus d’usuari (admin, jugador, espectador). Així, si en el futur volem afegir més rols o canviar permisos, no cal tocar la taula d’usuaris.
  • usuaris: Aquí guardo tota la informació personal: nom, email, contrasenya (en hash bcrypt per seguretat), nick de joc, telèfon, etc. He posat l’email com a UNIQUE per evitar que algú es registri dues vegades.

2️⃣ Àrea de l’esdeveniment

  • lan_party: Guarda les dades de cada LAN Party (nom, dates, localització, capacitat). He posat un control d’aforament amb els camps capacitat_maxima i places_ocupades.
  • inscripcions: Aquesta és una taula intermèdia que relaciona usuaris amb LAN Parties. Cada fila representa una inscripció, i he afegit camps per controlar si han pagat i si han assistit realment.

3️⃣ Àrea de jocs i competicions

  • jocs: Un catàleg de tots els jocs disponibles (League of Legends, CS2, Valorant…). He separat això en una taula independent per no repetir el nom del joc 50 vegades.
  • tornejos: Cada torneig està vinculat a un joc i a una LAN Party. He inclòs camps com el format (eliminació directa, lliga, suís), màxim de participants i premis.
  • participants_torneig: Taula intermèdia entre usuaris i tornejos. Aquí guardo la posició final de cada jugador i la seva puntuació.
  • partides: Cada enfrontament dins d’un torneig. Guardo els 2 jugadors, el guanyador, les puntuacions i la ronda. Això em permet generar estadístiques i seguir el bracket.

4️⃣ Àrea de comunicació

  • missatges_xat: Sistema de xat en temps real. Cada missatge té un autor, un contingut i un timestamp.
  • notificacions: Avisos automàtics per informar els usuaris (per exemple: “La teva partida comença en 10 minuts”).

Decisions clau que he pres

  1. Per què INT AUTO_INCREMENT com a clau primària?
    • És més eficient per fer JOINs
    • Ocupa menys espai (4 bytes vs 150 bytes d’un email)
    • Si algú canvia l’email, no afecta les relacions
  2. Per què separar jocs i tornejos?
    • Evito repetir “League of Legends” 10 vegades
    • Si el joc canvia de nom, només actualitzo 1 fila
    • Evito errors de tipografia (“LoL”, “LOL”, “League of Legends”)
  3. Per què utilitzar ENUM per als estats?
    • Evita errors de tipografia
    • És més eficient que VARCHAR
    • Les consultes són més segures
  4. Per què 3 foreign keys a usuaris des de partides?
    • Cada partida necessita 2 jugadors (id_jugador1, id_jugador2)
    • I 1 guanyador (id_guanyador)
    • He afegit un CHECK per assegurar que el guanyador sigui un dels 2 jugadors

Conclusions

Aquest disseny em permetrà:

  • Gestionar múltiples LAN Parties sense modificar l’estructura
  • Escalar fàcilment (afegir nous jocs, rols, tornejos)
  • Mantenir la integritat de les dades amb foreign keys
  • Generar estadístiques i classificacions automàtiques

Resum del prompt utilitzat amb IA: “Dissenya una base de dades MySQL per a una Intranet de LAN Party que gestioni usuaris, tornejos, partides i xat. Necessito 10 taules normalitzades fins a 3FN amb documentació completa, justificacions, diagrama ER i script SQL executable.”

Fitxers entregats

He creat 3 fitxers:

  1. Document Word (35 pàgines): Documentació tècnica completa amb justificacions
  2. Diagrama HTML: Visualització interactiva de totes les taules i relacions
  3. Script SQL: Codi executable per crear tota la base de dades amb triggers i vistes