From a9d3f761c28489d9496e8fec68bafa90b827e0be Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Mon, 23 May 2022 10:31:29 +0200 Subject: [PATCH] DB schema logico doc --- README.org | 19 +++++++++++++++++++ media/dbLogico.jpg | Bin 0 -> 33639 bytes 2 files changed, 19 insertions(+) create mode 100644 media/dbLogico.jpg diff --git a/README.org b/README.org index f0c778d..7ad1dd6 100644 --- a/README.org +++ b/README.org @@ -66,3 +66,22 @@ Il data layer si occupa della gestione ed immagazinamento dei dati generati dall /Il presentation layer non genera dati visto che opera come un reverse proxy./ L'installazione del database server mariadb viene anch'essa eseguita tramite un docker container e la container image disponibile su [[https://hub.docker.com/_/mariadb][hub.docker]] per cui non ha bisogno di alcuna configurazione. + +**** Schema E/R +[[./media/dbER.jpg]] + +#TODO: descrizione schema ER + +**** Schema logico +[[./media/dbLogico.jpg]] + +Le tabelle principali sono 3: +- *users*: contiene i dati degli utenti +- *favoriteVtuber*: vista la possibilità di un utente di avere più vtuber preferite e di conseguenza un vtuber può essere la preferita di più utenti è necessario aggiunngere una tabella tra queste 2 tabelle +- *vtubers*: contiene i dati delle vtuber in elenco + +La tabella *migrations* viene utilizzata per tenere traccia delle migrazioni applicate sul database. + +Per effettuare una modifica al database si utilizza lo script PHP [[./www/migrationScript.php][migrationScript]], questo prende *in ordine* tutte le *classi migration* presenti nella directory [[./www/Migrations][Migrations]]. +Lo script chiama di ogni classe il metodo "*up()*" che applica la modifica al database, crea una nuova entry nella tabella migrations per indicare che la migration in questione è stata applicata. +Prima di eseguire il metodo "up()" controlla che la migration non sia già stata applicata cercando una entry che abbia il nome della migration, se lo trova non esegue il metodo "up()" e prosegue con la successiva migration, se non lo trova deve eserguirla ed aggiungere una entry nella tabella. diff --git a/media/dbLogico.jpg b/media/dbLogico.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41fe01d0392aba271329d49665d2fd36e023da61 GIT binary patch literal 33639 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