1
Fork 0
mirror of https://github.com/Steffo99/alexandria.git synced 2024-11-22 05:44:19 +00:00
bdd-2020-alexandria/3-4-relazioni.md

10 KiB

Relazioni e attributi

Legenda

Utenti

Chiunque può registrarsi al sito web scegliendo un username univoco e inserendo una password segreta (sarà hashata con l'algoritmo 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.

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.

Sottoentità

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

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.

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.

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, è 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"

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.

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

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

Tutti i codici ISBN contengono al loro interno un codice univoco che identifica l'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)

Come menzionato in precedenza, 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), 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, e per ciascuno di essi verrà calcolata la valutazione media dalle recensioni, che sarà visualizzata sulla pagina assieme a un campione di recensioni.

Il pattern 1NN0 nei film

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

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

Come per i libri, la relazione "appartiene a" è un 1NN0 con una associazione 0 a N dal lato del Genere.

Film correlati

Come i Libri, anche i Film hanno un'autoassociazione per determinare i film correlati.

Localizzazione: una entità debole

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 di quella versione, il nome dello studio che ha effettuato il porting ed eventualmente il titolo se diverso da quello principale.

Giochi e Edizioni

Quelle che nella descrizione 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

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

Come per Libri e Film, anche i Giochi hanno una relazione "appartiene a" che li collega a uno o più Generi.

Giochi correlati

Come Libri e Film, anche i Giochi hanno un'autoassociazione per determinare i giochi correlati.