summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2021-03-11 20:59:00 +0100
committerSanto Cariotti <santo@dcariotti.me>2021-03-11 20:59:00 +0100
commitfe008449c632dd669fffc23d64fb19d102ede65c (patch)
tree60df09b7f81d595f7f09c88ef7b54c2fb3c251f8
parent0317b73dd2df27287eb5dee7f3cac4195191a5f4 (diff)
chapter4: add final relation scheme
-rw-r--r--chapters/relation.tex37
-rw-r--r--data/relation_final.drawio1
-rw-r--r--data/relation_final.pngbin0 -> 32060 bytes
-rw-r--r--gico.tex1
4 files changed, 36 insertions, 3 deletions
diff --git a/chapters/relation.tex b/chapters/relation.tex
index 84d67cd..20757b9 100644
--- a/chapters/relation.tex
+++ b/chapters/relation.tex
@@ -10,6 +10,39 @@ Come si può ben vedere sono state fatte delle modifiche:
\begin{itemize}
\item Repository: aggiunte le date di creazione e modifica;
\item Branch: ha un suo id come PK, in modo da accedervi più facilmente tramite backend. Questo perché i branch permettono anche lo slash nel nome, cosa che andrebbe a creare errore se passato nell'endpoint;
-\item Commit: ha un campo \verb|tree| che si riferisce al parent: può ovviamente essere null. Dato che il commit può essere scritto da massimo 2 persone, ho preferito aggiungere i campi \verb|author_id| e \verb|commiter_id|;
-\item Person: ha un campo \verb|hash_md5| che calcola l'MD5\footnote{https://en.wikipedia.org/wiki/MD5} dell'email una volta sola: usato per il gravatar;
+\item Commit: ha un campo \verb|tree| che si riferisce al parent: può ovviamente essere null. Dato che il commit può essere scritto da massimo 2 persone, ho preferito aggiungere i campi \verb|author_id| e \verb|committer_id|;
+\item Person: ha un campo \verb|hash_md5| che calcola l'MD5\footnote{https://en.wikipedia.org/wiki/MD5} dell'email una volta sola: usato per il Gravatar\footnote{https://en.gravatar.com/};
\end{itemize}
+
+\section{Considerazioni}
+Il numero di elementi presenti nella tabella \verb|Commit| saranno molti: molti di più rispetto a quelli presenti in \verb|Person|. Questo perché si presuppone che aggiunta una \verb|Repository| verranno aggiunti i commit di un determinato \verb|Branch| che, a meno di repositories particolari, non avranno un numero di contributors molto maggiore rispetto a quello dei commits.
+\paragraph{Esempio} Il progetto Rust\footnote{https://github.com/rust-lang/rust} ha | mentre scrivo questo documento | \textbf{139,832} commits e \textbf{3,203} contributors.\\\\
+\noindent
+Se seguiamo il progetto citato sopra e lanciamo una query d'esempio:
+\paragraph{Query 1} Selezionare hash, testo, data, nome ed email di autore e committente.\\\\\noindent
+Per eseguire la \textit{Query 1} dovremmo realizzare 2 join a \verb|Person| per ogni record. Se togliessimo le due foreign key avremmo un risparmio considerevole: non faccio il calcolo perché è facile da vedere.
+\paragraph{Insert 1} Inserire un nuovo commit.\\\\\noindent
+Per eseguire l'operazione \textit{Insert 1} bisognerebbe cercare su \verb|Person| se esiste già un elemento associato a quell'email e quel nome: se esiste lo legge, altrimenti lo crea. Cercare su \verb|Person| se esiste già un elemento associato a quell'email e quel nome: se esiste lo legge, altrimenti lo crea. Infine scrivere all'interno di \verb|Commit|. La foreign key \verb|tree| è irrilevante perché fa riferimento ad un hash di un commit già esistente, quindi non c'è bisogno di controllo.
+
+Se volessimo sapere a quale repository si riferisce un commit bisognerebbe cercare il \verb|Branch| che ha un \verb|head| che è uguale all'\verb|hash| e in caso negativo procedere ricorsivamente per \verb|tree|. Se siamo fortunati becchiamo il \verb|Commit| che è \verb|head| del \verb|Branch| e ce ne usciamo con 1 giunzione, altrimenti il costo in SQL sarebbe quello di una chiamata ricorsiva tale che, partendo da un commit \verb|c1| vada a cercare il commit appartenente al \verb|tree| e così via. Ora, eseguire una query del genere 1 volta per apertura della pagina del commit\footnote{Ad esempio con endpoint \textit{/api/commit/2cde51fbd0f310c8a2c5f977e665c0ac3945b46d/}} non è un problema; il problema è quando vogliamo vedere la repository associata ad \underline{ognuno} dei commit. Certo, si potrebbe risolvere lato codice, ma questo è un progetto per il corso di Basi di Dati, quindi dobbiamo risolverlo tramite chiamata SQL.
+
+\section{Schema logico finale}
+In Figura 4.2 vi è una versione revisionata del modello Relazionale.
+
+Possiamo notare svariate modifiche apportate:
+\begin{itemize}
+\item I \verb|Commit| non puntano direttamente a 2 record di \verb|Person|: le foreign key fanno riferimento solo alle emails. Questo perché Git considera diverse due persone con stessa email ma nome diverso. A noi interessa sapere l'hash MD5 per avere il Gravatar associato all'email. Se poi cambia nome, l'immagine dovrà essere comunque sempre la stessa. Quando non ci interessa avere l'avatar, inoltre, non dobbiamo fare giunzioni alla nuova tabella \verb|Email|.
+
+Se ci serve avere l'hash potremmo prima fare una \verb|SELECT| delle email associate all'hash e utilizzare un hash per associare, lato client, l'hash alla singola email. Quindi non fare giunzioni. Ma questo lato client, quindi la tabella resta per il funzionamento tramite SQL.
+
+\item Al \verb|Commit| è associata la url della \verb|Repository|. Dato che la PK della \verb|Repository| è l'\verb|id|, il campo \verb|url| è diventanto \verb|UNIQUE|. Cosa che a noi sta più che bene, dato che non vogliamo \verb|Repository| duplicate.
+
+\item Anche il campo \verb|hash_md5| è \verb|UNIQUE|. In realtà è una cosa extra, dato che, se dovessimo riscontrare un'errore del genere le alternative sono due: o in realtà l'email esiste già nel database oppure abbiamo trovato un'altra parola che ha come risultato dell'hash MD5, una già esistente.
+\end{itemize}
+
+\begin{figure}[htp]
+\centering
+\includegraphics[scale=0.7]{data/relation_final.png}
+\caption{Modello relazionale finale}
+\label{}
+\end{figure} \ No newline at end of file
diff --git a/data/relation_final.drawio b/data/relation_final.drawio
new file mode 100644
index 0000000..8447be2
--- /dev/null
+++ b/data/relation_final.drawio
@@ -0,0 +1 @@
+<mxfile host="app.diagrams.net" modified="2021-03-11T19:31:12.108Z" agent="5.0 (X11)" etag="exXV94_6guYA5iLTdZ6t" version="14.4.7" type="device"><diagram name="Page-1" id="2ca16b54-16f6-2749-3443-fa8db7711227">7VrbcuI4EP0aHkPZlm3MYyAhW5VkJzsz2WT2hRJYGO3YFitEgPn6kWz5JtsEDCSwBakKVqsldbfVlyPRAv1gdUfhbPpIXOS3DM1dtcBNyzAcHfD/grCOCaZuxgSPYjcm6RnhG/6FJFGT1AV20bzAyAjxGZ4ViWMShmjMCjRIKVkW2SbEL646gx4qEb6NoV+mvmCXTSVV17Ss4w+Evalc2rFkxwiOf3qULEK5XssAk+gTdwcwmUvyz6fQJcscCdy2QJ8SwuKnYNVHvjBtYrZ43KCmN5WbopBtM8BALjDQRDNgZ2JyPa7kDG/QX6BEBdvnc/Vc/CYEZmtpJPu/hZCyNyKrqzn+hUOvBa6FCQh1Eb3iZN7g/fz/Mrah6I1MaKU9eXuJbm4vZIq/lGMGXTed25itsoX5kye+v6IZmWNG6DoRlesbSRv3J1QGR1z0KhXq5ZuQkAntkOxFQX59bcytOZ/BcSRgbkKtxJWqkeMyyrqkso6Iuy4RaYniJpSn+5zyGbnMiN2ENipNVzlUEMsLbxDl+a8dV8goC+ofW7rGso0pggyTcOhChk5WysVMiOcWhPx0kXwCeUgY4tkhzCaIVd4h6LGHJ3Sj4OzGG6IM8xh/7WMv5CRGZpwNypaPJmIU4VwTPwrJE8xDJehNWcC/bnT+GAUqJEKnCA9p7BaNMQnwWD77cIT8XhrZ+sQnlHeFJERiGKPkZ5pWxLQiyAxggH2RLf9G1IUhlGSZGnWjHNiTSM21QqscSQb6O0QCxERM1GSvmSSdJCknSWuZS3GmpE1z2U1PBkKZVr107iy18AeZXbbMNOb5ZZrbAGI/t98uSaaGEeUNdYJ5Zgrn02HgWpd49InxSLeVeNSpiEd6RTyyDxCOzB6+H44Wd9PlP7Tz8sXt/bgZXoHSO0IuxwWySSibEo+E0L/NqMo7yHgeiHidkT3/RYytpeXggpHiS0QrzF7lcPH8Qzy3eXiImzerXN/NOmmEXN/XfEMO48hLErKBUasw8glRzE2GaLJ1GKTsWgAnTrj9mmwMThxEm06OdDOWAIbul4iNk3NMtftiThZ0jGpygRXzCGtv3DkU+bwGeyuitKptIIc+EczFyHacXtxxhtVpm53iLFxpDzE5MNtPXHO4zrHNBMN8w1Jat7hUp1MEYgq/o+3FbhXY+UMsb61sbRt0c5/iZE6nDbTcR7FQ/CZLFoo8Ln1XzWoC6/xqgj4JAswuRcF2SfewFcCAL639+fzw0LgQYBSdLpbjeZSdrHAfgYIH943F43l2SujwQwrRfYUMYXDKphxHEY4XCyduzUzOEzcoTQ8shwc68LpgkKYYRK0IQQUGcarORLrHAiHWZ4CQMgD4Th5huG4dGgYcvcRXQKWlKe+ppr5/FyuAjjJRTRm8K1DodCuXqRNLYU/Uq9WixhyVQKFBBV+5gzufCqPbmma08lDa0ZL+GizNG+8D4v38IcXrequA163WZrRe60fxNq6BUebH+JoBipvRBFZjX2sDO4c49aJPAK2d3Cgf2PusrrrSRkEVdvsd7wOWthf/h3irc36Yu0dhOM5jyQvmrmE8/m1v4yr4fIr04xtxsPUZCoLu7ktf4EFDeGBa6jnrtlematl5MHjQ/T/Ag6RY03mxBgrFmu3sXKttizWKdxD1ufDgdZKlXnQ5DTFJaSL1Yv5AVZENFOyjOxvlUvkTBbfWw/mAOifBc2fuOSmQSHBOBiZ0y34HTlRe/m3vPxtBh3UU3wHqAY1tNvMdNZQDANoKXDmQ95jqyQEAmyUrqfgOStjMv7f3eC8T7+FtOTIeX58nRv+7NiTp70LP3Hlyaad4RtA1ujvnnewOnk9nFV0ROHpzVyz5XcPr9I3ueqQjga4S2dVTs23dFRham6e3uhMBzTmK6wL1J3La5mt4oCayXfm79j6uy5vZT8Vj9uzn+OD2Nw==</diagram></mxfile> \ No newline at end of file
diff --git a/data/relation_final.png b/data/relation_final.png
new file mode 100644
index 0000000..87e80e4
--- /dev/null
+++ b/data/relation_final.png
Binary files differ
diff --git a/gico.tex b/gico.tex
index 76b0798..553f6d1 100644
--- a/gico.tex
+++ b/gico.tex
@@ -27,5 +27,4 @@
\chapter{Schema logico}
\input{chapters/relation}
-
\end{document}