1
Fork 0
mirror of https://github.com/Steffo99/alexandria.git synced 2024-11-21 13:24:18 +00:00

Migliora un po' i periodi della relazione

This commit is contained in:
Steffo 2020-05-30 19:34:54 +02:00
parent 04d18ddc24
commit 7140b48539
Signed by: steffo
GPG key ID: 896A80F55F7C97F0
14 changed files with 267 additions and 242 deletions

View file

@ -1,6 +1,6 @@
# Descrizione # Descrizione
Si vuole realizzare una base di dati a supporto di un sito web che permetta la creazione, gestione e condivisione della propria raccolta multimediale, come è possibile fare su altri siti web, quali [aNobii](https://www.anobii.com/), [MyAnimeList](https://myanimelist.net/) e [The Backloggery](https://backloggery.com/). Si vuole realizzare una base di dati a supporto di un sito web che permetta la creazione, gestione e condivisione della propria libreria multimediale, come è possibile fare su altri siti web, quali [aNobii](https://www.anobii.com/), [MyAnimeList](https://myanimelist.net/) e [The Backloggery](https://backloggery.com/).
Il sito sarà suddiviso in sezioni, ciascuna riguardante un [media](https://it.wikipedia.org/wiki/Mezzo_di_comunicazione_di_massa) diverso: Il sito sarà suddiviso in sezioni, ciascuna riguardante un [media](https://it.wikipedia.org/wiki/Mezzo_di_comunicazione_di_massa) diverso:

View file

@ -1,41 +1,43 @@
# Glossario # Glossario
Scritta la [descrizione](1-descrizione.md), si è realizzato un glossario al fine di identificare le parole chiave in essa contenute.
## Generale ## Generale
| Nome | Dati | Sinonimi | Collegamenti | Note | | Nome | Dati | Sinonimi | Collegamenti | Note |
|------|------|----------|--------------|------| |------|------|----------|--------------|------|
| Utente | username, hash della password, email, è amministratore, è bannato | user, admin, amministratore | possiede Elementi | | | `Utente` | username, hash della password, email, è amministratore, è bannato | user, admin, amministratore | possiede Elementi | |
| Elemento | stato, provenienza | | di una copia di un Libro / Film / Videogioco, posseduto da un Utente | | | `Elemento` | stato, provenienza | | di una copia di un Libro / Film / Videogioco, posseduto da un Utente | |
| Recensione | valutazione (0-100), commento, data, è nascosto | valutazione, commento, post | riguardante un Elemento | | | `Recensione` | valutazione (0-100), commento, data, è nascosto | valutazione, commento, post | riguardante un Elemento | |
## Libri ## Libri
| Nome | Dati | Sinonimi | Collegamenti | Note | | Nome | Dati | Sinonimi | Collegamenti | Note |
|------|------|----------|--------------|------| |------|------|----------|--------------|------|
| Libro | titolo originale, sinossi | testo, saggio, romanzo, opuscolo | scritto da uno o più Autori, appartenente a uno o più Generi, con più Edizioni (libro, audio), correlato ad altri Libri | | | `Libro` | titolo originale, sinossi | testo, saggio, romanzo, opuscolo | scritto da uno o più Autori, appartenente a uno o più Generi, con più Edizioni (libro, audio), correlato ad altri Libri | |
| Genere | nome | | a cui appartengono i Libri | | | `Genere` | nome | | a cui appartengono i Libri | |
| Edizione (libro) | **isbn**, titolo localizzato, pagine, copertina | _Libro_ (ambiguo), pubblicazione, stampa | di un Libro, posseduta da più Utenti (_Elemento_), pubblicata da un Editore | | | `Edizione` (libro) | **isbn**, titolo localizzato, pagine, copertina | _Libro_ (ambiguo), pubblicazione, stampa | di un Libro, posseduta da più Utenti (_Elemento_), pubblicata da un Editore | |
| Edizione (audio) | **isbn**, titolo localizzato, durata, immagine | | di un Libro, posseduta da più Utenti (_Elemento_), pubblicata da un Editore, narrata da uno o più Narratori | | | `Edizione` (audio) | **isbn**, titolo localizzato, durata, immagine | | di un Libro, posseduta da più Utenti (_Elemento_), pubblicata da un Editore, narrata da uno o più Narratori | |
| Autore | nome | scrittore | scrive dei Libri | | | `Autore` | nome | scrittore | scrive dei Libri | |
| Editore | nome | | pubblica delle Edizioni (libro, audio) | | | `Editore` | nome | | pubblica delle Edizioni (libro, audio) | |
| Narratore | nome | voce narrante | narra delle Edizioni (audio) | | | `Narratore` | nome | voce narrante | narra delle Edizioni (audio) | |
## Film ## Film
| Nome | Dati | Sinonimi | Collegamenti | Note | | Nome | Dati | Sinonimi | Collegamenti | Note |
|------|------|----------|--------------|------| |------|------|----------|--------------|------|
| Film | **eidr**, titolo originale, sinossi, durata, locandina | pellicola | guardato da Utenti (_Elemento_), realizzato da Cast, prodotto da Studio, appartenente a Generi, scritto da Sceneggiatori, correlato ad altri Film | | | `Film` | **eidr**, titolo originale, sinossi, durata, locandina | pellicola | guardato da Utenti (_Elemento_), realizzato da Cast, prodotto da Studio, appartenente a Generi, scritto da Sceneggiatori, correlato ad altri Film | |
| Genere | nome | | a cui appartengono i Film | | | `Genere` | nome | | a cui appartengono i Film | |
| Cast | nome | "attore", "regista", "scenografo", "produttore esecutivo" | Prende parte al Film, ha un Ruolo | I ruoli sono specificati nella tabella Ruolo | | `Cast` | nome | "attore", "regista", "scenografo", "produttore esecutivo" | Prende parte al Film, ha un Ruolo | I ruoli sono specificati nella tabella Ruolo |
| Ruolo | nome | | di Cast | Il ruolo è un attributo! | | `Ruolo` | nome | | di Cast | Il ruolo è un attributo! |
| Studio | nome | azienda, casa produttrice | che ha prodotto un Film | | | `Studio` | nome | azienda, casa produttrice | che ha prodotto un Film | |
| Localizzazione | titolo alternativo, lingua | titolo | relativo a un Film | | | `Localizzazione` | titolo alternativo, lingua | titolo | relativo a un Film | |
## Giochi ## Giochi
| Nome | Dati | Sinonimi | Collegamenti | Note | | Nome | Dati | Sinonimi | Collegamenti | Note |
|------|------|----------|--------------|------| |------|------|----------|--------------|------|
| Gioco | titolo, descrizione | videogioco, videogame | sviluppato da uno o più Studio, pubblicato da uno o più Studio, appartenente a Generi, con più Edizioni | | | `Gioco` | titolo, descrizione | videogioco, videogame | sviluppato da uno o più Studio, pubblicato da uno o più Studio, appartenente a Generi, con più Edizioni | |
| Edizioni | piattaforma, box art, titolo alternativo | | di un Gioco, giocata da Utenti (_Elemento_), portato da uno o più Studio | | | `Edizioni` | piattaforma, box art, titolo alternativo | | di un Gioco, giocata da Utenti (_Elemento_), portato da uno o più Studio | |
| Generi | nome | | a cui appartengono Giochi | | | `Generi` | nome | | a cui appartengono Giochi | |
| Studio | nome | | che ha sviluppato Giochi, che ha portato Edizioni | | | `Studio` | nome | | che ha sviluppato Giochi, che ha portato Edizioni | |

View file

@ -1,19 +1,27 @@
# Schema scheletro # Schema scheletro
È allegato alla relazione il file [`3-1-schema-scheletro.drawio`](3-1-schema-scheletro.drawio) contenente l'intero schema scheletro in un formato modificabile. Dal glossario, si è poi realizzato con il software [diagrams.net](https://www.diagrams.net/) uno schema scheletro della base di dati, contenente le principali entità e relazioni.
## Generale È allegato alla relazione il file [`3-1-schema-scheletro.drawio`](3-1-schema-scheletro.drawio) contenente l'intero schema scheletro in un formato modificabile; per comodità, si riportano qui sotto i suoi contenuti sotto forma di immagini.
## Legenda
I _quadrati_ rappresentano le **entità**, i _rombi_ rappresentano le **relazioni**, le _linee continue grigie_ rappresentano l'**appartenenza** di un'entità a una relazione e infine le _frecce blu_ rappresentano l'esistenza di una [**gerarchia IsA**](3-2-gerarchie.md) tra le entità connesse.
## Immagini
### Generale
![](img/3-1-schema-scheletro/generale.png) ![](img/3-1-schema-scheletro/generale.png)
## Libri ### Libri
![](img/3-1-schema-scheletro/libri.png) ![](img/3-1-schema-scheletro/libri.png)
## Film ### Film
![](img/3-1-schema-scheletro/film.png) ![](img/3-1-schema-scheletro/film.png)
## Giochi ### Giochi
![](img/3-1-schema-scheletro/giochi.png) ![](img/3-1-schema-scheletro/giochi.png)

View file

@ -1,23 +1,23 @@
# Classificazione delle gerarchie # Classificazione delle gerarchie
Nello schema scheletro di `alexandria` compaiono due gerarchie IsA, rappresentate da frecce continue blu. Nello schema scheletro di Alexandria compaiono **due gerarchie IsA**, rappresentate da frecce continue blu.
## Gerarchia degli _Elementi_ ## Gerarchia degli `Elementi`
![](img/3-2-gerarchie/gerarchia-1.png) ![](img/3-2-gerarchie/gerarchia-1.png)
Il tipo di dato alla base di `alexandria` è l'_Elemento_. Il tipo di dato alla base di Alexandria è l'`Elemento`.
Un Elemento rappresenta una aggiunta da parte di un utente alla propria libreria di un libro, film o videogioco. Un `Elemento` rappresenta una aggiunta da parte di un utente alla propria libreria di un libro, film o videogioco.
Nella [descrizione](1-descrizione.md) si specifica che tutti gli Elementi devono avere uno _stato_ e una _provenienza_ specifici al tipo di Elemento; è quindi necessaria la distinzione dei vari tipi di Elemento e creando così una gerarchia **esclusiva** (un Elemento non può essere sia un libro sia un film allo stesso tempo). Nella [descrizione](1-descrizione.md) si specifica che tutti gli `Elementi` devono avere uno _stato_ e una _provenienza_ specifici al tipo di `Elemento`; è quindi necessaria la distinzione dei vari tipi di `Elemento` e creando così una gerarchia **esclusiva** (un `Elemento` non può essere sia un libro sia un film allo stesso tempo).
Si è deciso di rendere **non totale** la gerarchia in modo da permettere l'introduzione di nuovi tipi di Elementi in futuro. Si è deciso di rendere **non totale** la gerarchia in modo da permettere l'introduzione di nuovi tipi di `Elementi` in futuro.
## Gerarchia delle _Edizioni_ ## Gerarchia delle `Edizioni`
![](img/3-2-gerarchie/gerarchia-2.png) ![](img/3-2-gerarchie/gerarchia-2.png)
La [descrizione](1-descrizione.md) prevede che le edizioni dei libri e degli audiolibri abbiano attributi diversi: i libri hanno il _numero di pagine_ e l'immagine della loro _copertina_, mentre gli audiolibri hanno la _durata_ e la _cover art_ ad essi associata. La [descrizione](1-descrizione.md) prevede che le `Edizioni` dei libri e degli audiolibri abbiano attributi diversi: i libri hanno il _numero di pagine_ e l'immagine della loro _copertina_, mentre gli audiolibri hanno la _durata_ e la _cover art_ ad essi associata.
Si viene a creare così una gerarchia **totale** (un'Edizione è o libro o audiolibro) ed **esclusiva** (una edizione non può essere sia libro sia audiolibro). Si viene a creare così una gerarchia **totale** (un'Edizione è o libro o audiolibro) ed **esclusiva** (una edizione non può essere sia libro sia audiolibro).

View file

@ -1,7 +1,11 @@
# Classificazione delle autoassociazioni # Classificazione delle autoassociazioni
In `alexandria`, sono presenti tre autoassociazioni che rappresentano tutte e tre lo stesso concetto: ogni libro, film o videogioco può essere associato ad altre entità del suo stesso tipo a cui è correlato. Alexandria prevede la possibilità di marcare come correlate due opere in modo tale da far apparire sulla pagina di una un collegamento all'altra.
Si è deciso di sviluppare questa funzionalità utilizzando delle **autoassociazioni**: ogni `Libro`, `Film` o `Videogioco` sarà correlato ad altre entità del suo stesso tipo tramite la relazione `è correlato a`.
![](img/3-3-autoassociazioni/autoassociazione.png) ![](img/3-3-autoassociazioni/autoassociazione.png)
> Inizialmente, si è considerato di aggiungere una unica autoassociazione alla entità Elemento, ma si è poi giunti alla conclusione che questo approccio sarebbe stato sbagliato: si sarebbero dovuti associare tutti i singoli Elementi creati da ciascun Utente, creando una quantità a crescita esponenziale di correlazioni! > Inizialmente, si è considerato di aggiungere una unica autoassociazione alla entità `Elemento`, ma si è poi giunti alla conclusione che questo approccio sarebbe stato sbagliato: si sarebbero dovuti associare tutti i singoli `Elementi` creati da ciascun `Utente`, creando una quantità di correlazioni a crescita esponenziale!
> Una possibile estensione a funzionalità si potrebbe ottenere aggiungendo un attributo _Tipo_ alla relazione `è correlato a`: esso permetterebbe agli `Utenti` di descrivere come due opere sono correlate tra loro ("sequel", "prequel", "stesso universo", etc...).

View file

@ -1,183 +0,0 @@
# Relazioni e attributi
## Legenda
![](img/3-4-relazioni/legenda.png)
## Utenti
> Chiunque può registrarsi al sito web scegliendo un username univoco e inserendo una password segreta (sarà [hashata](https://it.wikipedia.org/wiki/Funzione_di_hash) con l'algoritmo [bcrypt](https://it.wikipedia.org/wiki/Bcrypt) prima che venga inserita nel database), creando così un utente.
>
> Esisterà una tipologia particolare di utente: l'utente **amministratore**.
>
> Inoltre, potranno decidere di __bannare__ utenti dal sito, impedendo loro di effettuare l'accesso e di conseguenza di interagire con la loro raccolta.
![](img/3-4-relazioni/utente.png)
Per gli Utenti, si sono aggiunti gli attributi all'entità seguendo strettamente le specifiche, e aggiungendo un attributo opzionale "email" per funzioni di recupero dell'account.
## Elementi
> Gli utenti potranno aggiungere _elementi_ alla loro raccolta multimediale.
>
> Un elemento rappresenta una copia di un libro, di un film o di un videogioco posseduta da un utente.
>
> Ogni elemento avrà associato uno **stato** da una lista di opzioni diversa per ogni tipologia: [...]
>
> Inoltre, ogni elemento avrà associata una **provenienza** da un'altra lista: [...]
> Un utente potrà lasciare una recensione ad ogni elemento presente nella sua raccolta.
>
> La recensione sarà composta da una valutazione (tra 0 e 100, dove 100 è la valutazione migliore), un commento e la data di pubblicazione.
![](img/3-4-relazioni/elemento.png)
### Sottoentità
![](img/3-2-gerarchie/gerarchia-1.png)
Gli Elementi sono stati suddivisi in tre sottoentità _Elemento (Libro)_, _Elemento (film)_ ed _Elemento (gioco)_ per permettere loro di possedere attributi e relazioni di tipo diverso gli uni dagli altri; infatti, ognuna delle tre sottoentità è dotata di una associazione "istanza di" che le collega rispettivamente alle entità "Edizione (di un libro)", "Film" e "Edizione (di un gioco)".
Attributi e relazioni di queste sottoentità saranno descritte in seguito nel paragrafo dedicato.
### Recensioni
![](img/3-4-relazioni/recensioni.png)
Le Recensioni sono collegate agli Elementi attraverso la relazione "riguardante".
Sono un caso di **chiave primaria esterna**: le Recensioni infatti usano come chiave primaria l'*_id_ dell'Elemento a cui si riferiscono.
Si può inoltre dire che le Recensioni siano una **entità debole** rispetto agli Elementi, in quanto senza il suo relativo Elemento, una Recensione non sarebbe più dotata di chiave (e non avrebbe più senso di esistere in quanto si riferirebbe a qualcosa di inesistente).
## Libri
> Ogni libro avrà una sua pagina in cui sarà presente il titolo originale, gli autori, i generi, un breve riassunto della trama, l'elenco di tutte le sue edizioni (sia in formato libro sia in formato audiolibro) e [...].
>
> Ciascuna edizione del libro avrà una seconda pagina con ulteriori informazioni, quali il suo titolo, la copertina, la casa editrice e il numero di pagine; ciascuna edizione sarà identificata da il relativo [codice ISBN](https://it.wikipedia.org/wiki/ISBN).
>
> Le edizioni in formato audiolibro avranno attributi diversi: invece che avere il numero di pagine e la copertina, essi avranno la durata in minuti e secondi della registrazione e opzionalmente un'immagine che rappresenti l'audiolibro.
![](img/3-4-relazioni/libri.png)
Lo schema dei Libri è stato realizzato seguendo in buona parte le specifiche; si sono però realizzate alcune aggiunte:
- Le Edizioni di un libro sono dotate anch'esse di un titolo, che rappresenta il titolo dell'Edizione specifica (titolo tradotto, edizione speciale...);
- [Come menzionato in precedenza](3-2-gerarchie.md), è stata istituita una **gerarchia IsA** con le Edizioni di Libri e Audiolibri;
- Le Edizioni di un Audiolibro possono avere associato uno o più Narratori.
### Una ricorrenza nelle relazioni: il pattern "1NN0"
![](img/3-4-relazioni/inno-1.png)
![](img/3-4-relazioni/inno-2.png)
Osservando lo schema, si nota che le relazioni "narrata da" e "scritto da" sono molto simili tra loro: tutte e due sono **0 a N** nel lato che si collega al Libro (o a una sua Edizione), sono **1 a N** dall'altro lato e si ricollegano a una entità con due soli attributi, _Nome_ e _ID_.
Definiamo questa struttura _1NN0_, in quanto essa ricorrerà frequentemente in tutto lo schema.
<!--Il nome gliel'ho dato io, dici che può andare bene?-->
Si è deciso di usare l'associazione **0 a N** nel lato del Libro perchè gli utenti possano non compilare tutti i dettagli di un libro nel momento in cui lo aggiungono ma anche perchè possano compilare accuratamente tutti i campi, ad esempio permettendo l'inserimento di un testo in più generi.
Dato che si è voluto rendere possibili query come "quali libri ha scritto questo autore" o "quali libri ha narrato questo narratore" e che inserire nel database autori o narratori a cui non appartiene nessun libro non avrebbe alcun senso, si è scelto di usare una relazione **1 a N** nell'altro lato della relazione.
Infine, per l'entità connessa al lato _1 a N_ della relazione, si è deciso di usare un **ID interno** come chiave dell'entità, in modo da permettere la modifica del _Nome_ associato senza dover andare a modificare tutti i Libri (o Edizioni).
### I generi
![](img/3-4-relazioni/generi-libri.png)
Notiamo che la relazione che associa un libro a un genere è molto simile alla struttura _1NN0_, ma con una associazione **0 a N** anche dal lato dell'entità Genere.
Questo perchè si intende aggiungere alcuni generi predefiniti al database (come Fantasy, Giallo o Western) tra cui gli utenti possano scegliere prima ancora che esistano dei libri.
### Editori e ISBN
![](img/3-4-relazioni/editore.png)
Tutti i codici ISBN contengono al loro interno [un codice univoco che identifica l'editore](https://it.wikipedia.org/wiki/ISBN#Editore) di un libro; si è quindi deciso di usare questo codice per identificare l'entità Editore, in quanto esso soddisfa tutti i requisiti per essere una chiave.
### Libri correlati
> [...] e opzionalmente una lista di opere correlate (sequel, prequel, libri ambientati nello stesso universo, etc)
![](img/3-4-relazioni/autoassoc-libri.png)
Come menzionato [in precedenza](3-3-autoassociazioni.md), l'entità Libro è dotata di una autoassociazione che permette di identificare gli elementi correlati ad essa.
## Film
> Ogni film avrà una sua pagina in cui sarà presente il titolo originale, i titoli nelle varie lingue (identificati dal [codice ISO 639 della lingua](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)), una sinossi della trama, la durata, la casa produttrice, il cast, e, come per i libri, una lista opzionale di pellicole correlate.
>
> I film saranno identificati dal loro [codice EIDR](https://ui.eidr.org/search), e per ciascuno di essi verrà calcolata la valutazione media dalle recensioni, che sarà visualizzata sulla pagina assieme a un campione di recensioni.
![](img/3-4-relazioni/film.png)
### Il pattern _1NN0_ nei film
![](img/3-4-relazioni/inno-3.png)
Nello schema dei film, si può notare un'altra applicazione del pattern _1NN0_ menzionato in precedenza: "prodotto da".
### Vi ha preso parte: una relazione 1NN0 ternaria
![](img/3-4-relazioni/ternaria.png)
Nello schema dei film è presente la relazione ternaria "vi ha preso parte".
Essa associa una persona a un film, specificando il ruolo ("attore", "regista", "sceneggiatore"...) per cui ella vi ha preso parte.
È stata modellata così in modo da permettere query avanzate sul cast di un film: ad esempio, "in quali film Quentin Tarantino ha avuto il ruolo di regista", oppure "che ruoli ha ricoperto Johnny Depp".
### Generi
![](img/3-4-relazioni/generi-film.png)
Come per i libri, la relazione "appartiene a" è un _1NN0_ con una associazione **0 a N** dal lato del Genere.
### Film correlati
![](img/3-4-relazioni/autoassoc-film.png)
Come i Libri, anche i Film hanno un'autoassociazione per determinare i film correlati.
### Localizzazione: una entità debole
![](img/3-4-relazioni/entita-debole.png)
Simile al pattern _1NN0_, ma fondamentalmente diversa è la relazione "in altre lingue": essa infatti ha un'associazione _0 a N_ dal lato Film, ma una _1 a 1_ dal lato Localizzazione, e in più, l'associazione è parte della chiave primaria di Localizzazione.
L'entità Localizzazione rappresenta il titolo di un film tradotto in una lingua diversa dall'originale: ad esempio, _Il Padrino_ potrebbe essere una localizzazione in `it` (italiano) di _The Godfather_.
La sua chiave è composta dal codice della lingua e dall'identificatore del film a cui essa si riferisce: è dunque una **entità debole**.
## Giochi
> Ogni videogioco avrà una sua pagina in cui sarà presente il titolo, lo sviluppatore, il publisher, una breve descrizione del gioco, l'elenco di tutte le piattaforme in cui esso è disponibile e, come per libri e film, un elenco di altri giochi correlati.
>
> Per ogni piattaforma sarà disponibile una sottopagina, che conterrà la [box art](https://vgboxart.com/) di quella versione, il nome dello studio che ha effettuato il [porting](https://en.wikipedia.org/wiki/Porting#Porting_of_video_games) ed eventualmente il titolo [se diverso da quello principale](https://it.wikipedia.org/wiki/Payday_2#Crimewave_Edition).
![](img/3-4-relazioni/giochi.png)
### Giochi e Edizioni
![](img/3-4-relazioni/giochi-e-edizioni.png)
Quelle che [nella descrizione](/1-descrizione.md) vengono chiamate _sottopagine_ sono state realizzate nello schema attraverso l'entità Edizione: una Edizione rappresenta una versione di un gioco pubblicata su una piattaforma specifica.
Come per i libri, gli Elementi riferiti a un gioco verranno istanziati relativamente a una specifica Edizione di un gioco.
### Il pattern 1NN0 nei Giochi
![](img/3-4-relazioni/inno-4.png)
Il pattern _1NN0_ ricorre anche all'interno dello schema dei Giochi: si possono notare infatti le relazioni "sviluppato da", "pubblicato da" e "portato da", che collegano uno o più Studios a uno o più Giochi (o loro Edizioni).
### Generi
![](img/3-4-relazioni/generi-giochi.png)
Come per Libri e Film, anche i Giochi hanno una relazione "appartiene a" che li collega a uno o più Generi.
### Giochi correlati
![](img/3-4-relazioni/autoassoc-giochi.png)
Come Libri e Film, anche i Giochi hanno un'autoassociazione per determinare i giochi correlati.

194
3-4-schema-finale.md Normal file
View file

@ -0,0 +1,194 @@
# Schema scheletro finale
Dopo aver costruito [lo schema scheletro](3-1-schema-scheletro.md), identificato [le gerarchie](3-2-gerarchie.md) e [le autoassociazioni](3-3-autoassociazioni.md), si è passati a ultimare lo schema relazionale, aggiungendoci **attributi**, **identificatori** e **cardinalità delle relazioni**.
Per farlo, ci si è basati sui contenuti della [descrizione](1-descrizione.md) e del [glossario](2-glossario.md): per comodità, si riportano qui le frasi della descrizione relative alle entità di cui si parla.
È allegato alla relazione il file [`3-4-schema-finale.drawio`](3-4-schema-finale.drawio): esso contiene lo schema scheletro finale di cui si vedono le immagini in questo capitolo.
## Legenda
<!--TODO: Forse dovremmo rifarla scrivendo Identificatore invece che Chiave primaria?-->
![](img/3-4-relazioni/legenda.png)
## `Utenti`
> Chiunque può registrarsi al sito web scegliendo un username univoco e inserendo una password segreta (sarà [hashata](https://it.wikipedia.org/wiki/Funzione_di_hash) con l'algoritmo [bcrypt](https://it.wikipedia.org/wiki/Bcrypt) prima che venga inserita nel database), creando così un utente.
>
> Esisterà una tipologia particolare di utente: l'utente **amministratore**.
>
> Inoltre, potranno decidere di __bannare__ utenti dal sito, impedendo loro di effettuare l'accesso e di conseguenza di interagire con la loro raccolta.
![](img/3-4-relazioni/utente.png)
Per gli `Utenti`, si sono aggiunti gli attributi all'entità seguendo strettamente le specifiche, assieme a un attributo opzionale "email" per permettere un eventuale recupero dell'account nel caso che ci si sia dimenticati la password.
## `Elementi`
> Gli utenti potranno aggiungere _elementi_ alla loro raccolta multimediale.
>
> Un elemento rappresenta una copia di un libro, di un film o di un videogioco posseduta da un utente.
>
> Ogni elemento avrà associato uno **stato** da una lista di opzioni diversa per ogni tipologia: [...]
>
> Inoltre, ogni elemento avrà associata una **provenienza** da un'altra lista: [...]
> Un utente potrà lasciare una recensione ad ogni elemento presente nella sua raccolta.
>
> La recensione sarà composta da una valutazione (tra 0 e 100, dove 100 è la valutazione migliore), un commento e la data di pubblicazione.
![](img/3-4-relazioni/elemento.png)
### Sottoentità
![](img/3-2-gerarchie/gerarchia-1.png)
Gli `Elementi` sono stati suddivisi in tre sottoentità `Elemento (libro)`, `Elemento (film)` ed `Elemento (gioco)` per permettere loro di possedere attributi e relazioni di tipo diverso gli uni dagli altri; infatti, ognuna delle tre sottoentità è dotata di una associazione `istanza di` che le collega rispettivamente alle entità `Edizione (libro)`, `Film` e `Edizione (gioco)`.
Attributi e relazioni di queste sottoentità saranno descritti nelle sezioni successive.
### `Recensioni`
![](img/3-4-relazioni/recensioni.png)
Le `Recensioni` sono collegate agli `Elementi` attraverso la relazione `riguardante`.
Sono un caso di **identificatore esterno**: le `Recensioni` infatti usano come identificatore l'_id_ dell'`Elemento` a cui si riferiscono.
Si può inoltre dire che le `Recensioni` siano una **entità debole** rispetto agli `Elementi`, in quanto senza il suo relativo `Elemento`, una `Recensione` perderebbe importanti informazioni di contesto, e non avrebbe quindi più senso di esistere (infatti, senza `Elemento`, essa non sarebbe più dotata di un identificatore).
## `Libri`
> Ogni libro avrà una sua pagina in cui sarà presente il titolo originale, gli autori, i generi, un breve riassunto della trama, l'elenco di tutte le sue edizioni (sia in formato libro sia in formato audiolibro) e [...].
>
> Ciascuna edizione del libro avrà una seconda pagina con ulteriori informazioni, quali il suo titolo, la copertina, la casa editrice e il numero di pagine; ciascuna edizione sarà identificata da il relativo [codice ISBN](https://it.wikipedia.org/wiki/ISBN).
>
> Le edizioni in formato audiolibro avranno attributi diversi: invece che avere il numero di pagine e la copertina, essi avranno la durata in minuti e secondi della registrazione e opzionalmente un'immagine che rappresenti l'audiolibro.
![](img/3-4-relazioni/libri.png)
Lo schema dei `Libri` è stato realizzato seguendo in buona parte le specifiche; si sono però effettuate alcune aggiunte:
- Le `Edizioni` di un `Libro` sono state dotate di un _titolo_, che rappresenta il titolo dell'`Edizione` specifica (titolo in una lingua diversa, edizione speciale che cambia il titolo, etc...);
- Le `Edizioni` di un `Audiolibro` possono avere associato uno o più `Narratori`.
### Una ricorrenza nelle relazioni: il pattern "1NN0"
![](img/3-4-relazioni/inno-1.png)
![](img/3-4-relazioni/inno-2.png)
Osservando lo schema, si nota che le relazioni "narrata da" e "scritto da" sono molto simili tra loro: tutte e due sono **0 a N** nel lato che si collega all'opera (il `Libro` o una sua `Edizione`), sono **1 a N** dall'altro lato e si ricollegano a una entità con due soli attributi, _Nome_ e _ID_.
Questa particolare struttura compare in molte parti dello schema relazionale: per evitare di ridescriverla ogni volta e per permettere invece di referenziarla, si è deciso di darle il nome **1NN0** (leggi: "inno").
<!--Il nome gliel'ho dato io, dici che può andare bene?-->
<!--Urgh. Questo paragrafo mi fa schifo. Come si potrebbe riscrivere?-->
È stata scelta la cardinalità **0 a N** dal lato dell'opera, in modo da evitare agli utenti la compilazione obbligatoria di tutti i campi di un opera al momento della sua aggiunta, ma permettendo una compilazione più dettagliata in futuro, prevedendo anche casi in cui ad esempio un libro sia stato scritto da più autori.
Dato che si è voluto rendere possibili query come "quali `Libri` ha scritto questo autore" o "quali `Libri` ha narrato questo narratore" e che inserire nel database autori o narratori a cui non appartiene nessun libro non avrebbe alcun senso, si è scelto invece di usare una cardinalità **1 a N** dall'altro lato della relazione.
Infine, per l'entità connessa al lato _1 a N_ della relazione, si è deciso di usare un **ID interno** come identificatore, in modo da permettere la modifica del _Nome_ associato senza dover andare a modificare tutte le opere.
### `Generi`
![](img/3-4-relazioni/generi-libri.png)
Notiamo che la relazione che associa un `Libro` a un `Genere` è molto simile alla struttura _1NN0_, ma essa ha una cardinalità **0 a N** anche dal lato dell'entità `Genere`.
Questo perchè si intende aggiungere alcuni `Generi` al database tra cui gli utenti potranno scegliere prima ancora che esistano dei libri.
### `Editori`
![](img/3-4-relazioni/editore.png)
Tutti i codici ISBN contengono al loro interno [un codice univoco che identifica l'editore](https://it.wikipedia.org/wiki/ISBN#Editore) di un libro; si è quindi deciso di usare questo codice per identificare l'entità `Editore`.
### Correlazioni
> [...] e opzionalmente una lista di opere correlate (sequel, prequel, libri ambientati nello stesso universo, etc)
![](img/3-4-relazioni/autoassoc-libri.png)
Come menzionato [in precedenza](3-3-autoassociazioni.md), l'entità `Libro` è dotata di una autoassociazione che permette di identificare gli altri `Libri` ad essa correlati.
## `Film`
> Ogni film avrà una sua pagina in cui sarà presente il titolo originale, i titoli nelle varie lingue (identificati dal [codice ISO 639 della lingua](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)), una sinossi della trama, la durata, la casa produttrice, il cast, e, come per i libri, una lista opzionale di pellicole correlate.
>
> I film saranno identificati dal loro [codice EIDR](https://ui.eidr.org/search), e per ciascuno di essi verrà calcolata la valutazione media dalle recensioni, che sarà visualizzata sulla pagina assieme a un campione di recensioni.
![](img/3-4-relazioni/film.png)
### Il pattern _1NN0_ nei `Film`
![](img/3-4-relazioni/inno-3.png)
Nello schema dei `Film`, si può notare il pattern _1NN0_, in corrispondenza alla relazione `prodotto da`.
### `vi ha preso parte`: una relazione _1NN0_ ternaria
![](img/3-4-relazioni/ternaria.png)
Nello schema dei film è presente la **relazione ternaria** `vi ha preso parte`.
Essa associa una persona (`Cast`) a un `Film`, specificando il `Ruolo` ("attore", "regista", "sceneggiatore"...) per cui vi ha preso parte.
È stata modellata in questo modo per consentire query avanzate sul cast di un `Film`: ad esempio, "in quali film Quentin Tarantino ha avuto il ruolo di regista", oppure "che ruoli ha ricoperto Johnny Depp nei film usciti dopo il 2010".
### `Generi`
![](img/3-4-relazioni/generi-film.png)
Come per i `Libri`, l'entità `Genere` è coinvolta in una _1NN0_ con cardinalità **0 a N** dal lato del `Genere`.
### Correlazioni
![](img/3-4-relazioni/autoassoc-film.png)
Come i `Libri`, anche i `Film` hanno un'autoassociazione per determinare le pellicole correlate.
### Localizzazione
![](img/3-4-relazioni/entita-debole.png)
Simile al pattern _1NN0_, ma fondamentalmente diversa è la relazione `in altre lingue`: essa ha cardinalità _0 a N_ dal lato dei `Film`, e _1 a 1_ dal lato dell'entità `Localizzazione`; in più, l'associazione è identificatore esterno di `Localizzazione`.
L'entità `Localizzazione` rappresenta il **titolo** di un `Film` tradotto in una lingua: ad esempio, _Il Padrino_ è una localizzazione in "`it`" (italiano) del `Film` _The Godfather_.
La sua chiave è composta dal codice ISO della lingua a cui si riferisce e dall'identificatore del `Film` a cui essa si riferisce: è dunque una **entità debole**.
> Nei `Libri` e nei `Giochi` non è stato necessario creare questa entità perchè nei `Libri` lingue diverse hanno codici ISBN diversi (e quindi è possibile inserire i titoli localizzati all'interno dell'entità `Edizione`), e per i `Giochi` è molto raro avere titoli tradotti.
## `Giochi`
> Ogni videogioco avrà una sua pagina in cui sarà presente il titolo, lo sviluppatore, il publisher, una breve descrizione del gioco, l'elenco di tutte le piattaforme in cui esso è disponibile e, come per libri e film, un elenco di altri giochi correlati.
>
> Per ogni piattaforma sarà disponibile una sottopagina, che conterrà la [box art](https://vgboxart.com/) di quella versione, il nome dello studio che ha effettuato il [porting](https://en.wikipedia.org/wiki/Porting#Porting_of_video_games) ed eventualmente il titolo [se diverso da quello principale](https://it.wikipedia.org/wiki/Payday_2#Crimewave_Edition).
![](img/3-4-relazioni/giochi.png)
### `Edizioni`
![](img/3-4-relazioni/giochi-e-edizioni.png)
Quelle che [nella descrizione](/1-descrizione.md) vengono chiamate _sottopagine_ sono state realizzate nello schema attraverso l'entità `Edizione`: una `Edizione` rappresenta una versione di un gioco pubblicata su una specifica piattaforma (PC, PS4, Xbox One, etc...).
Come per gli `Elementi (libro)`, gli `Elementi (gioco)` saranno istanziati relativamente a una specifica `Edizione` di un gioco.
### Il pattern _1NN0_ nei `Giochi`
![](img/3-4-relazioni/inno-4.png)
Il pattern _1NN0_ è presente anche all'interno dello schema dei `Giochi`: si può notare nelle relazioni `sviluppato da`, `pubblicato da` e `portato da`.
### `Generi`
![](img/3-4-relazioni/generi-giochi.png)
Come i `Libri` e i `Film`, anche i `Giochi` hanno una relazione `appartiene a` che li collega a uno o più `Generi`.
### `Giochi` correlati
![](img/3-4-relazioni/autoassoc-giochi.png)
Ancora, anche i `Giochi` hanno un'autoassociazione per determinare le correlazioni tra di essi.

View file

@ -1,3 +0,0 @@
# Schema scheletro finale
È allegato alla relazione il file [`3-5-schema-finale.drawio`](3-5-schema-finale.drawio) contenente l'intero schema scheletro finale in un formato modificabile.

View file

@ -1,30 +1,30 @@
# Eliminazione delle gerarchie # Eliminazione delle gerarchie
Per effettuare la progettazione logica è necessaria come prima cosa rimuovere le gerarchie IsA createsi [durante la fase di progettazione concettuale](3-2-gerarchie.md). Per effettuare la progettazione logica è necessaria come prima cosa **eliminare le gerarchie IsA** createsi [durante la fase di progettazione concettuale](3-2-gerarchie.md).
Si ricorda che in `alexandria` sono presenti due gerarchie: una sugli Elementi e una sulle Edizioni dei libri. Si ricorda che in Alexandria sono presenti due gerarchie: una relativa agli `Elementi` e una relativa alle `Edizioni` dei `Libri`.
## Gerarchia delle Edizioni ## Gerarchia delle `Edizioni`
![](img/4-1-eliminazione-gerarchie/gerarchia-edizioni.png) ![](img/4-1-eliminazione-gerarchie/gerarchia-edizioni.png)
La gerarchia delle Edizioni è una gerarchia **totale** ed **esclusiva**; gli approcci possibili sono dunque 4: La gerarchia delle `Edizioni` è una gerarchia **totale** ed **esclusiva**; gli approcci possibili sono dunque 4:
- **Mantenimento delle entità**: Un'opzione sempre possibile, ma che porta a un numero di accessi maggiore e quindi a una velocità di interrogazione minore rispetto alle due alternative. - **Mantenimento delle entità**: Un'opzione sempre possibile, ma che porta a un numero di accessi maggiore e quindi a una velocità di interrogazione minore rispetto alle due alternative.
- **Collasso verso l'alto**: Essendo una relazione esclusiva, collassarla verso l'alto porterebbe ad _almeno_ un 50% di valori nulli nella tabella Edizione risultante, portando a un significativo spreco di memoria. - **Collasso verso l'alto**: Essendo una relazione esclusiva, collassarla verso l'alto porterebbe ad _almeno_ un 50% di valori nulli nella tabella `Edizione` risultante, portando a un significativo spreco di memoria.
- **Collasso verso l'alto con unione**: Sarebbe possibile effettuare il _collasso verso l'alto_ unendo però le coppie di attributi `{"Copertina", "Immagine"}` e `{"Pagine", "Durata"}` (facendo riferimento rispettivamente alle pagine del libro e ai secondi dell'audiolibro) per rendere 0 i valori nulli introdotti nella tabella, a costo di parte dell'integrità della base di dati. - **Collasso verso l'alto con unione**: Sarebbe possibile effettuare il _collasso verso l'alto_ unendo però le coppie di attributi `{"Copertina", "Immagine"}` e `{"Pagine", "Durata"}` (facendo riferimento rispettivamente alle pagine del libro e ai secondi dell'audiolibro) per rendere 0 i valori nulli introdotti nella tabella, a costo di parte dell'integrità della base di dati.
- **Collasso verso il basso**: Porterebbe alla duplicazione dell'entità Edizione e delle associazioni 1 a N con cardinalità N dal lato di Edizione; si creerebbe un nuovo tipo di Elemento, "Elemento (audiolibro)". - **Collasso verso il basso**: Porterebbe alla duplicazione dell'entità `Edizione` e delle associazioni 1 a N con cardinalità N dal lato di `Edizione`; si creerebbe un nuovo tipo di `Elemento`, "`Elemento (audiolibro)`".
Si è deciso di **collassare la gerarchia verso il basso** perchè si è reputato importante mantenere integra, veloce e compatta la base di dati, a costo di maggiore complessità progettuale. Si è deciso di **collassare la gerarchia verso il basso** perchè si è reputato importante mantenere integra, veloce e compatta la base di dati, anche a costo di maggiore complessità progettuale.
## Gerarchia degli Elementi ## Gerarchia degli `Elementi`
![](img/4-1-eliminazione-gerarchie/gerarchia-elementi.png) ![](img/4-1-eliminazione-gerarchie/gerarchia-elementi.png)
La gerarchia degli Elementi è **non totale** ed **esclusiva**. Possiamo dunque applicare i seguenti approcci: La gerarchia degli `Elementi` è **non totale** ed **esclusiva**. Possiamo dunque applicare i seguenti approcci:
- **Mantenimento delle entità**: Un'opzione sempre possibile, ma che porta a un numero di accessi maggiore e quindi a una velocità di interrogazione minore rispetto alle due alternative. - **Mantenimento delle entità**: Un'opzione sempre possibile, ma che porta a un numero di accessi maggiore e quindi a una velocità di interrogazione minore rispetto alle due alternative.
@ -32,6 +32,6 @@ La gerarchia degli Elementi è **non totale** ed **esclusiva**. Possiamo dunque
- **Collasso verso l'alto con unione**: Per minimizzare i valori nulli, si potrebbero unire gli attributi `{"Provenienza", "Stato"}` in uno unico, verificando che vengano inseriti valori validi attraverso vincoli di integrità; in questo caso, si introdurrebbero solo 4 nuovi attributi ("istanza di"), con però comunque _almeno_ il 75% di valori nulli, costando memoria (ma meno di quanta se ne sarebbe spesa in un normale collasso). - **Collasso verso l'alto con unione**: Per minimizzare i valori nulli, si potrebbero unire gli attributi `{"Provenienza", "Stato"}` in uno unico, verificando che vengano inseriti valori validi attraverso vincoli di integrità; in questo caso, si introdurrebbero solo 4 nuovi attributi ("istanza di"), con però comunque _almeno_ il 75% di valori nulli, costando memoria (ma meno di quanta se ne sarebbe spesa in un normale collasso).
- **Collasso verso il basso**: Porterebbe alla creazione di quattro tabelle "Elemento" e a quattro tabelle "Recensione" relative a ogni tipo di Elemento, aumentando la complessità progettuale. - **Collasso verso il basso**: Porterebbe alla creazione di quattro tabelle `Elemento` e a quattro tabelle `Recensione` relative a ogni tipo di `Elemento`, aumentando la complessità progettuale.
Anche qui si è deciso di **collassare la gerarchia verso il basso**, in quanto il collasso verso il basso favorisce le entità molto specializzate come gli Elementi; inoltre, adottare il collasso verso il basso permette di espandere con facilità il database in futuro per aggiungerci altri tipi di elementi, in quanto basterà creare due nuove tabelle "Elemento (tipo)" e "Recesione (tipo)". Anche qui si è deciso di **collassare la gerarchia verso il basso**, in quanto il collasso verso il basso favorisce le entità molto specializzate come gli `Elementi`; inoltre, adottare il collasso verso il basso permette di espandere con facilità il database in futuro per aggiungerci altri tipi di `Elementi`, in quanto basterà poi creare due nuove tabelle `Elemento` e `Recesione` per ogni tipo che si vorrà aggiungere.

View file

@ -1,16 +1,16 @@
# Eliminazione delle chiavi esterne # Eliminazione delle chiavi esterne
In Alexandria sono presenti solo due chiavi esterne: una nelle entità Recensione e l'altra nell'entità Localizzazione. In Alexandria sono presenti solo due **chiavi esterne**: una nelle entità `Recensione` e l'altra nell'entità `Localizzazione`.
## Eliminazione della chiave di Recensione ## Eliminazione della chiave di `Recensione`
![](img/4-2-eliminazione-chiavi-esterne/chiave-recensioni.png) ![](img/4-2-eliminazione-chiavi-esterne/chiave-recensioni.png)
In questo caso, si è aggiunto a Recensione l'attributo "ID elemento", che corrisponderà all'ID dell'elemento a cui si riferisce: In questo caso, si è aggiunto a `Recensione` l'attributo "ID elemento", che corrisponderà all'ID dell'`Elemento` a cui si riferisce:
![](img/4-2-eliminazione-chiavi-esterne/after-recensioni.png) ![](img/4-2-eliminazione-chiavi-esterne/after-recensioni.png)
## Eliminazione della chiave di Localizzazione ## Eliminazione della chiave di `Localizzazione`
![](img/4-2-eliminazione-chiavi-esterne/chiave-localizzazione.png) ![](img/4-2-eliminazione-chiavi-esterne/chiave-localizzazione.png)

View file

@ -1,4 +1,4 @@
# Trasformazione degli attributi composti # Trasformazione degli attributi composti
Lo schema relazionale di Alexandria non contiene alcun attributo composto, pertanto non c'è nulla da trasformare. Lo schema relazionale di Alexandria non prevede alcun **attributo composto**, pertanto non c'è nulla da trasformare.

View file

@ -1,5 +1,7 @@
# Creazione dello schema logico # Creazione dello schema logico
Di seguito si riporta l'intero schema logico dopo aver effettuato tutte le trasformazioni previste dalla fase di progettazione logica.
## Legenda ## Legenda
- Entità - Entità

View file

@ -10,7 +10,7 @@ Realizzato in collaborazione tra [@Steffo99](https://github.com/Steffo99/) e [@C
Le specifiche di questo progetto sono disponibili nel file [`spec.pdf`](0-spec.pdf). Le specifiche di questo progetto sono disponibili nel file [`spec.pdf`](0-spec.pdf).
## Struttura della relazione ## Capitoli della relazione
1. **[Descrizione](1-descrizione.md)** 1. **[Descrizione](1-descrizione.md)**
2. **[Glossario](2-glossario.md)** 2. **[Glossario](2-glossario.md)**
@ -18,11 +18,12 @@ Le specifiche di questo progetto sono disponibili nel file [`spec.pdf`](0-spec.p
1. [Schema scheletro iniziale](3-1-schema-scheletro.md) 1. [Schema scheletro iniziale](3-1-schema-scheletro.md)
2. [Classificazione delle gerarchie](3-2-gerarchie.md) 2. [Classificazione delle gerarchie](3-2-gerarchie.md)
3. [Identificazione delle autoassociazioni](3-3-autoassociazioni.md) 3. [Identificazione delle autoassociazioni](3-3-autoassociazioni.md)
4. [Relazioni e attributi](3-4-relazioni.md) 4. [Schema scheletro finale](3-4-schema-finale.md)
5. [Schema scheletro finale](3-5-schema-finale.md)
4. **Progettazione logica** 4. **Progettazione logica**
1. [Eliminazione delle gerarchie](4-1-eliminazione-gerarchie.md) 1. [Eliminazione delle gerarchie](4-1-eliminazione-gerarchie.md)
2. [Eliminazione delle chiavi esterne](4-2-eliminazione-chiavi-esterne.md) 2. [Eliminazione delle chiavi esterne](4-2-eliminazione-chiavi-esterne.md)
<!--La selezione delle chiavi primarie la abbiamo già fatta in 3-4, la dobbiamo spostare qui?--> <!--La selezione delle chiavi primarie la abbiamo già fatta in 3-4, la dobbiamo spostare qui?-->
3. [Trasformazione degli attributi composti](4-3-trasformazione-degli-attributi-composti.md) 3. [Trasformazione degli attributi composti](4-3-trasformazione-degli-attributi-composti.md)
4. [Schema logico](4-4-schema-logico.md) 4. [Schema logico](4-4-schema-logico.md)
5. Verifica di normalizzazione