diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..cd2e363 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +relazione.pdf eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/0-spec.pdf b/0-spec.pdf new file mode 100644 index 0000000..398a272 Binary files /dev/null and b/0-spec.pdf differ diff --git a/descrizione.md b/1-descrizione.md similarity index 85% rename from descrizione.md rename to 1-descrizione.md index 7ec43d4..f643d8f 100644 --- a/descrizione.md +++ b/1-descrizione.md @@ -1,6 +1,6 @@ # 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: @@ -30,13 +30,14 @@ 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: +Ogni elemento avrà associato uno **stato** da una lista di opzioni diverse per ogni tipologia: - Libro - Da iniziare - Iniziato - Finito - Abbandonato + - Non applicabile - Film - Da vedere - Visto @@ -45,6 +46,7 @@ Ogni elemento avrà associato uno **stato** da una lista di opzioni diversa per - Iniziato - Finito - Completato al 100% + - Non applicabile Inoltre, ogni elemento avrà associata una **provenienza** da un'altra lista: @@ -70,8 +72,13 @@ Inoltre, ogni elemento avrà associata una **provenienza** da un'altra lista: - Perso / Venduto / Restituito / Non più posseduto - Altro -Un utente è in grado di creare una nuova pagina di un determinato elemento (se, ad esempio, ha letto un libro non ancora registrato nel database). Per fare ciò dovrà inserire obbligatoriamente il tipo di elemento, il suo dato chiave e il titolo dell'opera, mentre gli altri campi sono facoltativi: possono essere inseriti per completezza, oppure lasciati vuoti. Un utente può inoltre modificare una pagina già esistente al fine di aggiungervi informazioni o correggere errori. -Un amministratore è in grado di eliminare le pagine, in caso esse rappresentino elementi non realmente esistenti. +Un utente potrà creare un nuovo oggetto (edizione di libro, film...) di cui aggiungere poi un elemento nella sua libreria. + +Per farlo dovrà selezionarne il tipo e inserirne la chiave (ISBN, EIDR...) e il titolo; tutti gli altri campi saranno facoltativi: possono essere compilati per completezza, oppure lasciati vuoti. + +Un utente può inoltre modificare una pagina già esistente al fine di aggiungervi informazioni o correggere errori. + +Un amministratore è in grado di eliminare le pagine, in caso esse rappresentino oggetti non realmente esistenti. ## Recensioni @@ -83,9 +90,7 @@ La media delle valutazioni delle recensioni relativa a un dato libro / film / se Gli utenti potranno decidere in qualsiasi momento di eliminare una loro recensione. -Gli amministratori, oltre a poter decidere di eliminare recensioni, potranno marcarle come _nascoste_ nel caso le considerino inappropriate o non inerenti. - -Le recensioni nascoste potranno apparire nel sito, ma avranno un aspetto diverso e il commento all'interno non sarà visibile a meno che l'utente non clicchi un tasto. +Gli amministratori potranno eliminare le recensioni nel caso queste violino i termini di servizio del sito web. ## Libri ed edizioni diff --git a/2-glossario.md b/2-glossario.md new file mode 100644 index 0000000..0e4a6da --- /dev/null +++ b/2-glossario.md @@ -0,0 +1,43 @@ +# Glossario + +Scritta la [descrizione](1-descrizione.md), si è realizzato un glossario al fine di identificare le parole chiave in essa contenute. + +## Generale + +| Nome | Dati | Sinonimi | Collegamenti | Note | +|------|------|----------|--------------|------| +| `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 | | +| `Recensione` | valutazione (0-100), commento, data, è nascosto | valutazione, commento, post | riguardante un Elemento | | + +## Libri + +| 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 | | +| `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` (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 | | +| `Editore` | nome | | pubblica delle Edizioni (libro, audio) | | +| `Narratore` | nome | voce narrante | narra delle Edizioni (audio) | | + +## Film + +| 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 | | +| `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 | +| `Ruolo` | nome | | di Cast | Il ruolo è un attributo! | +| `Studio` | nome | azienda, casa produttrice | che ha prodotto un Film | | +| `Localizzazione` | titolo alternativo, lingua | titolo | relativo a un Film | | + +## Giochi + +| 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 | | +| `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 | | +| `Studio` | nome | | che ha sviluppato Giochi, che ha portato Edizioni | | diff --git a/schema-scheletro.drawio b/3-1-schema-scheletro.drawio similarity index 100% rename from schema-scheletro.drawio rename to 3-1-schema-scheletro.drawio diff --git a/3-1-schema-scheletro.md b/3-1-schema-scheletro.md new file mode 100644 index 0000000..934a9b3 --- /dev/null +++ b/3-1-schema-scheletro.md @@ -0,0 +1,27 @@ +# Schema scheletro + +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. + +È 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) + +### Libri + +![](img/3-1-schema-scheletro/libri.png) + +### Film + +![](img/3-1-schema-scheletro/film.png) + +### Giochi + +![](img/3-1-schema-scheletro/giochi.png) diff --git a/3-2-gerarchie.md b/3-2-gerarchie.md new file mode 100644 index 0000000..21a81b6 --- /dev/null +++ b/3-2-gerarchie.md @@ -0,0 +1,23 @@ +# Classificazione delle gerarchie + +Nello schema scheletro di Alexandria compaiono **due gerarchie IsA**, rappresentate da frecce continue blu. + +## Gerarchia degli `Elementi` + +![](img/3-2-gerarchie/gerarchia-1.png) + +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. + +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. + +## Gerarchia delle `Edizioni` + +![](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. + +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). diff --git a/3-3-autoassociazioni.md b/3-3-autoassociazioni.md new file mode 100644 index 0000000..e45086c --- /dev/null +++ b/3-3-autoassociazioni.md @@ -0,0 +1,11 @@ +# Classificazione delle autoassociazioni + +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) + +> 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 alla 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...). diff --git a/schema-finale.drawio b/3-4-schema-finale.drawio similarity index 100% rename from schema-finale.drawio rename to 3-4-schema-finale.drawio diff --git a/3-4-schema-finale.md b/3-4-schema-finale.md new file mode 100644 index 0000000..5277eff --- /dev/null +++ b/3-4-schema-finale.md @@ -0,0 +1,188 @@ +# 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 + +![](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"). + +La lato dell'opera si ha una cardinalità **0 a N**, in modo da evitare agli utenti la compilazione obbligatoria di tutti i campi di un opera al momento della sua aggiunta, ma permettendo una loro 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 **identificatore surrogato**, 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_. +Il suo identificatore è composto 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. diff --git a/4-1-eliminazione-gerarchie.md b/4-1-eliminazione-gerarchie.md new file mode 100644 index 0000000..eeed00d --- /dev/null +++ b/4-1-eliminazione-gerarchie.md @@ -0,0 +1,37 @@ +# Eliminazione delle gerarchie + +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 relativa agli `Elementi` e una relativa alle `Edizioni` dei `Libri`. + +## Gerarchia delle `Edizioni` + +![](img/4-1-eliminazione-gerarchie/gerarchia-edizioni.png) + +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. + +- **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 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, anche a costo di maggiore complessità progettuale. + +## Gerarchia degli `Elementi` + +![](img/4-1-eliminazione-gerarchie/gerarchia-elementi.png) + +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. + +- **Collasso verso l'alto**: Collassare direttamente verso l'alto sarebbe l'opzione peggiore, in quanto aggiungerebbe 12 nuovi attributi con _almeno_ il 75% dei valori nulli (più un selettore), sprecando più memoria del necessario. + +- **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. + +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. diff --git a/4-2-eliminazione-chiavi-esterne.md b/4-2-eliminazione-chiavi-esterne.md new file mode 100644 index 0000000..4d81849 --- /dev/null +++ b/4-2-eliminazione-chiavi-esterne.md @@ -0,0 +1,19 @@ +# Eliminazione delle chiavi esterne + +In Alexandria sono presenti solo due **chiavi esterne**: una nelle entità `Recensione` e l'altra nell'entità `Localizzazione`. + +## Eliminazione della chiave di `Recensione` + +![](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: + +![](img/4-2-eliminazione-chiavi-esterne/after-recensioni.png) + +## Eliminazione della chiave di `Localizzazione` + +![](img/4-2-eliminazione-chiavi-esterne/chiave-localizzazione.png) + +Anche in questo caso si è trasformata la chiave esterna in un attributo "EIDR film" che corrisponderà all'EIDR del film il cui titolo è stato tradotto. + +![](img/4-2-eliminazione-chiavi-esterne/after-localizzazione.png) diff --git a/4-3-trasformazione-degli-attributi-composti.md b/4-3-trasformazione-degli-attributi-composti.md new file mode 100644 index 0000000..88bbf60 --- /dev/null +++ b/4-3-trasformazione-degli-attributi-composti.md @@ -0,0 +1,4 @@ +# Trasformazione degli attributi composti + +Lo schema relazionale di Alexandria non prevede alcun **attributo composto**, pertanto non c'è nulla da trasformare. + diff --git a/4-4-dati-derivati.md b/4-4-dati-derivati.md new file mode 100644 index 0000000..517362a --- /dev/null +++ b/4-4-dati-derivati.md @@ -0,0 +1,68 @@ +# Dati derivati + +In Alexandria non sono presenti molti dati quantitativi: la maggior parte degli attributi sono infatti qualitativi, e come tali meglio descritti da stringhe. + +Si è considerata la possibilità di inserire nella base di dati un attributo contenente il **conteggio** di `Elementi` posseduti da un utente. + +![](img/4-4-dati-derivati/conteggio-elementi.png) + +Si riportano sotto tutti i calcoli effettuati per decidere se aggiungere o no il dato derivato. + +## Tabella dei volumi + +Secondo una stima effettuata, l'utente medio di Alexandria leggerà all'anno 18 libri, ascolterà 6 audiolibri, guarderà 52 film e giocherà a 24 giochi, per un totale di circa 100 `Elementi` per `Utente` all'anno. + +Si ottiene, dunque, la seguente tabella dei volumi: + +| Concetto | Tipo | Volume | +|----------|------|--------| +| `Utente` | Entità | **1**/utente | +| `Elemento (audiolibri)` | Entità | **6**/utente/anno | +| `Elemento (libro)` | Entità | **18**/utente/anno | +| `Elemento (film)` | Entità | **52**/utente/anno | +| `Elemento (gioco)` | Entità | **24**/utente/anno | + +Si considera solo la categoria degli audiolibri: se per essi è conveniente mantenere il dato derivato, allora lo sarà anche per tutti gli altri tipi di elemento, in quanto hanno volumi maggiori. + +## Tabella delle operazioni + +Si stima che ogni utente riceverà circa 500 visite alla suo profilo all'anno. + +Si sono valutate due diverse operazioni: + +| Operazione | Descrizione | Tipo | Frequenza | Schema | +|------------|-------------|------|-----------|--------| +| __OP1__ | Creazione di un nuovo `Elemento (audiolibro)` | Interattiva | **6**/utente/anno | `Elemento (audiolibro)` | +| __OP2__ | Visualizzazione del conteggio di `Elementi` di qualsiasi tipo creati da un `Utente` specifico | Interattiva | **500**/utente/anno | `Elemento (audiolibro)` | + +## Tabella dei costi + +Si sono utilizzati i seguenti costi per realizzare la tabella dei costi: +- **read**: costo **1** +- **write**: costo **2** +- **update**: composta da 1 read e 1 write, costo **3** + +### Senza dato derivato + +| Operazione | Procedura | Costi | Costo totale | +|------------|-----------|-------|--------------| +| __OP1__ | Si inserisce una nuova tupla nella tabella `Elemento (audiolibro)`. | 1 write | **2** | +| __OP2__ | Si interroga la tabella `Elemento (audiolibro)`, filtrando le tuple che non sono state create dall'utente desiderato, e si contano le tuple restituite. | 6 read | **6** | + +### Con dato derivato + +| Operazione | Procedura | Costi | Costo totale | +|------------|-----------|-------|--------------| +| __OP1__ | Si inserisce una nuova tupla nella tabella `Elemento (audiolibro)` e si aggiorna il dato derivato della tupla dell'`Utente` creatore. | 1 write + 1 update | **5** | +| __OP2__ | Si va a vedere il dato derivato nella tabella dell'`Utente` desiderato. | 1 read | **1** | + +## Risultato + +| Metodo | Costo __OP1__ | Costo __OP2__ | Costo totale | +|--------|---------------|---------------|--------------| +| Senza dato derivato | 2 * 100 | 6 * 500 | 3200 | +| Con dato derivato | 5 * 100 | 1 * 500 | 1000 | + +Dato che 1000 < 3200, conviene **creare il dato derivato** nella tabella `Utente`. + +La stessa cosa vale per gli `Elementi` di libri, film e giochi: avendo volumi maggiori, essi possono solo aumentare il costo dell'__OP2__ _senza dato derivato_. diff --git a/4-5-schema-logico.md b/4-5-schema-logico.md new file mode 100644 index 0000000..7e5a66d --- /dev/null +++ b/4-5-schema-logico.md @@ -0,0 +1,224 @@ +# 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 + +- Entità + - **Chiave primaria** + - → [Chiave esterna](#legenda) + - _Opzionale_ + - [♦](4-4-dati-derivati.md) Dato derivato + +## Categoria generale + +### Utente +- **Username** +- Password +- _Email_ +- È amministratore +- È bannato +- [♦](4-4-dati-derivati.md) Elementi (libro) posseduti +- [♦](4-4-dati-derivati.md) Elementi (audiolibro) posseduti +- [♦](4-4-dati-derivati.md) Elementi (film) posseduti +- [♦](4-4-dati-derivati.md) Elementi (gioco) posseduti + +## Categoria condivisa tra libri e audiolibri + +### Libro +- **ID** +- Titolo primario +- _Sinossi_ + +### Appartenenza a genere (libro) +- **ID Genere** → [Genere (libro)](#genere-libro) +- **ID Libro** → [Libro](#libro) + +### Autore +- **ID** +- Nome + +### Correlazioni (libro) +- **ID1** → [Libro](#libro) +- **ID2** → [Libro](#libro) + +### Editore +- **Parte ISBN** +- Nome + +### Genere (libro) +- **ID** +- Nome + +### Scritto da +- **ID Autore** → [Autore](#autore) +- **ID Libro** → [Libro](#libro) + +## Categoria libri + +### Edizione (libro) +- **ISBN** +- Titolo +- _Pagine_ +- _Copertina_ +- Relativa a → [Libro](#libro) + +### Elemento (libro) +- **ID** +- Istanza di → [Edizione (libro)](#edizione-libro) +- Appartiene a → [Utente](#utente) +- _Stato_ +- _Provenienza_ + +### Recensione (libro) + +- **ID** → [Elemento (libro)](#elemento-libro) +- Commento +- Valutazione +- Data + +## Schema degli audiolibri + +### Edizione (audiolibro) +- **ISBN** +- Titolo +- _Durata_ +- _Immagine_ +- Relativa a → [Libro](#libro) + +### Elemento (audiolibro) +- **ID** +- Istanza di → [Edizione (audiolibro)](#edizione-audiolibro) +- Appartiene a → [Utente](#utente) +- _Stato_ +- _Provenienza_ + +### Narrata da +- **ID Edizione** → [Edizione (audiolibro)](#edizione-audiolibro) +- **ID Narratore** → [Narratore](#narratore) + +### Narratore +- **ID** +- Nome + +### Recensione (audiolibro) +- **ID** → [Elemento (audiolibro)](#elemento-audiolibro) +- Commento +- Valutazione +- Data + +## Categoria film + +### Film +- **EIDR** +- Titolo +- _Sinossi_ +- _Durata_ +- _Locanddina_ + +### Appartenenza a genere (film) +- **ID Genere** → [Genere](#genere-film) +- **EIDR** → [Film](#film) + +### Cast +- **ID** +- Nome + +### Correlazioni (film) +- **EIDR1** → [Film](#film) +- **EIDR2** → [Film](#film) + +### Elemento (film) +- **ID** +- _Stato_ +- _Provenienza_ +- Istanza di → [Film](#film) +- Appartiene a → [Utente](#utente) + +### Genere (film) +- **ID** +- Nome + +### Localizzazione +- **Lingua** +- **EIDR** → [Film](#film) +- Titolo localizzato + +### Prodotto da +- **ID Studio** → [Studio](#studio-film) +- **EIDR** → [Film](#film) + +### Recensione (film) +- **ID** → [Recensione (film)](#elemento-film) +- Commento +- Valutazione +- Data + +### Ruolo +- **ID** +- Nome + +### Studio (film) +- **ID** +- Nome + +### Vi ha preso parte +- **EIDR** → [Film](#film) +- **ID Cast** → [Cast](#cast) +- **ID Ruolo** → [Ruolo](#ruolo) + +## Categoria giochi + +### Gioco +- **ID** +- Nome +- _Descrizione_ + +### Appartenenza a genere (gioco) +- **ID Gioco** → [Gioco](#gioco) +- **ID Genere** → [Genere (gioco)](#genere-gioco) + +### Correlazioni (gioco) +- **ID1** → [Gioco](#gioco) +- **ID2** → [Gioco](#gioco) + +### Edizione (gioco) +- **ID** +- _Titolo alternativo_ +- Piattaforma +- _Box art_ +- Relativa a → [Gioco](#gioco) + +### Elemento (gioco) +- **ID** +- _Stato_ +- _Provenienza_ +- Istanza di → [Edizione (gioco)](#edizione-gioco) +- Appartiene a → [Utente](#utente) + +### Genere (gioco) +- **ID** +- Nome + +### Portato da +- **ID Edizione** → [Edizione (gioco)](#edizione-gioco) +- **ID Studio** → [Studio (gioco)](#studio-gioco) + +### Prodotto da +- **ID Gioco** → [Gioco](#gioco) +- **ID Studio** → [Studio (gioco)](#studio-gioco) + +### Recensione (gioco) +- **ID** → [Recensione (gioco)](#elemento-gioco) +- Commento +- Valutazione +- Data + +### Studio (gioco) +- **ID** +- Nome + +### Sviluppato da +- **ID Gioco** → [Gioco](#gioco) +- **ID Studio** → [Studio (gioco)](#studio-gioco) + diff --git a/4-6-normalizzazione.md b/4-6-normalizzazione.md new file mode 100644 index 0000000..44fb068 --- /dev/null +++ b/4-6-normalizzazione.md @@ -0,0 +1,3 @@ +# Verifica di normalizzazione + +Dopo aver costruito lo [schema logico](4-5-schema-logico.md), si è constatato che la base di dati fosse in forma normale, e che non fosse necessaria alcuna ulteriore modifica. diff --git a/5-1-tecnologia-database.md b/5-1-tecnologia-database.md new file mode 100644 index 0000000..ea93461 --- /dev/null +++ b/5-1-tecnologia-database.md @@ -0,0 +1,55 @@ +# Tecnologia database + +## Database Management System + +Si è scelto di utilizzare **PostgreSQL** (_Postgres_) come DBMS in quanto è quello con il quale i membri del gruppo erano più famigliari. + +## Strumenti aggiuntivi + +Per assistere nella progettazione fisica, sono stati usati due strumenti per la manipolazione di database Postgres: + +- [pgAdmin 4](https://www.pgadmin.org/) +- Il plugin [Database Tools and SQL](https://plugins.jetbrains.com/plugin/10925-database-tools-and-sql) per IDE basati su IntelliJ + +## Hosting + +Per facilitare la collaborazione, si è scelto di condividere un'**istanza remota** di PostgreSQL installata su un server Ubuntu 18.04.4 LTS, alla quale ci si è connessi con username e password individuali. + +________________________________________________ + +```bash +lsb_release -a +``` +```text +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 18.04.4 LTS +Release: 18.04 +Codename: bionic +``` + +________________________________________________ + +```sql +SELECT version(); +``` + +| version | +|---------| +| PostgreSQL 10.12 (Ubuntu 10.12-0ubuntu0.18.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit | + +## Riproduzione del database + +È allegato alla relazione il file [`5-database.sql`](5-database.sql), contenente tutte le istruzioni necessarie per ricreare il database descritto in questo capitolo. + +Esso è stato ottenuto tramite [`pg_dump`](https://www.postgresql.org/docs/9.3/app-pgdump.html), un'utilità per l'archiviazione di database Postgres, eseguito con il seguente comando Bash: + +```bash +pg_dump --dbname=alexandria --schema='public' --file="5-database.sql" --no-owner --no-acl +``` + +È possibile ricreare il database eseguendo manualmente tutte le istruzioni contenute nel file `.sql`, oppure eseguendo [`pg_restore`](https://www.postgresql.org/docs/9.3/app-pgrestore.html), la controparte di `pg_dump` per il ripristino, con il seguente comando Bash: + +```bash +pg_restore --dbname="alexandria" --schema="public" --file="5-database.sql" +``` diff --git a/5-2-creazione-database.md b/5-2-creazione-database.md new file mode 100644 index 0000000..e146a83 --- /dev/null +++ b/5-2-creazione-database.md @@ -0,0 +1,13 @@ +# Creazione database + +Come primo passo della progettazione fisica si è creato un nuovo database su PostgreSQL attraverso il seguente comando [Bash](https://it.wikipedia.org/wiki/Bash): + +```bash +createdb alexandria +``` + +Esso è equivalente alla seguente istruzione SQL: + +```sql +CREATE DATABASE alexandria; +``` diff --git a/5-3-creazione-tabelle.md b/5-3-creazione-tabelle.md new file mode 100644 index 0000000..7858ec9 --- /dev/null +++ b/5-3-creazione-tabelle.md @@ -0,0 +1,291 @@ +# Creazione tabelle + +Dopo aver creato il database, il secondo passo della progettazione fisica è stato quello di convertire lo schema logico in un database Postgres. + +In generale: + +- Le **entità** sono diventate _TABLES_ (tabelle); +- Gli **attributi opzionali** sono diventati _COLUMNS_ (colonne); +- Gli **attributi obbligatori** sono diventati _COLUMNS_ con il vincolo _NOT NULL_; +- Le **chiavi primarie** sono state implementate come _PRIMARY KEYS_ (chiavi primarie); +- Le **chiavi esterne** sono state implementate come _FOREIGN KEYS_ (chiavi esterne); +- Le **chiavi surrogate** sono state implementate come _PRIMARY KEYS_ autoincrementate tramite _SEQUENCES_ (sequenze); +- I **dati derivati** sono stati implementati come _COLUMNS_ aventi dei _TRIGGER_ che le aggiornino. + +## Schema dei nomi delle tabelle + +Tutte le tabelle sono state istanziate con il nome che le corrispondenti entità avevano nello schema logico, sostituendo tutte le lettere maiuscole con **lettere minuscole** `a-z`, spazi con **underscore** `_` e rimuovendo le parentesi con il loro contenuto. + +Inoltre, a tutte le tabelle tranne `utente` è stato dato un nome prefissato da `libro_`, `audiolibro_`, `film_` e `gioco_` per indicare la categoria a cui le entità appartenevano nello schema logico. + +### Esempi + +| Entità | Tabella | +|--------|---------| +| [`Utente`](4-5-schema-logico.md#utente) | `utente` | +| [`Libro`](4-5-schema-logico.md#libro) | `libro` | +| [`Edizione (libro)`](4-5-schema-logico.md#edizione-libro) | `libro_edizione` | +| [`Cast`](4-5-schema-logico.md#cast) | `film_cast` | + +## Creazione tabelle + +Si riportano solo le tabelle con qualche particolarità; le tabelle per la quale la conversione è banale sono omesse da questo file (ma non dal file [`5-database.sql`](5-database.sql)). + +### `audiolibro_edizione` + +```sql +CREATE TABLE public.audiolibro_edizione ( + isbn character(13) NOT NULL, + titolo character varying NOT NULL, + durata interval, + immagine bytea, + relativa_a integer NOT NULL, + CONSTRAINT durata_check CHECK ((date_part('epoch'::text, durata) >= (0)::double precision)) +); + +ALTER TABLE ONLY public.audiolibro_edizione + ADD CONSTRAINT audiolibro_edizione_pkey PRIMARY KEY (isbn); +``` + +La durata delle edizioni degli audiolibri è di tipo _interval_, che rappresenta un intervallo di tempo con la precisione di centesimi di secondo; l'immagine dell'audiolibro ha invece tipo _bytea_, e sarà salvata nel database come un blob binario di dati. + +Inoltre, la durata è dotata di un _CHECK_ che impedisce che essa sia minore di 0, convertendo l'_interval_ in secondi e controllando che essi siano maggiori di 0. + +### `audiolibro_recensione` + +```sql +CREATE TABLE public.audiolibro_recensione ( + id bigint NOT NULL, + commento text NOT NULL, + valutazione smallint NOT NULL, + data timestamp without time zone DEFAULT now() NOT NULL, + CONSTRAINT audiolibro_recensione_valutazione_check CHECK (((valutazione >= 0) AND (valutazione <= 100))) +); + +ALTER TABLE ONLY public.audiolibro_recensione + ADD CONSTRAINT audiolibro_recensione_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY public.audiolibro_recensione + ADD CONSTRAINT id FOREIGN KEY (id) REFERENCES public.audiolibro_elemento(id); +``` + +Per minimizzare valori nulli, si è tradotta l'associazione binaria 1 a 1 `relativa a` in due tabelle separate, usando in una delle due una chiave esterna come chiave primaria. +Si notino dunque i due _CONSTRAINT_ `audiolibro_recensione_pkey` e `id`. + +La valutazione delle recensioni deve essere obbligatoriamente tra 0 e 100: a tale scopo, è stato introdotto un _CHECK_ sulla tabella che verifichi questa condizione. + +La data di pubblicazione è rappresentata da un _timestamp_, tipo che rappresenta un istante specifico di tempo con precisione fino ai microsecondi. + +### `film` + +```sql +CREATE TABLE public.film ( + eidr character(34) NOT NULL, + titolo character varying NOT NULL, + sinossi text, + locandina bytea, + durata interval, + CONSTRAINT durata_check CHECK ((date_part('epoch'::text, durata) > (0)::double precision)) +); + +ALTER TABLE ONLY public.film + ADD CONSTRAINT film_pkey PRIMARY KEY (eidr); +``` + +Nella tabella `film` compare nuovamente il _CHECK_ utilizzato nelle `audiolibro_edizioni` per la durata, e lo stesso tipo _bytea_ per la locandina. + +Si può notare nella tabella compare il tipo _char(34)_: essendo gli EIDR sempre lunghi 34 caratteri, si è scelto si minimizzare lo spazio di archiviazione utilizzato rendendo il campo a lunghezza non variabile. + +### `film_correlazioni` + +```sql +CREATE TABLE public.film_correlazioni ( + eidr_1 character(34) NOT NULL, + eidr_2 character(34) NOT NULL +); + +ALTER TABLE ONLY public.film_correlazioni + ADD CONSTRAINT film_correlazioni_pkey PRIMARY KEY (eidr_1, eidr_2); + +ALTER TABLE ONLY public.film_correlazioni + ADD CONSTRAINT eidr_1 FOREIGN KEY (eidr_1) REFERENCES public.film(eidr); + +ALTER TABLE ONLY public.film_correlazioni + ADD CONSTRAINT eidr_2 FOREIGN KEY (eidr_2) REFERENCES public.film(eidr); +``` + +L'autoassociazione delle correlazioni è stata implementata attraverso una **tabella ponte** che collega due film attraverso i loro `eidr`. + +`eidr_1` ed `eidr_2` sono due chiavi esterne separate, e insieme formano la **chiave primaria composta** della tabella. + +### `film_vi_ha_preso_parte` + +```sql +CREATE TABLE public.film_vi_ha_preso_parte ( + eidr character(34) NOT NULL, + id_cast integer NOT NULL, + id_ruolo integer NOT NULL +); + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT film_vi_ha_preso_parte_pkey PRIMARY KEY (eidr, id_cast, id_ruolo); + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT eidr FOREIGN KEY (eidr) REFERENCES public.film(eidr); + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT id_cast FOREIGN KEY (id_cast) REFERENCES public.film_cast(id); + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT id_ruolo FOREIGN KEY (id_ruolo) REFERENCES public.film_ruolo(id); +``` + +L'associazione ternaria è stata realizzata con un'altra **tabella ponte**, avente una **chiave primaria composta** e tre chiavi esterne separate. + +### `elemento_id_seq` + +```sql +CREATE SEQUENCE public.elemento_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; +``` + +Si è deciso di rendere **univoci** gli `id` di **tutti gli elementi**, qualsiasi fosse il loro tipo. + +Per realizzare ciò si è creata una _SEQUENCE_ unica che viene poi usata da tutte le tabelle `*_elemento` per generare i nuovi id. + +### Stato e provenienza + +```sql +CREATE TYPE public.gioco_provenienza AS ENUM ( + 'GRATUITO', + 'ACQUISTATO', + 'IN_ABBONAMENTO', + 'PRESO_IN_PRESTITO', + 'NON_PIU_POSSEDUTO', + 'ALTRO' +); + +CREATE TYPE public.gioco_stato AS ENUM ( + 'DA_INIZIARE', + 'INIZIATO', + 'FINITO', + 'COMPLETATO', + 'NON_APPLICABILE' +); +``` + +Gli stati e le provenienze dei vari elementi sono state realizzate creando _ENUM_ contenenti tutte le possibili opzioni selezionabili dall'utente, e utilizzandoli come tipo delle relative colonne; in questo modo, si impedisce l'immissione di valori non validi nelle colonne. + +### `gioco_elemento` + +```sql +CREATE TABLE public.gioco_elemento ( + id bigint DEFAULT nextval('public.elemento_id_seq'::regclass) NOT NULL, + stato public.gioco_stato, + provenienza public.gioco_provenienza, + istanza_di integer NOT NULL, + appartiene_a character varying NOT NULL +); + +ALTER TABLE ONLY public.gioco_elemento + ADD CONSTRAINT gioco_elemento_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY public.gioco_elemento + ADD CONSTRAINT appartiene_a FOREIGN KEY (appartiene_a) REFERENCES public.utente(username); + +ALTER TABLE ONLY public.gioco_elemento + ADD CONSTRAINT istanza_di FOREIGN KEY (istanza_di) REFERENCES public.gioco_edizione(id); + +CREATE FUNCTION public.update_n_giochi() RETURNS trigger + LANGUAGE plpgsql + AS $$BEGIN + IF (TG_OP = 'DELETE') THEN + UPDATE utente + SET gioco_elementi_posseduti = gioco_elementi_posseduti - 1 + WHERE utente.username = old.appartiene_a; + RETURN old; + ELSIF (TG_OP = 'INSERT') THEN + UPDATE utente + SET gioco_elementi_posseduti = gioco_elementi_posseduti + 1 + WHERE utente.username = new.appartiene_a; + RETURN new; + END IF; + END; + $$; + + +CREATE TRIGGER numero_giochi_trigger BEFORE INSERT OR DELETE + ON public.gioco_elemento + FOR EACH ROW EXECUTE PROCEDURE public.update_n_giochi(); +``` + +Le colonne `stato` e `provenienza` utilizzano il relativo _ENUM_ creato in precedenza. + +La colonna `id` ha un valore di _DEFAULT_ particolare: `nextval('public.elemento_id_seq'::regclass)`. +Ciò significa che, se non viene specificato un `id` durante un inserimento, alla riga verrà assegnato automaticamente il valore corrente della _SEQUENCE_ `public.elemento_id_seq` descritta in precedenza, aumentandone inoltre il valore di 1. + +Nella tabella è presente anche un _TRIGGER_, che incrementa o decrementa il conteggio degli elementi dell'utente a cui essi appartengono quando uno o più elementi vengono inseriti o rimossi. + +### `libro_edizione` + +```sql +CREATE FUNCTION public.is_numeric(text character varying) RETURNS boolean + LANGUAGE plpgsql STRICT + AS $_$DECLARE x NUMERIC; + BEGIN + x = $1::NUMERIC; + RETURN TRUE; + EXCEPTION WHEN others THEN + RETURN FALSE; + END;$_$; + +CREATE TABLE public.libro_edizione ( + isbn character(13) NOT NULL, + titolo_edizione character varying NOT NULL, + pagine integer, + copertina bytea, + relativa_a integer NOT NULL, + CONSTRAINT libro_edizione_isbn_check CHECK ((public.is_numeric(("substring"((isbn)::text, 1, 12))::character varying) AND (public.is_numeric(("right"((isbn)::text, 1))::character varying) OR ("right"((isbn)::text, 1) ~~ '%X'::text)))), + CONSTRAINT libro_edizione_pagine_check CHECK ((pagine >= 0)) +); + +ALTER TABLE ONLY public.libro_edizione + ADD CONSTRAINT libro_edizione_pkey PRIMARY KEY (isbn); + +ALTER TABLE ONLY public.libro_edizione + ADD CONSTRAINT relativa_a FOREIGN KEY (relativa_a) REFERENCES public.libro(id); +``` + +La tabella delle edizioni di un libro include due _CHECK_: uno che controlla che le pagine, se specificate, siano un numero positivo, e un'altro che controlla che gli ISBN siano in un formato valido. + +In particolare, per quest'ultimo, è stata creata una funzione di utilità `is_numeric`, che verifica che tutti i caratteri di una stringa siano numerici: questa funzione viene poi usata per controllare che tutti i caratteri dell'ISBN siano numeri, permettendo però anche una `X` in ultima posizione (l'ultima cifra degli ISBN più vecchi era in base-11 e utilizzava la lettera X come 10). + +### `utente` + +```sql +CREATE TABLE public.utente ( + username character varying NOT NULL, + password bytea NOT NULL, + email character varying, + is_admin boolean DEFAULT false NOT NULL, + is_banned boolean DEFAULT false NOT NULL, + libro_elementi_posseduti integer DEFAULT 0 NOT NULL, + audiolibro_elementi_posseduti integer DEFAULT 0 NOT NULL, + film_elementi_posseduti integer DEFAULT 0 NOT NULL, + gioco_elementi_posseduti integer DEFAULT 0 NOT NULL +); + +ALTER TABLE ONLY public.utente + ADD CONSTRAINT username PRIMARY KEY (username); +``` + +La password, essendo un [hash](https://it.wikipedia.org/wiki/Funzione_di_hash), è rappresentata come un dato binario (_bytea_). + +Le colonne `is_admin` e `is_banned` hanno un valore di default di _false_, in quanto alla creazione gli utenti non saranno amministratori o bannati. + +Le colonne `*_elementi_posseduti` sono i dati derivati che rappresentano quanti elementi di ogni tipo possiede un dato utente: per i nuovi utenti, questo valore sarà 0. +Queste colonne saranno poi incrementate dai trigger presenti nelle quattro tabelle `*_elemento`. diff --git a/5-database.sql b/5-database.sql new file mode 100644 index 0000000..853edee --- /dev/null +++ b/5-database.sql @@ -0,0 +1,2180 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 10.12 (Ubuntu 10.12-0ubuntu0.18.04.1) +-- Dumped by pg_dump version 11.5 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: public; Type: SCHEMA; Schema: -; Owner: - +-- + +CREATE SCHEMA public; + + +-- +-- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - +-- + +COMMENT ON SCHEMA public IS 'standard public schema'; + + +-- +-- Name: film_provenienza; Type: TYPE; Schema: public; Owner: - +-- + +CREATE TYPE public.film_provenienza AS ENUM ( + 'ACQUISTATO_FISICO', + 'VISTO_AL_CINEMA', + 'VISTO_IN_TV', + 'VISTO_IN_STREAMING', + 'PRESTITO', + 'NON_PIU_POSSEDUTO', + 'ALTRO' +); + + +-- +-- Name: film_stato; Type: TYPE; Schema: public; Owner: - +-- + +CREATE TYPE public.film_stato AS ENUM ( + 'DA_VEDERE', + 'VISTO' +); + + +-- +-- Name: gioco_provenienza; Type: TYPE; Schema: public; Owner: - +-- + +CREATE TYPE public.gioco_provenienza AS ENUM ( + 'GRATUITO', + 'ACQUISTATO', + 'IN_ABBONAMENTO', + 'PRESO_IN_PRESTITO', + 'NON_PIU_POSSEDUTO', + 'ALTRO' +); + + +-- +-- Name: gioco_stato; Type: TYPE; Schema: public; Owner: - +-- + +CREATE TYPE public.gioco_stato AS ENUM ( + 'DA_INIZIARE', + 'INIZIATO', + 'FINITO', + 'COMPLETATO', + 'NON_APPLICABILE' +); + + +-- +-- Name: libro_provenienza; Type: TYPE; Schema: public; Owner: - +-- + +CREATE TYPE public.libro_provenienza AS ENUM ( + 'ACQUISTATO_FISICO', + 'ACQUISTATO_DIGITALE', + 'PRESTITO', + 'NON_PIU_POSSEDUTO', + 'ALTRO' +); + + +-- +-- Name: libro_stato; Type: TYPE; Schema: public; Owner: - +-- + +CREATE TYPE public.libro_stato AS ENUM ( + 'DA_INIZIARE', + 'INIZIATO', + 'FINITO', + 'ABBANDONATO', + 'NON_APPLICABILE' +); + + +-- +-- Name: is_numeric(character varying); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.is_numeric(text character varying) RETURNS boolean + LANGUAGE plpgsql STRICT + AS $_$DECLARE x NUMERIC; +BEGIN + x = $1::NUMERIC; + RETURN TRUE; +EXCEPTION WHEN others THEN + RETURN FALSE; +END;$_$; + + +-- +-- Name: update_n_audiolibri(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.update_n_audiolibri() RETURNS trigger + LANGUAGE plpgsql + AS $$BEGIN + IF (TG_OP = 'DELETE') THEN + UPDATE utente + SET audiolibro_elementi_posseduti = audiolibro_elementi_posseduti - 1 + WHERE utente.username = old.appartiene_a; + RETURN OLD; + ELSIF (TG_OP = 'INSERT') THEN + UPDATE utente + SET audiolibro_elementi_posseduti = audiolibro_elementi_posseduti + 1 + WHERE utente.username = new.appartiene_a; + RETURN new; + END IF; +END; +$$; + + +-- +-- Name: update_n_film(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.update_n_film() RETURNS trigger + LANGUAGE plpgsql + AS $$BEGIN + IF (TG_OP = 'DELETE') THEN + UPDATE utente + SET film_elementi_posseduti = film_elementi_posseduti - 1 + WHERE utente.username = old.appartiene_a; + RETURN old; + ELSIF (TG_OP = 'INSERT') THEN + UPDATE utente + SET film_elementi_posseduti = film_elementi_posseduti + 1 + WHERE utente.username = new.appartiene_a; + RETURN new; + END IF; +END; +$$; + + +-- +-- Name: update_n_giochi(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.update_n_giochi() RETURNS trigger + LANGUAGE plpgsql + AS $$BEGIN + IF (TG_OP = 'DELETE') THEN + UPDATE utente + SET gioco_elementi_posseduti = gioco_elementi_posseduti - 1 + WHERE utente.username = old.appartiene_a; + RETURN old; + ELSIF (TG_OP = 'INSERT') THEN + UPDATE utente + SET gioco_elementi_posseduti = gioco_elementi_posseduti + 1 + WHERE utente.username = new.appartiene_a; + RETURN new; + END IF; +END; +$$; + + +-- +-- Name: update_n_libri(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.update_n_libri() RETURNS trigger + LANGUAGE plpgsql + AS $$BEGIN + IF (TG_OP = 'DELETE') THEN + UPDATE utente + SET libro_elementi_posseduti = libro_elementi_posseduti - 1 + WHERE utente.username = old.appartiene_a; + RETURN old; + ELSIF (TG_OP = 'INSERT') THEN + UPDATE utente + SET libro_elementi_posseduti = libro_elementi_posseduti + 1 + WHERE utente.username = new.appartiene_a; + RETURN new; + END IF; +END; +$$; + + +SET default_tablespace = ''; + +SET default_with_oids = false; + +-- +-- Name: audiolibro_edizione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.audiolibro_edizione ( + isbn character(13) NOT NULL, + titolo character varying NOT NULL, + durata interval, + immagine bytea, + relativa_a integer NOT NULL, + CONSTRAINT durata_check CHECK ((date_part('epoch'::text, durata) >= (0)::double precision)) +); + + +-- +-- Name: elemento_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.elemento_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: audiolibro_elemento; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.audiolibro_elemento ( + id bigint DEFAULT nextval('public.elemento_id_seq'::regclass) NOT NULL, + istanza_di character(13) NOT NULL, + stato public.libro_stato, + provenienza public.libro_provenienza, + appartiene_a character varying NOT NULL +); + + +-- +-- Name: audiolibro_narrata_da; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.audiolibro_narrata_da ( + isbn_edizione character(13) NOT NULL, + id_narratore integer NOT NULL +); + + +-- +-- Name: audiolibro_narratore_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.audiolibro_narratore_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: audiolibro_narratore; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.audiolibro_narratore ( + id integer DEFAULT nextval('public.audiolibro_narratore_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: audiolibro_recensione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.audiolibro_recensione ( + id bigint NOT NULL, + commento text NOT NULL, + valutazione smallint NOT NULL, + data timestamp without time zone DEFAULT now() NOT NULL, + CONSTRAINT audiolibro_recensione_valutazione_check CHECK (((valutazione >= 0) AND (valutazione <= 100))) +); + + +-- +-- Name: film; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film ( + eidr character(34) NOT NULL, + titolo character varying NOT NULL, + sinossi text, + locandina bytea, + durata interval, + CONSTRAINT durata_check CHECK ((date_part('epoch'::text, durata) >= (0)::double precision)) +); + + +-- +-- Name: COLUMN film.eidr; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.film.eidr IS 'Gli EIDR sono tutti di 34 caratteri. + +http://eidr.org/documents/EIDR_ID_Format_v1.1.pdf'; + + +-- +-- Name: film_appartenenza_a_genere; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_appartenenza_a_genere ( + id_genere integer NOT NULL, + eidr character(34) NOT NULL +); + + +-- +-- Name: film_cast_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.film_cast_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: film_cast; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_cast ( + id integer DEFAULT nextval('public.film_cast_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: film_correlazioni; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_correlazioni ( + eidr_1 character(34) NOT NULL, + eidr_2 character(34) NOT NULL +); + + +-- +-- Name: film_elemento; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_elemento ( + id bigint DEFAULT nextval('public.elemento_id_seq'::regclass) NOT NULL, + stato public.film_stato, + provenienza public.film_provenienza, + istanza_di character(34) NOT NULL, + appartiene_a character varying NOT NULL +); + + +-- +-- Name: film_genere_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.film_genere_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: film_genere; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_genere ( + id integer DEFAULT nextval('public.film_genere_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: film_localizzazione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_localizzazione ( + lingua character(4) NOT NULL, + eidr character(34) NOT NULL, + titolo_localizzato character varying NOT NULL +); + + +-- +-- Name: film_prodotto_da; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_prodotto_da ( + id_studio integer NOT NULL, + eidr character(34) NOT NULL +); + + +-- +-- Name: film_recensione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_recensione ( + id bigint NOT NULL, + commento text NOT NULL, + data timestamp without time zone DEFAULT now() NOT NULL, + valutazione smallint NOT NULL, + CONSTRAINT film_recensione_valutazione_check CHECK (((valutazione >= 0) AND (valutazione <= 100))) +); + + +-- +-- Name: film_ruolo_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.film_ruolo_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: film_ruolo; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_ruolo ( + id integer DEFAULT nextval('public.film_ruolo_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: film_studio_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.film_studio_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: film_studio; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_studio ( + id integer DEFAULT nextval('public.film_studio_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: film_vi_ha_preso_parte; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.film_vi_ha_preso_parte ( + eidr character(34) NOT NULL, + id_cast integer NOT NULL, + id_ruolo integer NOT NULL +); + + +-- +-- Name: gioco_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.gioco_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: gioco; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco ( + id integer DEFAULT nextval('public.gioco_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL, + descrizione text +); + + +-- +-- Name: gioco_appartenenza_a_genere; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_appartenenza_a_genere ( + id_gioco integer NOT NULL, + id_genere integer NOT NULL +); + + +-- +-- Name: gioco_correlazioni; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_correlazioni ( + id_1 integer NOT NULL, + id_2 integer NOT NULL +); + + +-- +-- Name: gioco_edizione_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.gioco_edizione_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: gioco_edizione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_edizione ( + id integer DEFAULT nextval('public.gioco_edizione_id_seq'::regclass) NOT NULL, + titolo_alternativo character varying, + piattaforma character varying NOT NULL, + box_art bytea, + relativa_a integer NOT NULL +); + + +-- +-- Name: gioco_elemento; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_elemento ( + id bigint DEFAULT nextval('public.elemento_id_seq'::regclass) NOT NULL, + stato public.gioco_stato, + provenienza public.gioco_provenienza, + istanza_di integer NOT NULL, + appartiene_a character varying NOT NULL +); + + +-- +-- Name: gioco_genere_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.gioco_genere_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: gioco_genere; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_genere ( + id integer DEFAULT nextval('public.gioco_genere_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: gioco_portato_da; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_portato_da ( + id_edizione integer NOT NULL, + id_studio integer NOT NULL +); + + +-- +-- Name: gioco_prodotto_da; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_prodotto_da ( + id_gioco integer NOT NULL, + id_studio integer NOT NULL +); + + +-- +-- Name: gioco_recensione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_recensione ( + id bigint NOT NULL, + commento text NOT NULL, + data timestamp without time zone DEFAULT now() NOT NULL, + valutazione smallint NOT NULL, + CONSTRAINT gioco_recensione_valutazione_check CHECK (((valutazione >= 0) AND (valutazione <= 100))) +); + + +-- +-- Name: gioco_studio_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.gioco_studio_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: gioco_studio; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_studio ( + id integer DEFAULT nextval('public.gioco_studio_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: gioco_sviluppato_da; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.gioco_sviluppato_da ( + id_gioco integer NOT NULL, + id_studio integer NOT NULL +); + + +-- +-- Name: libro_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.libro_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: libro; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro ( + id integer DEFAULT nextval('public.libro_id_seq'::regclass) NOT NULL, + titolo_primario character varying NOT NULL, + sinossi text +); + + +-- +-- Name: libro_appartenenza_a_genere; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_appartenenza_a_genere ( + id_genere integer NOT NULL, + id_libro integer NOT NULL +); + + +-- +-- Name: libro_autore_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.libro_autore_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: libro_autore; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_autore ( + id integer DEFAULT nextval('public.libro_autore_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: libro_correlazioni; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_correlazioni ( + id_1 integer NOT NULL, + id_2 integer NOT NULL +); + + +-- +-- Name: libro_editore; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_editore ( + parte_isbn character varying(7) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: COLUMN libro_editore.parte_isbn; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.libro_editore.parte_isbn IS 'Gli editori hanno un prefisso ISBN univoco di 5 cifre. + +https://www.isbn.it/CODICEISBN.aspx'; + + +-- +-- Name: libro_edizione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_edizione ( + isbn character(13) NOT NULL, + titolo_edizione character varying NOT NULL, + pagine integer, + copertina bytea, + relativa_a integer NOT NULL, + CONSTRAINT libro_edizione_isbn_check CHECK ((public.is_numeric(("substring"((isbn)::text, 1, 12))::character varying) AND (public.is_numeric(("right"((isbn)::text, 1))::character varying) OR ("right"((isbn)::text, 1) ~~ '%X'::text)))), + CONSTRAINT libro_edizione_pagine_check CHECK ((pagine >= 0)) +); + + +-- +-- Name: COLUMN libro_edizione.isbn; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.libro_edizione.isbn IS 'L''ISBN ha sempre 13 cifre. + +https://www.isbn.it/CODICEISBN.aspx'; + + +-- +-- Name: libro_elemento; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_elemento ( + id bigint DEFAULT nextval('public.elemento_id_seq'::regclass) NOT NULL, + istanza_di character(13) NOT NULL, + stato public.libro_stato, + provenienza public.libro_provenienza, + appartiene_a character varying NOT NULL +); + + +-- +-- Name: libro_genere_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.libro_genere_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: libro_genere; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_genere ( + id integer DEFAULT nextval('public.libro_genere_id_seq'::regclass) NOT NULL, + nome character varying NOT NULL +); + + +-- +-- Name: libro_recensione; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_recensione ( + id bigint NOT NULL, + commento text NOT NULL, + data timestamp without time zone DEFAULT now() NOT NULL, + valutazione integer NOT NULL, + CONSTRAINT libro_recensione_valutazione_check CHECK (((valutazione >= 0) AND (valutazione <= 100))) +); + + +-- +-- Name: libro_scritto_da; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.libro_scritto_da ( + id_libro integer NOT NULL, + id_autore integer NOT NULL +); + + +-- +-- Name: utente; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.utente ( + username character varying NOT NULL, + password bytea NOT NULL, + email character varying, + is_admin boolean DEFAULT false NOT NULL, + is_banned boolean DEFAULT false NOT NULL, + libro_elementi_posseduti integer DEFAULT 0 NOT NULL, + audiolibro_elementi_posseduti integer DEFAULT 0 NOT NULL, + film_elementi_posseduti integer DEFAULT 0 NOT NULL, + gioco_elementi_posseduti integer DEFAULT 0 NOT NULL +); + + +-- +-- Data for Name: audiolibro_edizione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.audiolibro_edizione (isbn, titolo, durata, immagine, relativa_a) FROM stdin; +9781433261565 Moby Dick \N \N 1 +9788862560320 Harry Potter e la Pietra Filosofale \N \N 3 +9788898425376 Il Libro della Giungla 05:25:00 \N 10 +\. + + +-- +-- Data for Name: audiolibro_elemento; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.audiolibro_elemento (id, istanza_di, stato, provenienza, appartiene_a) FROM stdin; +1 9788898425376 FINITO PRESTITO Cookie +2 9788862560320 FINITO ACQUISTATO_DIGITALE Adolfo +\. + + +-- +-- Data for Name: audiolibro_narrata_da; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.audiolibro_narrata_da (isbn_edizione, id_narratore) FROM stdin; +9788862560320 1 +9788898425376 2 +\. + + +-- +-- Data for Name: audiolibro_narratore; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.audiolibro_narratore (id, nome) FROM stdin; +1 Giorgio Scaramuzzino +2 Pino Insegno +\. + + +-- +-- Data for Name: audiolibro_recensione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.audiolibro_recensione (id, commento, valutazione, data) FROM stdin; +1 Molto carino, e Pino Insegno ha una bellissima voce. 75 2020-06-03 12:05:12.618531 +2 Libro bellissimo, ma letto maluccio 60 2020-04-21 20:12:34.624137 +\. + + +-- +-- Data for Name: film; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film (eidr, titolo, sinossi, locandina, durata) FROM stdin; +10.5240/29E6-2D4B-B704-2B69-441F-8 Titanic \N \N 03:15:00 +10.5240/E030-107B-C08A-BF93-AC79-B The Lord of the Rings: The Fellowship of the Ring \N \N \N +10.5240/598E-D2AE-1B7D-67EB-3F75-6 The Lord of the Rings: The Two Towers \N \N \N +10.5240/B07E-E305-8057-CD37-0887-E The Lord of the Rings: The Return of the King \N \N \N +10.5240/0EF3-54F9-2642-0B49-6829-R Inception \N \N 02:28:00 +10.5240/3CB5-4D3B-BC77-8A4E-78D4-9 La vita è bella \N \N \N +10.5240/E73C-4D4C-4F90-781B-B62F-K Shining \N \N 02:26:00 +10.5240/09A3-1F6E-3538-DF46-5C6F-I Back to the Future \N \N \N +10.5240/5DA5-C386-2911-7E2B-1782-L Back to the Future Part II \N \N \N +\. + + +-- +-- Data for Name: film_appartenenza_a_genere; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_appartenenza_a_genere (id_genere, eidr) FROM stdin; +5 10.5240/E73C-4D4C-4F90-781B-B62F-K +6 10.5240/09A3-1F6E-3538-DF46-5C6F-I +2 10.5240/5DA5-C386-2911-7E2B-1782-L +3 10.5240/29E6-2D4B-B704-2B69-441F-8 +1 10.5240/E030-107B-C08A-BF93-AC79-B +1 10.5240/598E-D2AE-1B7D-67EB-3F75-6 +1 10.5240/B07E-E305-8057-CD37-0887-E +\. + + +-- +-- Data for Name: film_cast; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_cast (id, nome) FROM stdin; +1 Stanley Kubrick +2 Leonardo DiCaprio +3 Peter Jackson +4 Orlando Bloom +5 Roberto Benigni +\. + + +-- +-- Data for Name: film_correlazioni; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_correlazioni (eidr_1, eidr_2) FROM stdin; +10.5240/E030-107B-C08A-BF93-AC79-B 10.5240/598E-D2AE-1B7D-67EB-3F75-6 +10.5240/E030-107B-C08A-BF93-AC79-B 10.5240/B07E-E305-8057-CD37-0887-E +10.5240/598E-D2AE-1B7D-67EB-3F75-6 10.5240/B07E-E305-8057-CD37-0887-E +10.5240/09A3-1F6E-3538-DF46-5C6F-I 10.5240/5DA5-C386-2911-7E2B-1782-L +\. + + +-- +-- Data for Name: film_elemento; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_elemento (id, stato, provenienza, istanza_di, appartiene_a) FROM stdin; +1 VISTO VISTO_AL_CINEMA 10.5240/29E6-2D4B-B704-2B69-441F-8 Adolfo +2 VISTO ACQUISTATO_FISICO 10.5240/E030-107B-C08A-BF93-AC79-B Paolino +3 VISTO VISTO_IN_TV 10.5240/09A3-1F6E-3538-DF46-5C6F-I Paolino +4 DA_VEDERE VISTO_IN_TV 10.5240/5DA5-C386-2911-7E2B-1782-L Paolino +5 VISTO VISTO_AL_CINEMA 10.5240/0EF3-54F9-2642-0B49-6829-R Cookie +6 VISTO ACQUISTATO_FISICO 10.5240/3CB5-4D3B-BC77-8A4E-78D4-9 Adolfo +7 VISTO VISTO_IN_TV 10.5240/09A3-1F6E-3538-DF46-5C6F-I Cookie +8 VISTO VISTO_IN_TV 10.5240/5DA5-C386-2911-7E2B-1782-L Cookie +9 VISTO ACQUISTATO_FISICO 10.5240/E030-107B-C08A-BF93-AC79-B Cookie +10 VISTO PRESTITO 10.5240/29E6-2D4B-B704-2B69-441F-8 Paolino +\. + + +-- +-- Data for Name: film_genere; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_genere (id, nome) FROM stdin; +1 Fantasy +2 Fantascienza +3 Romantico +4 Thriller +5 Horror +6 Comico +\. + + +-- +-- Data for Name: film_localizzazione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_localizzazione (lingua, eidr, titolo_localizzato) FROM stdin; +it 10.5240/E030-107B-C08A-BF93-AC79-B Il Signore degli Anelli: la Compagnia dell'Anello +it 10.5240/598E-D2AE-1B7D-67EB-3F75-6 Il Signore degli Anelli: le Due Torri +it 10.5240/B07E-E305-8057-CD37-0887-E Il Signore degli Anelli: il Ritorno del Re +it 10.5240/09A3-1F6E-3538-DF46-5C6F-I Ritorno al Futuro +it 10.5240/5DA5-C386-2911-7E2B-1782-L Ritorno al Futuro parte II +\. + + +-- +-- Data for Name: film_prodotto_da; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_prodotto_da (id_studio, eidr) FROM stdin; +1 10.5240/29E6-2D4B-B704-2B69-441F-8 +2 10.5240/E030-107B-C08A-BF93-AC79-B +2 10.5240/598E-D2AE-1B7D-67EB-3F75-6 +2 10.5240/B07E-E305-8057-CD37-0887-E +3 10.5240/E73C-4D4C-4F90-781B-B62F-K +3 10.5240/0EF3-54F9-2642-0B49-6829-R +4 10.5240/0EF3-54F9-2642-0B49-6829-R +5 10.5240/09A3-1F6E-3538-DF46-5C6F-I +6 10.5240/09A3-1F6E-3538-DF46-5C6F-I +5 10.5240/5DA5-C386-2911-7E2B-1782-L +6 10.5240/5DA5-C386-2911-7E2B-1782-L +\. + + +-- +-- Data for Name: film_recensione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_recensione (id, commento, data, valutazione) FROM stdin; +6 Film eccellente, davvero ben fatto e profondo 2020-03-01 08:05:24.916243 100 +3 Spassosissimo, non vedo l'ora che alla TV diano il secondo! 2020-05-04 23:56:18.27341 88 +2 Gran bel film, e ben recitato! 2020-03-21 14:10:28.624197 80 +5 Lo adoro. Punto. 2020-04-22 10:20:47.152308 95 +10 Una lungaggine mostruosa. Mi sono annoiato dall'inizio alla fine. Non sono fatto per i film romantici... 2020-02-02 20:57:22.725368 25 +\. + + +-- +-- Data for Name: film_ruolo; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_ruolo (id, nome) FROM stdin; +1 attore protagonista +2 attore non protagonista +3 regista +\. + + +-- +-- Data for Name: film_studio; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_studio (id, nome) FROM stdin; +1 20th Century Fox +2 New Line Cinema +3 Warner Bros +4 Legendary Pictures +5 Universal Pictures +6 Amblin Entertainment +\. + + +-- +-- Data for Name: film_vi_ha_preso_parte; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.film_vi_ha_preso_parte (eidr, id_cast, id_ruolo) FROM stdin; +10.5240/E030-107B-C08A-BF93-AC79-B 3 3 +10.5240/E030-107B-C08A-BF93-AC79-B 4 2 +10.5240/598E-D2AE-1B7D-67EB-3F75-6 3 3 +10.5240/598E-D2AE-1B7D-67EB-3F75-6 4 2 +10.5240/B07E-E305-8057-CD37-0887-E 3 3 +10.5240/B07E-E305-8057-CD37-0887-E 4 2 +10.5240/29E6-2D4B-B704-2B69-441F-8 2 1 +10.5240/0EF3-54F9-2642-0B49-6829-R 2 1 +10.5240/3CB5-4D3B-BC77-8A4E-78D4-9 5 1 +10.5240/3CB5-4D3B-BC77-8A4E-78D4-9 5 3 +10.5240/E73C-4D4C-4F90-781B-B62F-K 1 3 +\. + + +-- +-- Data for Name: gioco; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco (id, nome, descrizione) FROM stdin; +1 Fire Emblem: Three Houses \N +2 AI: The Somnium Files \N +3 Factorio \N +4 Terraria \N +5 Tetris 99 \N +6 Fire Emblem Echoes: Shadows of Valentia \N +7 Il Professor Layton e il Paese dei Misteri Il famoso gentiluomo Hershel Layton e il suo fido assistente Luke, dopo aver ricevuto una lettera, si precipitano nello sperduto villaggio di Saint-Mystère... +8 Il Professor Layton e lo Scrigno di Pandora \N +\. + + +-- +-- Data for Name: gioco_appartenenza_a_genere; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_appartenenza_a_genere (id_gioco, id_genere) FROM stdin; +1 1 +1 9 +1 8 +1 6 +2 6 +2 2 +3 7 +3 5 +3 9 +2 9 +4 4 +4 5 +3 3 +4 9 +5 5 +5 10 +6 1 +6 9 +6 8 +6 6 +\. + + +-- +-- Data for Name: gioco_correlazioni; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_correlazioni (id_1, id_2) FROM stdin; +1 6 +7 8 +\. + + +-- +-- Data for Name: gioco_edizione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_edizione (id, titolo_alternativo, piattaforma, box_art, relativa_a) FROM stdin; +1 \N Nintendo Switch \N 1 +2 \N PC \N 2 +3 \N PC \N 3 +4 \N PC\r\n \N 4 +5 \N Nintendo Switch \N 5 +6 \N Nintendo Switch \N 4 +7 \N Nintendo 3DS \N 6 +8 \N Nintendo DS \N 7 +9 \N Nintendo DS \N 8 +\. + + +-- +-- Data for Name: gioco_elemento; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_elemento (id, stato, provenienza, istanza_di, appartiene_a) FROM stdin; +1 FINITO PRESO_IN_PRESTITO 1 Steffo +2 COMPLETATO ALTRO 2 Steffo +3 FINITO ACQUISTATO 3 Steffo +4 FINITO ACQUISTATO 4 Steffo +5 NON_APPLICABILE GRATUITO 5 Steffo +6 FINITO ACQUISTATO 1 Paolino +7 DA_INIZIARE GRATUITO 5 Paolino +8 NON_APPLICABILE ACQUISTATO 6 Paolino +9 DA_INIZIARE GRATUITO 3 Cookie +10 FINITO ACQUISTATO 7 Cookie +11 COMPLETATO ACQUISTATO 8 Cookie +\. + + +-- +-- Data for Name: gioco_genere; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_genere (id, nome) FROM stdin; +1 Strategia +2 Giallo +3 Industria +4 Avventura +5 Multigiocatore +6 Giapponese +7 Ingegneria +8 Fantasy +9 Giocatore singolo +10 Tetris +\. + + +-- +-- Data for Name: gioco_portato_da; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_portato_da (id_edizione, id_studio) FROM stdin; +4 7 +\. + + +-- +-- Data for Name: gioco_prodotto_da; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_prodotto_da (id_gioco, id_studio) FROM stdin; +1 5 +2 2 +3 3 +4 4 +5 5 +\. + + +-- +-- Data for Name: gioco_recensione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_recensione (id, commento, data, valutazione) FROM stdin; +1 Bello, ma non al livello del settimo capitolo della serie. 2020-06-04 18:00:33.270987 82 +3 Attenzione: causa dipendenza 2020-06-04 18:00:33.270987 80 +5 Inaspettatamente divertente. 2020-06-04 18:00:33.270987 78 +6 Bellissimo 2020-05-25 10:30:37.725301 90 +7 Stupendo! Adoro i giochi di misteri! 2020-01-08 09:00:32.926157 87 +8 Completato tutto, bello quanto il primo (nonostante l'ultimo "mangia la pallina" mi abbia distrutta). 2020-02-17 20:22:54.261348 86 +\. + + +-- +-- Data for Name: gioco_studio; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_studio (id, nome) FROM stdin; +1 Intelligent Systems +2 Spike Chunsoft +3 Wube Software +4 Re-Logic +5 Nintendo +6 Arika +7 505 Games +\. + + +-- +-- Data for Name: gioco_sviluppato_da; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.gioco_sviluppato_da (id_gioco, id_studio) FROM stdin; +1 1 +1 5 +2 2 +3 3 +4 4 +5 5 +5 6 +\. + + +-- +-- Data for Name: libro; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro (id, titolo_primario, sinossi) FROM stdin; +1 Moby Dick \N +2 A Study in Scarlet \N +3 Harry Potter e la pietra pilosofale Primo libro della famosa saga di Harry Potter, di J. K. Rowling. +4 Il segno dei quattro \N +5 La via del male \N +6 Ventimila leghe sotto i mari \N +7 Il signore degli anelli: la compagnia dell'anello \N +8 Il signore degli anelli: le due torri \N +9 Il signore degli anelli: il ritorno del re \N +10 Il libro della giungla \N +\. + + +-- +-- Data for Name: libro_appartenenza_a_genere; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_appartenenza_a_genere (id_genere, id_libro) FROM stdin; +1 7 +1 8 +1 9 +1 3 +2 4 +2 2 +2 5 +3 1 +\. + + +-- +-- Data for Name: libro_autore; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_autore (id, nome) FROM stdin; +1 Herman Melville +2 Arthur Conan Doyle +3 Joanne Rowling +4 John Ronald Reuel Tolkien +5 Andrea Camilleri +6 Agatha Christie +\. + + +-- +-- Data for Name: libro_correlazioni; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_correlazioni (id_1, id_2) FROM stdin; +7 8 +7 9 +8 9 +\. + + +-- +-- Data for Name: libro_editore; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_editore (parte_isbn, nome) FROM stdin; +459 Adelphi +8451 Adriano Salani Editore +04 Arnoldo Mondadori Editore +6918 Adriano Salani Editore +452 Bompiani +486 Libri Oro Rizzoli +\. + + +-- +-- Data for Name: libro_edizione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_edizione (isbn, titolo_edizione, pagine, copertina, relativa_a) FROM stdin; +9788845910951 Moby Dick o la balena 588 \N 1 +9788884516107 Harry Potter e la pietra pilosofale \N \N 3 +9788804668466 Il segno dei quattro \N \N 4 +9788869184796 La via del male \N \N 5 +9788861883956 Ventimila leghe sotto i mari \N \N 6 +9788845290404 Il signore degli Anelli: la compagnia dell'anello \N \N 7 +9788845290428 Il signore degli anelli: le due torri \N \N 8 +9788848603720 Il signore degli anelli: il ritorno del re \N \N 9 +\. + + +-- +-- Data for Name: libro_elemento; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_elemento (id, istanza_di, stato, provenienza, appartiene_a) FROM stdin; +10 9788848603720 FINITO ACQUISTATO_FISICO Steffo +11 9788845290428 FINITO ACQUISTATO_FISICO Steffo +12 9788845290404 FINITO ACQUISTATO_FISICO Steffo +13 9788869184796 DA_INIZIARE PRESTITO Cookie +14 9788884516107 FINITO ACQUISTATO_FISICO Cookie +15 9788804668466 INIZIATO ACQUISTATO_DIGITALE Cookie +16 9788845290404 FINITO PRESTITO Paolino +17 9788845290428 ABBANDONATO PRESTITO Paolino +18 9788845910951 FINITO ACQUISTATO_FISICO Adolfo +19 9788861883956 FINITO ACQUISTATO_FISICO Adolfo +\. + + +-- +-- Data for Name: libro_genere; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_genere (id, nome) FROM stdin; +1 Fantasy +2 Giallo +3 Romanzo +\. + + +-- +-- Data for Name: libro_recensione; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_recensione (id, commento, data, valutazione) FROM stdin; +10 Inizio fantastico per una fantastica saga fantasy. 2020-06-04 18:05:22.212523 90 +17 Noiosissimo, non sono riuscito a finirlo!! 2020-03-10 21:01:13.142351 20 +16 Un amico mi ha consigliato di leggere la saga cartacea, il primo non è male ma un po' monotono... 2020-02-23 20:37:24.513521 70 +18 Chiamatemi Ismaele. Un grande classico che tutti dovrebbero leggere. 2020-01-06 17:30:47.423513 95 +\. + + +-- +-- Data for Name: libro_scritto_da; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.libro_scritto_da (id_libro, id_autore) FROM stdin; +1 1 +2 2 +7 4 +8 4 +9 4 +5 3 +3 3 +\. + + +-- +-- Data for Name: utente; Type: TABLE DATA; Schema: public; Owner: - +-- + +COPY public.utente (username, password, email, is_admin, is_banned, libro_elementi_posseduti, audiolibro_elementi_posseduti, film_elementi_posseduti, gioco_elementi_posseduti) FROM stdin; +Steffo \\x2432622431322464657148396e46436e41615658786c4f50453538504f394777356d48466e4c507741302f4e344c61414b744631397a48372e2e6e71 me@steffo.eu t f 3 0 0 5 +Adolfo \\x243262243132246c4b3539323747476354306838766f5a72314f79506534723756755850644f6868696935756748783473725974576330642e63616d \N f t 2 1 2 0 +Cookie \\x24326224313224576f755a4a6d4563573241616169662f66396f6a484f516d554253675270316c6d7950576551744650504d3962636c57616b716743 chiara.calzolari.cc@gmail.com t f 3 1 4 3 +Paolino \\x24326224313224783963563341766c4e693770663935696c355468442e4f2e477a344a68526675726f354a47724264436f41755a6d516d4131687236 example@example.org f f 2 0 4 3 +\. + + +-- +-- Name: audiolibro_narratore_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.audiolibro_narratore_id_seq', 1, false); + + +-- +-- Name: elemento_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.elemento_id_seq', 12, true); + + +-- +-- Name: film_cast_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.film_cast_id_seq', 1, false); + + +-- +-- Name: film_genere_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.film_genere_id_seq', 1, false); + + +-- +-- Name: film_ruolo_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.film_ruolo_id_seq', 1, false); + + +-- +-- Name: film_studio_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.film_studio_id_seq', 1, false); + + +-- +-- Name: gioco_edizione_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.gioco_edizione_id_seq', 7, true); + + +-- +-- Name: gioco_genere_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.gioco_genere_id_seq', 10, true); + + +-- +-- Name: gioco_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.gioco_id_seq', 6, true); + + +-- +-- Name: gioco_studio_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.gioco_studio_id_seq', 7, true); + + +-- +-- Name: libro_autore_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.libro_autore_id_seq', 1, false); + + +-- +-- Name: libro_genere_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.libro_genere_id_seq', 1, false); + + +-- +-- Name: libro_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - +-- + +SELECT pg_catalog.setval('public.libro_id_seq', 1, false); + + +-- +-- Name: audiolibro_edizione audiolibro_edizione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_edizione + ADD CONSTRAINT audiolibro_edizione_pkey PRIMARY KEY (isbn); + + +-- +-- Name: audiolibro_elemento audiolibro_elemento_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_elemento + ADD CONSTRAINT audiolibro_elemento_pkey PRIMARY KEY (id); + + +-- +-- Name: audiolibro_narrata_da audiolibro_narrata_da_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_narrata_da + ADD CONSTRAINT audiolibro_narrata_da_pkey PRIMARY KEY (isbn_edizione, id_narratore); + + +-- +-- Name: audiolibro_narratore audiolibro_narratore_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_narratore + ADD CONSTRAINT audiolibro_narratore_pkey PRIMARY KEY (id); + + +-- +-- Name: audiolibro_recensione audiolibro_recensione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_recensione + ADD CONSTRAINT audiolibro_recensione_pkey PRIMARY KEY (id); + + +-- +-- Name: film_appartenenza_a_genere film_appartenenza_a_genere_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_appartenenza_a_genere + ADD CONSTRAINT film_appartenenza_a_genere_pkey PRIMARY KEY (id_genere, eidr); + + +-- +-- Name: film_cast film_cast_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_cast + ADD CONSTRAINT film_cast_pkey PRIMARY KEY (id); + + +-- +-- Name: film_correlazioni film_correlazioni_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_correlazioni + ADD CONSTRAINT film_correlazioni_pkey PRIMARY KEY (eidr_1, eidr_2); + + +-- +-- Name: film_elemento film_elemento_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_elemento + ADD CONSTRAINT film_elemento_pkey PRIMARY KEY (id); + + +-- +-- Name: film_genere film_genere_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_genere + ADD CONSTRAINT film_genere_pkey PRIMARY KEY (id); + + +-- +-- Name: film_localizzazione film_localizzazione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_localizzazione + ADD CONSTRAINT film_localizzazione_pkey PRIMARY KEY (eidr, lingua); + + +-- +-- Name: film film_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film + ADD CONSTRAINT film_pkey PRIMARY KEY (eidr); + + +-- +-- Name: film_prodotto_da film_prodotto_da_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_prodotto_da + ADD CONSTRAINT film_prodotto_da_pkey PRIMARY KEY (id_studio, eidr); + + +-- +-- Name: film_recensione film_recensione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_recensione + ADD CONSTRAINT film_recensione_pkey PRIMARY KEY (id); + + +-- +-- Name: film_studio film_studio_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_studio + ADD CONSTRAINT film_studio_pkey PRIMARY KEY (id); + + +-- +-- Name: film_vi_ha_preso_parte film_vi_ha_preso_parte_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT film_vi_ha_preso_parte_pkey PRIMARY KEY (eidr, id_cast, id_ruolo); + + +-- +-- Name: gioco_appartenenza_a_genere gioco_appartenenza_a_genere_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_appartenenza_a_genere + ADD CONSTRAINT gioco_appartenenza_a_genere_pkey PRIMARY KEY (id_gioco, id_genere); + + +-- +-- Name: gioco_correlazioni gioco_correlazioni_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_correlazioni + ADD CONSTRAINT gioco_correlazioni_pkey PRIMARY KEY (id_1, id_2); + + +-- +-- Name: gioco_edizione gioco_edizione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_edizione + ADD CONSTRAINT gioco_edizione_pkey PRIMARY KEY (id); + + +-- +-- Name: gioco_elemento gioco_elemento_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_elemento + ADD CONSTRAINT gioco_elemento_pkey PRIMARY KEY (id); + + +-- +-- Name: gioco_genere gioco_genere_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_genere + ADD CONSTRAINT gioco_genere_pkey PRIMARY KEY (id); + + +-- +-- Name: gioco gioco_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco + ADD CONSTRAINT gioco_pkey PRIMARY KEY (id); + + +-- +-- Name: gioco_portato_da gioco_portato_da_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_portato_da + ADD CONSTRAINT gioco_portato_da_pkey PRIMARY KEY (id_edizione, id_studio); + + +-- +-- Name: gioco_prodotto_da gioco_prodotto_da_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_prodotto_da + ADD CONSTRAINT gioco_prodotto_da_pkey PRIMARY KEY (id_gioco, id_studio); + + +-- +-- Name: gioco_recensione gioco_recensione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_recensione + ADD CONSTRAINT gioco_recensione_pkey PRIMARY KEY (id); + + +-- +-- Name: gioco_studio gioco_studio_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_studio + ADD CONSTRAINT gioco_studio_pkey PRIMARY KEY (id); + + +-- +-- Name: gioco_sviluppato_da gioco_sviluppato_da_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_sviluppato_da + ADD CONSTRAINT gioco_sviluppato_da_pkey PRIMARY KEY (id_gioco, id_studio); + + +-- +-- Name: libro_appartenenza_a_genere libro_appartenenza_a_genere_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_appartenenza_a_genere + ADD CONSTRAINT libro_appartenenza_a_genere_pkey PRIMARY KEY (id_genere, id_libro); + + +-- +-- Name: libro_autore libro_autore_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_autore + ADD CONSTRAINT libro_autore_pkey PRIMARY KEY (id); + + +-- +-- Name: libro_correlazioni libro_correlazioni_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_correlazioni + ADD CONSTRAINT libro_correlazioni_pkey PRIMARY KEY (id_1, id_2); + + +-- +-- Name: libro_editore libro_editore_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_editore + ADD CONSTRAINT libro_editore_pkey PRIMARY KEY (parte_isbn); + + +-- +-- Name: libro_edizione libro_edizione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_edizione + ADD CONSTRAINT libro_edizione_pkey PRIMARY KEY (isbn); + + +-- +-- Name: libro_elemento libro_elemento_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_elemento + ADD CONSTRAINT libro_elemento_pkey PRIMARY KEY (id); + + +-- +-- Name: libro_genere libro_genere_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_genere + ADD CONSTRAINT libro_genere_pkey PRIMARY KEY (id); + + +-- +-- Name: libro libro_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro + ADD CONSTRAINT libro_pkey PRIMARY KEY (id); + + +-- +-- Name: libro_recensione libro_recensione_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_recensione + ADD CONSTRAINT libro_recensione_pkey PRIMARY KEY (id); + + +-- +-- Name: libro_scritto_da libro_scritto_da_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_scritto_da + ADD CONSTRAINT libro_scritto_da_pkey PRIMARY KEY (id_libro, id_autore); + + +-- +-- Name: film_ruolo ruolo_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_ruolo + ADD CONSTRAINT ruolo_pkey PRIMARY KEY (id); + + +-- +-- Name: utente username; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.utente + ADD CONSTRAINT username PRIMARY KEY (username); + + +-- +-- Name: audiolibro_elemento numero_audiolibri_trigger; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER numero_audiolibri_trigger BEFORE INSERT OR DELETE ON public.audiolibro_elemento FOR EACH ROW EXECUTE PROCEDURE public.update_n_audiolibri(); + + +-- +-- Name: film_elemento numero_film_trigger; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER numero_film_trigger BEFORE INSERT OR DELETE ON public.film_elemento FOR EACH ROW EXECUTE PROCEDURE public.update_n_film(); + + +-- +-- Name: gioco_elemento numero_giochi_trigger; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER numero_giochi_trigger BEFORE INSERT OR DELETE ON public.gioco_elemento FOR EACH ROW EXECUTE PROCEDURE public.update_n_giochi(); + + +-- +-- Name: libro_elemento numero_libri_trigger; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER numero_libri_trigger BEFORE INSERT OR DELETE ON public.libro_elemento FOR EACH ROW EXECUTE PROCEDURE public.update_n_libri(); + + +-- +-- Name: libro_elemento appartiene_a; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_elemento + ADD CONSTRAINT appartiene_a FOREIGN KEY (appartiene_a) REFERENCES public.utente(username); + + +-- +-- Name: audiolibro_elemento appartiene_a; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_elemento + ADD CONSTRAINT appartiene_a FOREIGN KEY (appartiene_a) REFERENCES public.utente(username); + + +-- +-- Name: film_elemento appartiene_a; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_elemento + ADD CONSTRAINT appartiene_a FOREIGN KEY (appartiene_a) REFERENCES public.utente(username); + + +-- +-- Name: gioco_elemento appartiene_a; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_elemento + ADD CONSTRAINT appartiene_a FOREIGN KEY (appartiene_a) REFERENCES public.utente(username); + + +-- +-- Name: film_appartenenza_a_genere eidr; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_appartenenza_a_genere + ADD CONSTRAINT eidr FOREIGN KEY (eidr) REFERENCES public.film(eidr); + + +-- +-- Name: film_localizzazione eidr; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_localizzazione + ADD CONSTRAINT eidr FOREIGN KEY (eidr) REFERENCES public.film(eidr); + + +-- +-- Name: film_prodotto_da eidr; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_prodotto_da + ADD CONSTRAINT eidr FOREIGN KEY (eidr) REFERENCES public.film(eidr); + + +-- +-- Name: film_vi_ha_preso_parte eidr; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT eidr FOREIGN KEY (eidr) REFERENCES public.film(eidr); + + +-- +-- Name: film_correlazioni eidr_1; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_correlazioni + ADD CONSTRAINT eidr_1 FOREIGN KEY (eidr_1) REFERENCES public.film(eidr); + + +-- +-- Name: film_correlazioni eidr_2; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_correlazioni + ADD CONSTRAINT eidr_2 FOREIGN KEY (eidr_2) REFERENCES public.film(eidr); + + +-- +-- Name: film_recensione id; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_recensione + ADD CONSTRAINT id FOREIGN KEY (id) REFERENCES public.film_elemento(id); + + +-- +-- Name: gioco_recensione id; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_recensione + ADD CONSTRAINT id FOREIGN KEY (id) REFERENCES public.gioco_elemento(id); + + +-- +-- Name: audiolibro_recensione id; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_recensione + ADD CONSTRAINT id FOREIGN KEY (id) REFERENCES public.audiolibro_elemento(id); + + +-- +-- Name: libro_recensione id; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_recensione + ADD CONSTRAINT id FOREIGN KEY (id) REFERENCES public.libro_elemento(id); + + +-- +-- Name: gioco_correlazioni id_1; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_correlazioni + ADD CONSTRAINT id_1 FOREIGN KEY (id_1) REFERENCES public.gioco(id); + + +-- +-- Name: libro_correlazioni id_1; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_correlazioni + ADD CONSTRAINT id_1 FOREIGN KEY (id_1) REFERENCES public.libro(id); + + +-- +-- Name: gioco_correlazioni id_2; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_correlazioni + ADD CONSTRAINT id_2 FOREIGN KEY (id_2) REFERENCES public.gioco(id); + + +-- +-- Name: libro_correlazioni id_2; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_correlazioni + ADD CONSTRAINT id_2 FOREIGN KEY (id_2) REFERENCES public.libro(id); + + +-- +-- Name: libro_scritto_da id_autore; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_scritto_da + ADD CONSTRAINT id_autore FOREIGN KEY (id_autore) REFERENCES public.libro_autore(id); + + +-- +-- Name: film_vi_ha_preso_parte id_cast; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT id_cast FOREIGN KEY (id_cast) REFERENCES public.film_cast(id); + + +-- +-- Name: gioco_portato_da id_edizione; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_portato_da + ADD CONSTRAINT id_edizione FOREIGN KEY (id_edizione) REFERENCES public.gioco_edizione(id); + + +-- +-- Name: film_appartenenza_a_genere id_genere; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_appartenenza_a_genere + ADD CONSTRAINT id_genere FOREIGN KEY (id_genere) REFERENCES public.film_genere(id); + + +-- +-- Name: gioco_appartenenza_a_genere id_genere; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_appartenenza_a_genere + ADD CONSTRAINT id_genere FOREIGN KEY (id_genere) REFERENCES public.gioco_genere(id); + + +-- +-- Name: libro_appartenenza_a_genere id_genere; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_appartenenza_a_genere + ADD CONSTRAINT id_genere FOREIGN KEY (id_genere) REFERENCES public.libro_genere(id); + + +-- +-- Name: gioco_appartenenza_a_genere id_gioco; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_appartenenza_a_genere + ADD CONSTRAINT id_gioco FOREIGN KEY (id_gioco) REFERENCES public.gioco(id); + + +-- +-- Name: gioco_prodotto_da id_gioco; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_prodotto_da + ADD CONSTRAINT id_gioco FOREIGN KEY (id_gioco) REFERENCES public.gioco(id); + + +-- +-- Name: gioco_sviluppato_da id_gioco; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_sviluppato_da + ADD CONSTRAINT id_gioco FOREIGN KEY (id_gioco) REFERENCES public.gioco(id); + + +-- +-- Name: libro_appartenenza_a_genere id_libro; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_appartenenza_a_genere + ADD CONSTRAINT id_libro FOREIGN KEY (id_libro) REFERENCES public.libro(id); + + +-- +-- Name: libro_scritto_da id_libro; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_scritto_da + ADD CONSTRAINT id_libro FOREIGN KEY (id_libro) REFERENCES public.libro(id); + + +-- +-- Name: audiolibro_narrata_da id_narratore; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_narrata_da + ADD CONSTRAINT id_narratore FOREIGN KEY (id_narratore) REFERENCES public.audiolibro_narratore(id); + + +-- +-- Name: film_vi_ha_preso_parte id_ruolo; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_vi_ha_preso_parte + ADD CONSTRAINT id_ruolo FOREIGN KEY (id_ruolo) REFERENCES public.film_ruolo(id); + + +-- +-- Name: gioco_sviluppato_da id_studio; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_sviluppato_da + ADD CONSTRAINT id_studio FOREIGN KEY (id_studio) REFERENCES public.gioco_studio(id); + + +-- +-- Name: gioco_portato_da id_studio; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_portato_da + ADD CONSTRAINT id_studio FOREIGN KEY (id_studio) REFERENCES public.gioco_studio(id); + + +-- +-- Name: gioco_prodotto_da id_studio; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_prodotto_da + ADD CONSTRAINT id_studio FOREIGN KEY (id_studio) REFERENCES public.gioco_studio(id); + + +-- +-- Name: film_prodotto_da id_studio; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_prodotto_da + ADD CONSTRAINT id_studio FOREIGN KEY (id_studio) REFERENCES public.film_studio(id); + + +-- +-- Name: audiolibro_narrata_da isbn_edizione; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_narrata_da + ADD CONSTRAINT isbn_edizione FOREIGN KEY (isbn_edizione) REFERENCES public.audiolibro_edizione(isbn); + + +-- +-- Name: libro_elemento istanza_di; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_elemento + ADD CONSTRAINT istanza_di FOREIGN KEY (istanza_di) REFERENCES public.libro_edizione(isbn); + + +-- +-- Name: film_elemento istanza_di; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.film_elemento + ADD CONSTRAINT istanza_di FOREIGN KEY (istanza_di) REFERENCES public.film(eidr); + + +-- +-- Name: gioco_elemento istanza_di; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_elemento + ADD CONSTRAINT istanza_di FOREIGN KEY (istanza_di) REFERENCES public.gioco_edizione(id); + + +-- +-- Name: audiolibro_elemento istanza_di; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_elemento + ADD CONSTRAINT istanza_di FOREIGN KEY (istanza_di) REFERENCES public.audiolibro_edizione(isbn); + + +-- +-- Name: libro_edizione relativa_a; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.libro_edizione + ADD CONSTRAINT relativa_a FOREIGN KEY (relativa_a) REFERENCES public.libro(id); + + +-- +-- Name: audiolibro_edizione relativa_a; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.audiolibro_edizione + ADD CONSTRAINT relativa_a FOREIGN KEY (relativa_a) REFERENCES public.libro(id); + + +-- +-- Name: gioco_edizione relativa_a; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.gioco_edizione + ADD CONSTRAINT relativa_a FOREIGN KEY (relativa_a) REFERENCES public.gioco(id); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/6-operazioni.md b/6-operazioni.md new file mode 100644 index 0000000..93b2ca4 --- /dev/null +++ b/6-operazioni.md @@ -0,0 +1,87 @@ +# Query preprogrammate per l'utilizzo del database + +Si sono inserite in questo capitolo della relazione alcuni esempi di query che permetteranno al sito web di interagire con la base di dati. + +Come nel caso della [creazione tabelle](5-3-creazione-tabelle.md), si elencano solo le query più significative. + +## Creazione di un nuovo utente + +```sql +INSERT INTO utente (username, password, email) VALUES ($username, $hashed_password, $email); +``` + +## Promozione di un utente ad amministratore + +```sql +UPDATE utente SET is_admin = true WHERE username = $username; +``` + +## Creazione di un elemento relativo a un libro non esistente nel database + +```sql +INSERT INTO libro (titolo_primario) VALUES ($titolo); + +INSERT INTO libro_edizione (isbn, titolo_edizione, relativa_a) VALUES ($isbn, $titolo, currval('libro_id_seq')); + +INSERT INTO libro_elemento (istanza_di, appartiene_a) VALUES ($isbn, $username); +``` + +## Creazione di una recensione relativa a un elemento + +```sql +INSERT INTO libro_recensione (id, commento, data, valutazione) VALUES ($isbn, $commento, now(), $valutazione); +``` + +## Conteggio degli elementi posseduti da un utente + +```sql +SELECT + libro_elementi_posseduti libri, + audiolibro_elementi_posseduti audiolibri, + film_elementi_posseduti film, + gioco_elementi_posseduti giochi, + (libro_elementi_posseduti + audiolibro_elementi_posseduti + film_elementi_posseduti + gioco_elementi_posseduti) totale +FROM utente +WHERE username = $username; +``` + +## Conteggio del numero totale di edizioni di libri presenti nel database + +```sql +SELECT COUNT(*) FROM libro_edizione; +``` + +## Conteggio del numero totale di edizioni di libri di ogni autore + +```sql +SELECT COUNT(*) +FROM libro_edizione +WHERE relativa_a IN ( + SELECT l.id + FROM libro l + JOIN libro_scritto_da lsd on l.id = lsd.id_libro + JOIN libro_autore la on lsd.id_autore = la.id + WHERE la.id = $id_autore +); +``` + +## Visualizzazione della valutazione media di un gioco + +```sql +SELECT AVG(gr.valutazione) +FROM gioco_recensione gr +JOIN gioco_elemento gel on gr.id = gel.id +JOIN gioco_edizione ge on gel.istanza_di = ge.id +JOIN gioco g on ge.relativa_a = g.id +WHERE g.id = $id_gioco; +``` + +## Visualizzazione di tutte le edizioni di un dato editore + +```sql +SELECT * + FROM libro_editore ld + JOIN libro_edizione lz + ON ld.parte_isbn = substr(lz.isbn, 6, length(ld.parte_isbn)) + WHERE ld.nome = $nome_editore; +``` diff --git a/Autoassociazione.md b/Autoassociazione.md deleted file mode 100644 index ad5d802..0000000 --- a/Autoassociazione.md +++ /dev/null @@ -1,13 +0,0 @@ -# Identificazione delle autoassociazioni - -Nel progetto `alexandria`, ogni libro, film o videogioco è collegato ad una sua pagina in cui vengono visualizzate alcune informazioni salienti su di esso quali l'autore, la casa produttrice o simili. - -Oltre alle informazioni già presenti in ciascuna pagina, si è pensato che sarebbe stato utile all'utente avere, per ogni libro, film o videogioco, anche una lista di elementi ad esso correlati, come ad esempio i sequel di un film, o altri libri ambientati nello stesso universo narrativo. - -Pertanto si è deciso di inserire, per ognuna di queste tre categorie, una autoassociazione come quella in figura: - -![](img/autoassociazione.png) - -Un altra opzione precedentemente presa in considerazione fu quella di inserire un'unica autoassociazione, in corrispondenza dell'entità Elemento. - -Questa opzione venne però scartata per ragioni di logica. L'entità Elemento, infatti, rappresenta una singola _istanza_ di un libro, film o videogioco, e sarebbe stato insensato collegare ciascuna istanza a tutte le altre, in quanto ciò avrebbe portato a un numero elevatissimo di collegamenti. diff --git a/Makefile.mk b/Makefile.mk deleted file mode 100644 index 45f4960..0000000 --- a/Makefile.mk +++ /dev/null @@ -1,16 +0,0 @@ -all: descrizione.pdf glossario.pdf autoassociazione.pdf chiaviprimarieesterne.pdf - -descrizione.pdf: descrizione.md - pandoc -o descrizione.pdf descrizione.md - -glossario.pdf: glossario.md - pandoc -o glossario.pdf glossario.md - -autoassociazione.pdf: autoassociazione.md img/autoassociazione.png - pandoc -o autoassociazione.pdf autoassociazione.md - -chiaviprimarieesterne.pdf: chiaviprimarieesterne.md img/chiaveprimariaesterna.png - pandoc -o chiaviprimarieesterne.pdf chiaviprimarieesterne.md - -gerarchia.pdf: gerarchia.md img/gerarchia1.png img/gerarchia2.png - pandoc -o gerarchia.pdf gerarchia.md diff --git a/README.md b/README.md index c66ff88..b938102 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,45 @@ -# `alexandria` +# ![Alexandria](img/0-README/alexandria.png) -A database for an hypotetical website for users to organize and share their media library. +Un database per un ipotetico sito web di gestione libreria multimediale -Made as a collaboration between [@Steffo99](https://github.com/Steffo99/) and [@Cookie-CHR](https://github.com/Cookie-CHR) for the [Basi di Dati](http://personale.unimore.it/rubrica/contenutiad/rmartoglia/2019/58030/N0/N0/9999) exam at [Unimore](https://www.unimore.it/). +Realizzato in collaborazione tra [@Steffo99](https://github.com/Steffo99/) e [@Cookie-CHR](https://github.com/Cookie-CHR) per l'esame di [Basi di Dati](http://personale.unimore.it/rubrica/contenutiad/rmartoglia/2019/58030/N0/N0/9999) dell'[Unimore](https://www.unimore.it/). -> This project is still a work in progress! +## Specifiche -> Parts of this project may be in Italian, as the Basi di Dati course is in Italian. +Le specifiche di questo progetto sono disponibili nel file [`spec.pdf`](0-spec.pdf). -## Specification +## Capitoli della relazione -The specification for the project is available [in the `spec.pdf` file](/spec.pdf). +1. **[Descrizione](1-descrizione.md)** +2. **[Glossario](2-glossario.md)** +3. **Progettazione concettuale** + 1. [Schema scheletro iniziale](3-1-schema-scheletro.md) + 2. [Classificazione delle gerarchie](3-2-gerarchie.md) + 3. [Identificazione delle autoassociazioni](3-3-autoassociazioni.md) + 4. [Schema scheletro finale](3-4-schema-finale.md) +4. **Progettazione logica** + 1. [Eliminazione delle gerarchie](4-1-eliminazione-gerarchie.md) + 2. [Eliminazione delle chiavi esterne](4-2-eliminazione-chiavi-esterne.md) + 3. [Trasformazione degli attributi composti](4-3-trasformazione-degli-attributi-composti.md) + 4. [Dati derivati](4-4-dati-derivati.md) + 5. [Schema logico](4-5-schema-logico.md) + 6. [Verifica di normalizzazione](4-6-normalizzazione.md) +5. **Schema del database** + 1. [Tecnologia database](5-1-tecnologia-database.md) + 2. [Creazione database](5-2-creazione-database.md) + 3. [Creazione tabelle](5-3-creazione-tabelle.md) +6. **[Query preprogrammate per l'utilizzo del database](6-operazioni.md)** -## Tasks +## Formati alternativi -- [x] [Descrizione](/descrizione.md) -- [x] [Glossario](/glossario.md) -- [x] [Schema scheletro](/schema-scheletro.drawio) -- [x] [Identificazione delle autoassociazioni](/autoassociazione.md) -- [x] [Identificazione delle chiavi esterne](/chiaviesterne.md) -- [ ] ...? -- [x] [Schema finale](/schema-finale.drawio) +La relazione è disponibile anche in [formato `.odt`](relazione.odt) e in [formato `.pdf`](relazione.pdf). -## Compiling +## Riproduzione del database -### Requirements - -- [Pandoc](https://pandoc.org/) -- [MiKTeX](https://miktex.org/) - -### Instructions - -To create PDF files from the Markdown sources in this project, you can run the Makefile with the `make` command, or compile them manually with the following command: +Su una macchina con PostgreSQL 10.12 o superiore installato, eseguire in un terminale / prompt il seguente comando: ```bash -pandoc -o filename.pdf filename.md +pg_restore --dbname="alexandria" --schema="public" --file="5-database.sql" ``` + +> La procedura per creare una copia del database è descritta in dettaglio nel file [`5-1-tecnologia-database.md`](5-1-tecnologia-database.md). diff --git a/chiaviprimarieesterne.md b/chiaviprimarieesterne.md deleted file mode 100644 index 8651656..0000000 --- a/chiaviprimarieesterne.md +++ /dev/null @@ -1,13 +0,0 @@ -# Identificazione delle chiavi primarie esterne - -In `alexandria`, ogni utente potrà pubblicare una recensione riguardante un qualsiasi elemento della sua libreria (libro, film, videogioco...), con un testo e una valutazione da 0 a 100. - -Le recensioni di ogni utente saranno visualizzate nella pagina del libro, film o videogioco che esse riguardano, e nella pagina del profilo dell'utente che le ha pubblicate. - -Si è pensato sarebbe stato appropriato permettere alle recensioni di essere associate agli elementi della libreria di ogni utente. - -![](img/chiaveprimariaesterna.png) - -Essendo la relazione `riguardante` tra `Elemento` e `Recensione` una relazione _opzionale_ 1 a 1, si è deciso di utilizzare come chiave dell'entità `Recensione` l'ID (chiave primaria) dell'`Elemento` che riguarda. - -Questa scelta rende semplici e veloci le interrogazioni per trovare recensioni create da uno specifico utente e recensioni riguardanti un dato libro, film o videogioco: in entrambi i casi, è richiesto l'uso di un solo `JOIN`. diff --git a/gerarchia.md b/gerarchia.md deleted file mode 100644 index c126d3c..0000000 --- a/gerarchia.md +++ /dev/null @@ -1,14 +0,0 @@ -# Aggiunta di gerarchie - - -Nel progetto `alexandria` sono state inserite due gerarchie: - -![](img/gerarchia1.png) - -Ogni utente, nel suo profilo, ha la possibilità di gestire e aggiornare una lista di elementi da lui posseduti: questi elementi possono essere libri, film o videogiochi. Siccome questi elementi hanno attributi e relazioni diverse, ma sono accomunati dall'essere posseduti dall'utente ed essere oggetto di recensioni, è sembrato opportuno rappresentarli come una gerarchia, in cui "Elemento" è l'entità padre, mentre le entità figlio sono rispettivamente "Elemento (libro)", "Elemento (film)", e "Elemento(gioco)". - -![](img/gerarchia2.png) - -La seconda gerarchia inserita riguarda invece le diverse edizioni di un libro: pur se relative allo stesso libro, le edizioni possono essere sia edizioni caracee (o ebook) sia edizioni audio. Le due categorie hanno attributi diversi: delle edizioni audio occorre sapere la durata in minuti, un'immagine rappresentativa e la voce narrante (che viene trattata come un'entità a parte), mentre nelle edizioni libro si vuole sapere il numero di pagine e la copertina; sono invece accomunate da tutte le altre relazioni, ad esempio l'essere relative ad uno stesso lbro. - -Si è deciso di mantenere le entità di entrambe le gerarchie. diff --git a/glossario.md b/glossario.md deleted file mode 100644 index 2c62b16..0000000 --- a/glossario.md +++ /dev/null @@ -1,51 +0,0 @@ -# Glossario - -## Utenti - -| Nome | Dati | Sinonimi | Collegamenti | Note | -|------|------|----------|--------------|------| -| Utente | username, hash della password, email, è amministratore, è bannato | user, admin, amministratore | possiede Elementi | | - -## Elementi - -| Nome | Dati | Sinonimi | Collegamenti | Note | -|------|------|----------|--------------|------| -| Elemento | stato, provenienza | | di una copia di un Libro / Film / Videogioco, posseduto da un Utente | | - -## Recensioni - -| Nome | Dati | Sinonimi | Collegamenti | Note | -|------|------|----------|--------------|------| -| Recensione | valutazione (0-100), commento, data, è nascosto | valutazione, commento, post | riguardante un Elemento | | - -## Libri - -| 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 | | -| 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 (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 | | -| Editore | nome | | pubblica delle Edizioni (libro, audio) | | -| Narratore | nome | voce narrante | narra delle Edizioni (audio) | | - -## Film - -| 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 | | -| 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 | -| Ruolo | nome | | di Cast | Il ruolo è un attributo! | -| Studio | nome | azienda, casa produttrice | che ha prodotto un Film | | -| Localizzazione | titolo alternativo, lingua | titolo | relativo a un Film | | - -## Giochi - -| 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 | | -| 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 | | -| Studio | nome | | che ha sviluppato Giochi, che ha portato Edizioni | | diff --git a/img/0-README/alexandria-opengraph.png b/img/0-README/alexandria-opengraph.png new file mode 100644 index 0000000..fffb677 Binary files /dev/null and b/img/0-README/alexandria-opengraph.png differ diff --git a/img/0-README/alexandria.png b/img/0-README/alexandria.png new file mode 100644 index 0000000..eea396b Binary files /dev/null and b/img/0-README/alexandria.png differ diff --git a/img/3-1-schema-scheletro/film.png b/img/3-1-schema-scheletro/film.png new file mode 100644 index 0000000..a2f5d41 Binary files /dev/null and b/img/3-1-schema-scheletro/film.png differ diff --git a/img/3-1-schema-scheletro/generale.png b/img/3-1-schema-scheletro/generale.png new file mode 100644 index 0000000..d4bd999 Binary files /dev/null and b/img/3-1-schema-scheletro/generale.png differ diff --git a/img/3-1-schema-scheletro/giochi.png b/img/3-1-schema-scheletro/giochi.png new file mode 100644 index 0000000..be2e7ab Binary files /dev/null and b/img/3-1-schema-scheletro/giochi.png differ diff --git a/img/3-1-schema-scheletro/libri.png b/img/3-1-schema-scheletro/libri.png new file mode 100644 index 0000000..62b8005 Binary files /dev/null and b/img/3-1-schema-scheletro/libri.png differ diff --git a/img/3-2-gerarchie/gerarchia-1.png b/img/3-2-gerarchie/gerarchia-1.png new file mode 100644 index 0000000..1d87b95 Binary files /dev/null and b/img/3-2-gerarchie/gerarchia-1.png differ diff --git a/img/3-2-gerarchie/gerarchia-2.png b/img/3-2-gerarchie/gerarchia-2.png new file mode 100644 index 0000000..452986a Binary files /dev/null and b/img/3-2-gerarchie/gerarchia-2.png differ diff --git a/img/autoassociazione.png b/img/3-3-autoassociazioni/autoassociazione.png similarity index 100% rename from img/autoassociazione.png rename to img/3-3-autoassociazioni/autoassociazione.png diff --git a/img/3-4-relazioni/autoassoc-film.png b/img/3-4-relazioni/autoassoc-film.png new file mode 100644 index 0000000..232a202 Binary files /dev/null and b/img/3-4-relazioni/autoassoc-film.png differ diff --git a/img/3-4-relazioni/autoassoc-giochi.png b/img/3-4-relazioni/autoassoc-giochi.png new file mode 100644 index 0000000..ad8bf6b Binary files /dev/null and b/img/3-4-relazioni/autoassoc-giochi.png differ diff --git a/img/3-4-relazioni/autoassoc-libri.png b/img/3-4-relazioni/autoassoc-libri.png new file mode 100644 index 0000000..ff95596 Binary files /dev/null and b/img/3-4-relazioni/autoassoc-libri.png differ diff --git a/img/3-4-relazioni/editore.png b/img/3-4-relazioni/editore.png new file mode 100644 index 0000000..7fd26a2 Binary files /dev/null and b/img/3-4-relazioni/editore.png differ diff --git a/img/3-4-relazioni/elemento.png b/img/3-4-relazioni/elemento.png new file mode 100644 index 0000000..a576942 Binary files /dev/null and b/img/3-4-relazioni/elemento.png differ diff --git a/img/3-4-relazioni/entita-debole.png b/img/3-4-relazioni/entita-debole.png new file mode 100644 index 0000000..b638c2b Binary files /dev/null and b/img/3-4-relazioni/entita-debole.png differ diff --git a/img/3-4-relazioni/film.png b/img/3-4-relazioni/film.png new file mode 100644 index 0000000..be23cff Binary files /dev/null and b/img/3-4-relazioni/film.png differ diff --git a/img/3-4-relazioni/generi-film.png b/img/3-4-relazioni/generi-film.png new file mode 100644 index 0000000..c5a044b Binary files /dev/null and b/img/3-4-relazioni/generi-film.png differ diff --git a/img/3-4-relazioni/generi-giochi.png b/img/3-4-relazioni/generi-giochi.png new file mode 100644 index 0000000..7f296c1 Binary files /dev/null and b/img/3-4-relazioni/generi-giochi.png differ diff --git a/img/3-4-relazioni/generi-libri.png b/img/3-4-relazioni/generi-libri.png new file mode 100644 index 0000000..c15dd43 Binary files /dev/null and b/img/3-4-relazioni/generi-libri.png differ diff --git a/img/3-4-relazioni/giochi-e-edizioni.png b/img/3-4-relazioni/giochi-e-edizioni.png new file mode 100644 index 0000000..9f0d09b Binary files /dev/null and b/img/3-4-relazioni/giochi-e-edizioni.png differ diff --git a/img/3-4-relazioni/giochi.png b/img/3-4-relazioni/giochi.png new file mode 100644 index 0000000..ed4ce87 Binary files /dev/null and b/img/3-4-relazioni/giochi.png differ diff --git a/img/3-4-relazioni/inno-1.png b/img/3-4-relazioni/inno-1.png new file mode 100644 index 0000000..7dabf90 Binary files /dev/null and b/img/3-4-relazioni/inno-1.png differ diff --git a/img/3-4-relazioni/inno-2.png b/img/3-4-relazioni/inno-2.png new file mode 100644 index 0000000..007fefb Binary files /dev/null and b/img/3-4-relazioni/inno-2.png differ diff --git a/img/3-4-relazioni/inno-3.png b/img/3-4-relazioni/inno-3.png new file mode 100644 index 0000000..6b9de4c Binary files /dev/null and b/img/3-4-relazioni/inno-3.png differ diff --git a/img/3-4-relazioni/inno-4.png b/img/3-4-relazioni/inno-4.png new file mode 100644 index 0000000..4b2fcdf Binary files /dev/null and b/img/3-4-relazioni/inno-4.png differ diff --git a/img/3-4-relazioni/legenda.png b/img/3-4-relazioni/legenda.png new file mode 100644 index 0000000..3b55bb6 Binary files /dev/null and b/img/3-4-relazioni/legenda.png differ diff --git a/img/3-4-relazioni/libri.png b/img/3-4-relazioni/libri.png new file mode 100644 index 0000000..47893fb Binary files /dev/null and b/img/3-4-relazioni/libri.png differ diff --git a/img/3-4-relazioni/recensioni.png b/img/3-4-relazioni/recensioni.png new file mode 100644 index 0000000..34e66f1 Binary files /dev/null and b/img/3-4-relazioni/recensioni.png differ diff --git a/img/3-4-relazioni/ternaria.png b/img/3-4-relazioni/ternaria.png new file mode 100644 index 0000000..b703b9c Binary files /dev/null and b/img/3-4-relazioni/ternaria.png differ diff --git a/img/3-4-relazioni/utente.png b/img/3-4-relazioni/utente.png new file mode 100644 index 0000000..fa31d57 Binary files /dev/null and b/img/3-4-relazioni/utente.png differ diff --git a/img/4-1-eliminazione-gerarchie/gerarchia-edizioni.png b/img/4-1-eliminazione-gerarchie/gerarchia-edizioni.png new file mode 100644 index 0000000..df2b271 Binary files /dev/null and b/img/4-1-eliminazione-gerarchie/gerarchia-edizioni.png differ diff --git a/img/4-1-eliminazione-gerarchie/gerarchia-elementi.png b/img/4-1-eliminazione-gerarchie/gerarchia-elementi.png new file mode 100644 index 0000000..7bee7d4 Binary files /dev/null and b/img/4-1-eliminazione-gerarchie/gerarchia-elementi.png differ diff --git a/img/4-2-eliminazione-chiavi-esterne/after-localizzazione.png b/img/4-2-eliminazione-chiavi-esterne/after-localizzazione.png new file mode 100644 index 0000000..1fcdfab Binary files /dev/null and b/img/4-2-eliminazione-chiavi-esterne/after-localizzazione.png differ diff --git a/img/4-2-eliminazione-chiavi-esterne/after-recensioni.png b/img/4-2-eliminazione-chiavi-esterne/after-recensioni.png new file mode 100644 index 0000000..79b3701 Binary files /dev/null and b/img/4-2-eliminazione-chiavi-esterne/after-recensioni.png differ diff --git a/img/4-2-eliminazione-chiavi-esterne/chiave-localizzazione.png b/img/4-2-eliminazione-chiavi-esterne/chiave-localizzazione.png new file mode 100644 index 0000000..d9c0d00 Binary files /dev/null and b/img/4-2-eliminazione-chiavi-esterne/chiave-localizzazione.png differ diff --git a/img/4-2-eliminazione-chiavi-esterne/chiave-recensioni.png b/img/4-2-eliminazione-chiavi-esterne/chiave-recensioni.png new file mode 100644 index 0000000..4bccb30 Binary files /dev/null and b/img/4-2-eliminazione-chiavi-esterne/chiave-recensioni.png differ diff --git a/img/4-4-dati-derivati/conteggio-elementi.png b/img/4-4-dati-derivati/conteggio-elementi.png new file mode 100644 index 0000000..2c9ee05 Binary files /dev/null and b/img/4-4-dati-derivati/conteggio-elementi.png differ diff --git a/img/Alexandria.png b/img/Alexandria.png deleted file mode 100644 index d9e95b0..0000000 Binary files a/img/Alexandria.png and /dev/null differ diff --git a/img/Gerarchia1.drawio b/img/Gerarchia1.drawio deleted file mode 100644 index 04eae02..0000000 --- a/img/Gerarchia1.drawio +++ /dev/null @@ -1 +0,0 @@ -UzV2zq1wL0osyPDNT0nNUTV2VTV2LsrPL4GwciucU3NyVI0MMlNUjV1UjYwMgFjVyA2HrCFY1qAgsSg1rwSLBiADYTaQg2Y1AA== \ No newline at end of file diff --git a/img/Gerarchia1.png b/img/Gerarchia1.png deleted file mode 100644 index 7ff1933..0000000 Binary files a/img/Gerarchia1.png and /dev/null differ diff --git a/img/Gerarchia2.drawio b/img/Gerarchia2.drawio deleted file mode 100644 index 8c1dda0..0000000 --- a/img/Gerarchia2.drawio +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/img/Gerarchia2.png b/img/Gerarchia2.png deleted file mode 100644 index e125bae..0000000 Binary files a/img/Gerarchia2.png and /dev/null differ diff --git a/img/chiaveprimariaesterna.png b/img/chiaveprimariaesterna.png deleted file mode 100644 index 63cd225..0000000 Binary files a/img/chiaveprimariaesterna.png and /dev/null differ diff --git a/make_odt.sh b/make_odt.sh new file mode 100644 index 0000000..debc840 --- /dev/null +++ b/make_odt.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cat 1-*.md 2-*.md 3-*.md 4-*.md 5-*.md 6-*.md | pandoc -o relazione.odt diff --git a/relazione.odt b/relazione.odt new file mode 100644 index 0000000..1d5f672 Binary files /dev/null and b/relazione.odt differ diff --git a/relazione.pdf b/relazione.pdf new file mode 100644 index 0000000..eabd06d Binary files /dev/null and b/relazione.pdf differ diff --git a/schema-logico.md b/schema-logico.md deleted file mode 100644 index 02942af..0000000 --- a/schema-logico.md +++ /dev/null @@ -1,165 +0,0 @@ -# Schema logico - -Legenda: -- **Grassetto**: Chiave primaria -- → (Freccia): Chiave esterna -- _Corsivo_: Attributo opzionale - - - -## Generale - -### Utente -- **Username** -- Password -- _Email_ -- Amministratore -- Bannato - -### Elemento -- **UUID Elemento** -- Username → Utente -- Stato -- Provenienza - -### Recensione -- **UUID Elemento** → Elemento -- Commento -- Valutazione -- Data - -## Libri - -### Elemento (libro) -- **UUID Elemento** → Elemento -- UUID Libro → Libro -- _Stato_ -- _Provenienza_ - -### Libro -- **UUID Libro** -- Titolo originale -- _Sinossi_ - -### Editore -- **Prefisso ISBN** -- Nome - -### Edizione -- **ISBN Editore** → Editore -- **ISBN Resto** -- UUID Libro → Libro -- Titolo edizione - -### Correlato a -- **UUID Libro 1** → Libro (UUID Libro) -- **UUID Libro 2** → Libro (UUID Libro) - -### Autore -- **UUID Autore** -- Nome - -### Scritto da -- **UUID Libro** → Libro -- **UUID Autore** → Autore - -## Film - -### Elemento (film) -- **UUID Elemento** → Elemento -- UUID Film → Film -- _Stato_ -- _Provenienza_ - -### Film -- **EIDR** -- Titolo -- _Sinossi_ -- _Durata_ -- _Locandina_ - -### Genere -- **UUID Genere** -- Nome - -### Appartiene a -- **EIDR** → Film -- **UUID Genere** → Genere - -### Localizzazione -- **Lingua** -- EIDR → Film -- Titolo localizzato - -### Studio -- **UUID Studio** -- Nome - -### Prodotto da -- **EIDR** → Film -- **UUID Studio** → Studio - -### Correlato a -- **UUID Film 1** → Film (UUID Film) -- **UUID Film 2** → Film (UUID Film) - -### Ruolo -- **UUID Ruolo** -- Nome - -### Cast -- **UUID Cast** -- Nome - -### Ha preso parte al film -- **EIDR** → Film -- **UUID Cast** → Cast -- **UUID Ruolo** → Ruolo - -## Giochi - -### Elemento (gioco) -- **UUID Elemento** → Elemento -- UUID Gioco → Gioco -- _Stato_ -- _Provenienza_ - -### Gioco -- **UUID Gioco** -- Nome -- _Descrizione_ - -### Edizione -- **UUID Edizione** -- UUID Gioco → Gioco -- _Titolo edizione_ -- Piattaforma -- _Box art_ - -### Correlato a -- **UUID Gioco 1** → Gioco (UUID Gioco) -- **UUID Gioco 2** → Gioco (UUID Gioco) - -### Genere -- **UUID Genere** -- Nome - -### Appartiene a -- **UUID Gioco** → Gioco -- **UUID Genere** → Genere - -### Studio -- **UUID Studio** -- Nome - -### Portato da -- **UUID Edizione** → Edizione -- **UUID Studio** → Studio - -### Sviluppato da -- **UUID Gioco** → Gioco -- **UUID Studio** → Studio - -### Pubblicato da -- **UUID Gioco** → Gioco -- **UUID Studio** → Studio \ No newline at end of file diff --git a/tabelle.md b/tabelle.md deleted file mode 100644 index 6c25d03..0000000 --- a/tabelle.md +++ /dev/null @@ -1,16 +0,0 @@ -# Tabelle - -## Tabella dei volumi - -| Concetto | Tipo | Volume dei dati | -|----------|------|-----------------| - -## Tabella delle operazioni - -| Operazione | Tipo | Frequenza | -|------------|------|-----------| - -## Tabella degli accessi - -| Concetto | Accessi | Tipo | -|----------|---------|------|