From 8cf655dcc26f6538ef93b9422d86ce209a6162dc Mon Sep 17 00:00:00 2001 From: Apostolof Date: Mon, 26 Nov 2018 12:02:52 +0200 Subject: [PATCH] Init --- .gitignore | 260 ++++++++++++++++ .../1.introduction/1.0.introduction.tex | 7 + .../1.introduction/1.1.purpose.tex | 7 + .../1.introduction/1.2.description.tex | 9 + .../1.introduction/1.3.requirements.tex | 25 ++ .../2.0.user_categories_and_requirements.tex | 14 + .../2.1.customer.tex | 10 + .../2.2.moderator.tex | 9 + .../2.3.owner.tex | 14 + .../3.0.entity_relationship_model.tex | 8 + .../3.1.general_description.tex | 32 ++ .../3.2.entities_definition.tex | 109 +++++++ .../3.3.relationships_definition.tex | 202 +++++++++++++ .../3.entity_relationship_model/3.4.ERDs.tex | 12 + .../4.0.relational_model.tex | 6 + .../4.1.attribute_domains.tex | 24 ++ .../4.relational_model/4.2.relations.tex | 189 ++++++++++++ .../4.3.relational_diagram.tex | 14 + .../4.relational_model/4.4.views.tex | 19 ++ Database design/5.examples/5.0.examples.tex | 4 + .../5.examples/5.1.table_examples.tex | 284 ++++++++++++++++++ .../5.examples/5.2.query_examples.tex | 92 ++++++ Database design/TOC.tex | 1 + Database design/cites.bib | 20 ++ .../custom_commands_and_enviroments.tex | 46 +++ Database design/front_page.tex | 1 + Database design/report.tex | 63 ++++ .../Copy of Flavors without borders ERD.svg | 2 + ...ors without borders relational diagram.svg | 2 + Database design/res/diagrams/ERD.pdf_tex | 263 ++++++++++++++++ .../res/diagrams/Relational_Diagram.pdf_tex | 209 +++++++++++++ Database design/res/fwbLOGO.png | Bin 0 -> 18037 bytes 32 files changed, 1957 insertions(+) create mode 100644 .gitignore create mode 100644 Database design/1.introduction/1.0.introduction.tex create mode 100644 Database design/1.introduction/1.1.purpose.tex create mode 100644 Database design/1.introduction/1.2.description.tex create mode 100644 Database design/1.introduction/1.3.requirements.tex create mode 100644 Database design/2.user_categories_and_requirements/2.0.user_categories_and_requirements.tex create mode 100644 Database design/2.user_categories_and_requirements/2.1.customer.tex create mode 100644 Database design/2.user_categories_and_requirements/2.2.moderator.tex create mode 100644 Database design/2.user_categories_and_requirements/2.3.owner.tex create mode 100644 Database design/3.entity_relationship_model/3.0.entity_relationship_model.tex create mode 100644 Database design/3.entity_relationship_model/3.1.general_description.tex create mode 100644 Database design/3.entity_relationship_model/3.2.entities_definition.tex create mode 100644 Database design/3.entity_relationship_model/3.3.relationships_definition.tex create mode 100644 Database design/3.entity_relationship_model/3.4.ERDs.tex create mode 100644 Database design/4.relational_model/4.0.relational_model.tex create mode 100644 Database design/4.relational_model/4.1.attribute_domains.tex create mode 100644 Database design/4.relational_model/4.2.relations.tex create mode 100644 Database design/4.relational_model/4.3.relational_diagram.tex create mode 100644 Database design/4.relational_model/4.4.views.tex create mode 100644 Database design/5.examples/5.0.examples.tex create mode 100644 Database design/5.examples/5.1.table_examples.tex create mode 100644 Database design/5.examples/5.2.query_examples.tex create mode 100644 Database design/TOC.tex create mode 100644 Database design/cites.bib create mode 100644 Database design/custom_commands_and_enviroments.tex create mode 100644 Database design/front_page.tex create mode 100644 Database design/report.tex create mode 100644 Database design/res/diagrams/Copy of Flavors without borders ERD.svg create mode 100644 Database design/res/diagrams/Copy of Flavors without borders relational diagram.svg create mode 100644 Database design/res/diagrams/ERD.pdf_tex create mode 100644 Database design/res/diagrams/Relational_Diagram.pdf_tex create mode 100644 Database design/res/fwbLOGO.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f9a408c --- /dev/null +++ b/.gitignore @@ -0,0 +1,260 @@ +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Comment the next line if you want to keep your tikz graphics files +*.tikz +*-tikzDictionary + +# listings +*.lol + +# makeidx +*.idx +*.ilg +*.ind +*.ist + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices +*.xyc + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# KBibTeX +*~[0-9]* + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta +*.pdf diff --git a/Database design/1.introduction/1.0.introduction.tex b/Database design/1.introduction/1.0.introduction.tex new file mode 100644 index 0000000..e71ab09 --- /dev/null +++ b/Database design/1.introduction/1.0.introduction.tex @@ -0,0 +1,7 @@ +\chapter{Εισαγωγή} + +Η παρούσα εργασία εκπονήθηκε στα πλαίσια του μαθήματος "Βάσεις Δεδομένων" του ενάτου (9\textsuperscript{ου}) εξαμήνου του τμήματος Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Αριστοτέλειου Πανεπιστημίου Θεσσαλονίκης. Ζητούμενο του πρώτου παραδοτέου της εργασίας είναι η εύρεση και επιλογή ενός πρωτότυπου θέματος, η περιγραφή και σχεδίαση μίας βάσης δεδομένων οντοτήτων-συσχετίσεων καθώς και η μετατροπή της βάσης σε σχεσιακό μοντέλο. Σε επόμενα παραδοτέα θα υλοποιηθούν η βάση και ένα σύστημα διεπαφής χρήστη (front end/UI). + +\input{1.introduction/1.1.purpose.tex} +\input{1.introduction/1.2.description.tex} +\input{1.introduction/1.3.requirements.tex} \ No newline at end of file diff --git a/Database design/1.introduction/1.1.purpose.tex b/Database design/1.introduction/1.1.purpose.tex new file mode 100644 index 0000000..f53cafa --- /dev/null +++ b/Database design/1.introduction/1.1.purpose.tex @@ -0,0 +1,7 @@ +\section{Σκοπός Εφαρμογής} + +Έναυσμα για την επιλογή του θέματος αποτελεί ένα κοινό πρόβλημα που αντιμετωπίζουν άτομα που επισκέπτονται πόλεις του εξωτερικού και πιο συγκεκριμένα, περιοχές όπου η τοπική διάλεκτος δεν γνωστή από τα άτομα αυτά. Πολλές φορές, η επιλογή ενός γεύματος ή ποτού από το μενού ενός καταστήματος παρουσιάζει ιδιαίτερες δυσκολίες. Ακόμα και όταν ο πελάτης μιλά Αγγλικά, σε πολλά εστιατόρια τα μενού δε παρέχονται παρά μόνο στη μητρική γλώσσα της εκάστοτε χώρας. Επίσης, οι υπάλληλοι των καταστημάτων συχνά δεν γνωρίζουν επαρκώς την Αγγλική γλώσσα, έτσι οι συνεννοήσεις με στόχο την επεξήγηση των διάφορων επιλογών που προσφέρονται είναι δύσκολες, χρονοβόρες και ενίοτε άκαρπες. + +Τελικά, αρκετά συχνά οι πελάτες καταλήγουν απογοητευμένοι από την επιλογή τους. Το παραπάνω πρόβλημα είναι σημαντικότερο όταν πρόκειται για άτομα που ακολουθούν συγκεκριμένες δίαιτες, όπως διαβητικοί, αλλεργικοί, χορτοφάγοι ή κάποια άλλη θρησκευτική δίαιτα. Σε αυτές τις περιπτώσεις και ειδικά σε όσες αφορούν σε θέματα υγείας, είναι ιδιαίτερα σημαντικό τα άτομα να γνωρίζουν τα συστατικά των πιάτων ή ποτών που τους ενδιαφέρουν πριν προχωρήσουν στην παραγγελία τους. + +Οι υπάρχουσες λύσεις βασίζονται σε υπηρεσίες γενικότερου τουριστικού ενδιαφέροντος όπως εφαρμογές τύπου TripAdvisor ή τα δεδομένα που συλλέγει η Google, κάποιες από τις οποίες παρέχουν περιορισμένες πληροφορίες (όπως η καταλληλότητα των εστιατορίων για χορτοφάγους), που όμως δεν δίνουν μία επαρκή λύση στο πρόβλημα. \ No newline at end of file diff --git a/Database design/1.introduction/1.2.description.tex b/Database design/1.introduction/1.2.description.tex new file mode 100644 index 0000000..287a94c --- /dev/null +++ b/Database design/1.introduction/1.2.description.tex @@ -0,0 +1,9 @@ +\section{Περιγραφή Εφαρμογής} + +Η λύση, που προτείνεται εδώ, είναι η σχεδίαση και δημιουργία μίας εφαρμογής, η οποία προέρχεται από μία βάση δεδομένων που θα αποθηκεύει τα πιάτα και ποτά που προσφέρει κάθε κατάστημα ξεχωριστά, καθώς και τα συστατικά τους. + +Οι απλοί χρήστες (πελάτες) θα έχουν πρόσβαση σε μία μεγάλη βάση δεδομένων, ώστε να ενημερώνονται για τη σύσταση του καθενός από τα πιάτα και ποτά πριν κάνουν την επιλογή τους. Ακόμα, θα δίνεται η δυνατότητα φιλτραρίσματος των επιλογών και ο αποκλεισμός όσων είναι ακατάλληλα για τη δίαιτα που ακολουθεί ο χρήστης. Θα μπορούν να προτείνουν τη προσθήκη νέων καταστημάτων. Οι προτάσεις αυτές, αφού γίνουν αποδεκτές από κάποιον διαχειριστή, θα γίνονται διαθέσιμες στους υπόλοιπους χρήστες. Τέλος, έχουν πρόσβαση στο σύνολο των κριτικών για τα πιάτα ή ποτά που προσφέρει κάθε κατάστημα. + +Μία άλλη κατηγορία χρηστών είναι οι ιδιοκτήτες των καταστημάτων. Η εφαρμογή θα δίνει σε αυτούς την ευκαιρία να επιδείξουν τη ποικιλία των πιάτων που προσφέρουν και των υλικών που χρησιμοποιούν, καθώς επίσης την γκάμα από δίαιτες που υποστηρίζει το μενού τους. Ακόμα, θα τους δίνεται η ευκαιρία να διαβάσουν κριτικές για κάθε πιάτο ή ποτό ξεχωριστά με σκοπό τη βελτίωσή τους. + +Η παραπάνω λύση παρέχει ορισμένα εμφανή προτερήματα σε σχέση με προηγούμενες προσπάθειες. Η βάση θα παρέχει περισσότερες και πιο αναλυτικές πληροφορίες για κάθε πιάτο και ποτό ξεχωριστά, αλλά και για την συγκεκριμένη υλοποίησή του από το εκάστοτε κατάστημα. Αυτό δίνει μία καλύτερη εικόνα των επιλογών στον χρήστη. Ταυτόχρονα, κάθε χρήστης θα μπορεί να αποθηκεύσει πληροφορίες σχετικές με τη δίαιτα που ακολουθεί, ώστε να γίνεται αυτόματα το φιλτράρισμα των επιλογών όπως περιγράφηκε παραπάνω. \ No newline at end of file diff --git a/Database design/1.introduction/1.3.requirements.tex b/Database design/1.introduction/1.3.requirements.tex new file mode 100644 index 0000000..cbbb324 --- /dev/null +++ b/Database design/1.introduction/1.3.requirements.tex @@ -0,0 +1,25 @@ +\section{Απαιτήσεις Εφαρμογής σε Δεδομένα} + +H βάση που σχεδιάζουμε στοχεύει στην αποθήκευση δεδομένων, με σκοπό την παροχή υπηρεσιών υψηλής ποιότητας στους χρήστες. Παρακάτω παρουσιάζονται κάποιες απαιτήσεις σε όγκο δεδομένων σχετικά με τη βάση. + +\begin{enumerate}[wide=0pt, listparindent=1.25em, parsep=0pt] + \item Αριθμός εστιατρίων, καφέ, μπαρ και γενικότερα καταστημάτων εστίασης, που υπάρχουν περίπου στη Θεσσαλονίκη + + \vspace{1.2em} + Πραγματοποιώντας μία έρευνα online~\cite{numberOfRestaurants}, βρήκαμε ότι σε πόλεις με αριθμό κατοίκων περίπου το μισό της Θεσσαλονίκης, ο αριθμός καταστημάτων ανέρχεται στα 400, ενώ σε πόλεις όπως το Τόκιο αριθμούμε περί τα 150.000 καταστήματα. Λαμβάνοντας υπόψιν τα δεδομένα αυτά, εκτιμούμε ότι η Θεσσαλονίκη είναι αρκετά λογικό να έχει περίπου 15.000 χιλιάδες καταστήματα, τα οποία προφέρουν φαγητά ή/και ποτά. + \vspace{1.2em} + \item Αριθμός αντικειμένων που έχει περίπου το μέσο μενού + + \vspace{1.2em} + Ύστερα από μία μικρή έρευνα σε μενού καταστημάτων της Θεσσαλονίκης~\cite{numberOfMenuItems}, υποθέτουμε ότι ο μέσος αριθμός φαγητών και ποτών που προσφέρει ένα κατάστημα είναι 30 αντικείμενα. + \vspace{1.2em} + \item Αριθμός συστατικών που υπάρχουν περίπου σε κάθε πιάτο και κάθε ποτό + + \vspace{1.2em} + Υποθέτουμε ότι ένα μέσο πιάτο έχει περίπου 7-8 συστατικά, ενώ κάθε ποτό έχει 2-4 συστατικά. + \vspace{1.2em} + \item Ποσοστό επί του συνόλου που είναι λογικό να χρησιμοποιεί μια τέτοια εφαρμογή + + \vspace{1.2em} + Για να προσδιορίσουμε αυτό το ποσοστό, υποθέτουμε ότι η εφαρμογή μας έχει προωθηθεί και έχει αποκτήσει υπόσταση ως ευρέως χρησιμοποιούμενη. Έτσι, ένα ποσοστό με εύρος 5-10\% είναι λογικό να χρησιμοποιεί την εφαρμογή μας, όταν σχεδιάζει το ταξίδι του στο εξωτερικό. +\end{enumerate} \ No newline at end of file diff --git a/Database design/2.user_categories_and_requirements/2.0.user_categories_and_requirements.tex b/Database design/2.user_categories_and_requirements/2.0.user_categories_and_requirements.tex new file mode 100644 index 0000000..705a26f --- /dev/null +++ b/Database design/2.user_categories_and_requirements/2.0.user_categories_and_requirements.tex @@ -0,0 +1,14 @@ +\chapter{Κατηγορίες χρηστών και απαιτήσεις τους} + +Οι κατηγορίες χρηστών είναι οι εξής: +\begin{enumerate} + \item Πελάτες + \item Διαχειριστές + \item Ιδιοκτήτες των καταστημάτων +\end{enumerate} + +Τα δικαιώματα επί της βάσης για την κάθε κατηγορία αναλύονται παρακάτω. + +\input{2.user_categories_and_requirements/2.1.customer.tex} +\input{2.user_categories_and_requirements/2.2.moderator.tex} +\input{2.user_categories_and_requirements/2.3.owner.tex} \ No newline at end of file diff --git a/Database design/2.user_categories_and_requirements/2.1.customer.tex b/Database design/2.user_categories_and_requirements/2.1.customer.tex new file mode 100644 index 0000000..4d7f5a4 --- /dev/null +++ b/Database design/2.user_categories_and_requirements/2.1.customer.tex @@ -0,0 +1,10 @@ +\section{Πελάτες} + +Οι πελάτες είναι η βασική κατηγορία χρηστών της εφαρμογής. Τα δικαιώματά τους περιλαμβάνουν: +\begin{itemize} + \item Πρόσβαση στα μενού των καταστημάτων, τα πιάτα και ποτά, τα συστατικά και τις κριτικές αυτών + \item Δημιουργία νέων κριτικών + \item Πρόταση προσθήκης νέου καταστήματος, πιάτου, ποτού και δίαιτας στη βάση + \item Προσθήκη νέων συστατικών στη βάση + \item Διαγραφή και τροποποίηση των σχολίων και κριτικών που έχουν κάνει οι ίδιοι +\end{itemize} \ No newline at end of file diff --git a/Database design/2.user_categories_and_requirements/2.2.moderator.tex b/Database design/2.user_categories_and_requirements/2.2.moderator.tex new file mode 100644 index 0000000..1378a0d --- /dev/null +++ b/Database design/2.user_categories_and_requirements/2.2.moderator.tex @@ -0,0 +1,9 @@ +\section{Διαχειριστές} + +Οι διαχειριστές είναι ιδιαίτερα ενεργοί χρήστες που παίρνουν επιπλέον δικαιώματα μετά από συνεννόηση με τον sysadmin της βάσης. Έχουν την ευθύνη της διασφάλισης της εγκυρότητας των πληροφοριών, της αποδοχής των προτάσεων που κάνουν οι χρήστες και του συντονισμού του διαλόγου στα σχόλια. Τα δικαιώματά τους, επιπλέον αυτών των απλών χρηστών, περιλαμβάνουν: +\begin{itemize} + \item Διαγραφή απρεπών, υβριστικών κριτικών οποιουδήποτε χρήστη + \item Αποδοχή ή απόρριψη προτάσεων των χρηστών + \item Αποκλεισμός (ban) χρηστών + \item Προσθήκη των εστιατορίων που δεν υπάρχουν ήδη στη βάση και σύνδεσή τους με τους ιδιοκτήτες, ύστερα από συνεννόηση με αυτούς +\end{itemize} \ No newline at end of file diff --git a/Database design/2.user_categories_and_requirements/2.3.owner.tex b/Database design/2.user_categories_and_requirements/2.3.owner.tex new file mode 100644 index 0000000..13b6288 --- /dev/null +++ b/Database design/2.user_categories_and_requirements/2.3.owner.tex @@ -0,0 +1,14 @@ +\section{Ιδιοκτήτες/Υπάλληλοι των καταστημάτων} + +Οι ιδιοκτήτες των καταστημάτων είναι μια ειδική κατηγορία χρηστών. Εφόσον κάποιος χρήστης ταυτοποιηθεί και αναγνωριστεί ως ιδιοκτήτης, τα δικαιώματά του διαμορφώνονται ως εξής: +\begin{itemize} + \item Πρόσβαση στα καταστήματα, τα πιάτα και ποτά, τα συστατικά και τις κριτικές + \item Απευθείας προσθήκη νέου πιάτου, ποτού και λίστας συστατικών για το κατάστημα που αντιπροσωπεύει, χωρίς αναμονή αποδοχής από διαχειριστή +\end{itemize} + +Τονίζεται εδώ ότι η κατηγορία αυτή στερείται των εξής δικαιωμάτων: +\begin{itemize} + \item Δημιουργία νέων κριτικών για το κατάστημα το οποίο αντιπροσωπεύουν + \item Πρόταση προσθήκης νέου καταστήματος + \item Πρόταση λίστας συστατικών πιάτου (εκτός των καταστημάτων, που αντιπροσωπεύουν) +\end{itemize} \ No newline at end of file diff --git a/Database design/3.entity_relationship_model/3.0.entity_relationship_model.tex b/Database design/3.entity_relationship_model/3.0.entity_relationship_model.tex new file mode 100644 index 0000000..ee76181 --- /dev/null +++ b/Database design/3.entity_relationship_model/3.0.entity_relationship_model.tex @@ -0,0 +1,8 @@ +\chapter{Μοντέλο Οντοτήτων/Συσχετίσεων} + +Από τη γενική περιγραφή του προβλήματος και της λύσης εξάγονται οι οντότητες και οι συσχετίσεις της βάσης δεδομένων. Για τα διάφορα διλήμματα κατά τη σχεδίαση γίνονται παραδοχές οι οποίες επισημαίνονται στην κάθε ενότητα. Ο έλεγχος δικαιωμάτων για κάθε ενέργεια γίνεται με βάση το ρόλο σε ένα σύστημα RBAC (Role-Based Access Control). Για την υλοποίηση του συστήματος αυτού δημιουργούνται οντότητες που περιέχουν τους ρόλους και τα δικαιώματα. + +\input{3.entity_relationship_model/3.1.general_description.tex} +\input{3.entity_relationship_model/3.2.entities_definition.tex} +\input{3.entity_relationship_model/3.3.relationships_definition.tex} +\input{3.entity_relationship_model/3.4.ERDs.tex} \ No newline at end of file diff --git a/Database design/3.entity_relationship_model/3.1.general_description.tex b/Database design/3.entity_relationship_model/3.1.general_description.tex new file mode 100644 index 0000000..2287d3d --- /dev/null +++ b/Database design/3.entity_relationship_model/3.1.general_description.tex @@ -0,0 +1,32 @@ +\section{Γενική Περιγραφή} + +Οι οντότητες παρουσιάζονται στην παρακάτω λίστα: + +\begin{itemize} + \item Restaurant + \item Food + \item Drink + \item Ingredient + \item User + \item Diet + \item Role + \item Permission +\end{itemize} + +Οι συσχετίσεις παρουσιάζονται στην παρακάτω λίστα: + +\begin{itemize} + \item Restaurant offers Food + \item Restaurant offers Drink + \item Food has Ingredient + \item Drink has Ingredient + \item User prohibits Ingredient + \item User follows Diet + \item User rates Food + \item User rates Drink + \item User rates Restaurant + \item User owns Restaurant + \item Diet prohibits Ingredient + \item User has role + \item Role has permission +\end{itemize} diff --git a/Database design/3.entity_relationship_model/3.2.entities_definition.tex b/Database design/3.entity_relationship_model/3.2.entities_definition.tex new file mode 100644 index 0000000..538cda1 --- /dev/null +++ b/Database design/3.entity_relationship_model/3.2.entities_definition.tex @@ -0,0 +1,109 @@ +\section{Καθορισμός Οντοτήτων} + +\subsection{Restaurant} + +Για κάθε κατάστημα αποθηκεύονται ένα μοναδικό κλειδί που είναι ο αύξων αριθμός του, η ονομασία, το είδος του, η τοποθεσία, το ωράριο λειτουργίας, το rating, ο αριθμός των rating που έχουν γίνει, ένας δείκτης που διαχωρίζει τα καταστήματα που έχουν προταθεί από αυτά που έχουν γίνει αποδεκτά από κάποιον διαχειριστή. Η τοποθεσία θα αποθηκεύεται σε μορφή συντεταγμένων γεωγραφικού πλάτους και μήκους σε μοίρες, ενώ για το ωράριο λειτουργίας θα αποθηκεύονται οι ώρες που το κατάστημα ανοίγει και κλείνει σε εικοσιτετράωρη μορφή. + +\entityTable{restaurant} +{Οντότητα στην οποία αποθηκεύονται τα καταστήματα} +{Ισχυρή οντότητα} +{\underline{restaurant\_id} & \\ +& restaurant\_name & \\ +& restaurant\_category & \\ +& \multirow[c]{2}{*}{restaurant\_coordinates} & restaurant\_longitude \\ +& & restaurant\_latitude \\ +& \multirow[c]{2}{*}{restaurant\_working\_hours} & restaurant\_opening \\ +& & restaurant\_closing \\ +& restaurant\_rating & \\ +& restaurant\_reviews\_number & \\ +& restaurant\_is\_approved & }{10}{restaurant} + +\subsection{Food} + +Η οντότητα αυτή αφορά στη συγκεκριμένη υλοποίηση ενός φαγητού από κάποιο κατάστημα. Για κάθε φαγητό αποθηκεύονται ο αύξων αριθμός του πιάτου, το όνομα του πιάτου, μία περιγραφή, οι θερμίδες του, το rating του, ο αριθμός των ratings, το μέγεθος του, ένας δείκτης που διαχωρίζει τα φαγητά που έχουν προταθεί από αυτά που έχουν γίνει αποδεκτά από κάποιον διαχειριστή. + +\entityTable{food} +{Οντότητα στην οποία αποθηκεύονται τα πιάτα των καταστημάτων} +{Ισχυρή οντότητα} +{\underline{food\_id} & \\ +& food\_name & \\ +& food\_description & \\ +& food\_calories & \\ +& food\_rating & \\ +& food\_reviews\_number \\ +& food\_portion\_size \\ +& food\_is\_approved}{8}{food} + +\subsection{Drink} + +Η οντότητα αυτή αφορά στη συγκεκριμένη υλοποίηση ενός ποτού από κάποιο κατάστημα. Για κάθε ποτό αποθηκεύονται ο αύξων αριθμός του ποτού, το όνομα του ποτού, μία περιγραφή, το rating του, ο αριθμός των rating, το μέγεθος του, ένας δείκτης που διαχωρίζει τα ποτά που έχουν προταθεί από αυτά που έχουν γίνει αποδεκτά από κάποιον διαχειριστή. + +\entityTable{drink} +{Οντότητα στην οποία αποθηκεύονται τα ποτά των καταστημάτων} +{Ισχυρή οντότητα} +{\underline{drink\_id} & \\ +& drink\_name & \\ +& drink\_description & \\ +& drink\_rating & \\ +& drink\_reviews\_number & \\ +& drink\_portion\_size & \\ +& drink\_is\_approved}{7}{drink} + +\subsection{Ingredient} + +Για κάθε συστατικό αποθηκεύεται το όνομα του και ένας δείκτης που αναδεικνύει εάν περιέχει αλκοόλ. + +\entityTable{ingredient} +{Οντότητα στην οποία αποθηκεύονται τα συστατικά} +{Ισχυρή οντότητα} +{\underline{ingredient\_name} \\ +& ingredient\_has\_alcohol}{2}{ingredient} + +\subsection{User} + +Για κάθε χρήστη αποθηκεύονται ο αύξων αριθμός του, το email, το username, ο αριθμός των reviews που έχει κάνει, το hashed password και το salt του password του. + +\entityTable{user} +{Οντότητα στην οποία αποθηκεύονται οι χρήστες} +{Ισχυρή οντότητα} +{\underline{user\_id} \\ +& user\_email \\ +& user\_username \\ +& user\_number\_of\_reviews \\ +& user\_hashed\_password \\ +& user\_salt}{6}{user} + +\subsection{Diet} + +Για κάθε δίαιτα αποθηκεύονται ένα μοναδικό κλειδί που είναι ο αύξων αριθμός της, το όνομα, μία περιγραφή, ένας δείκτης που διαχωρίζει τις δίαιτες που έχουν προταθεί από αυτές που έχουν γίνει αποδεκτές από κάποιον διαχειριστή. + +\entityTable{diet} +{Οντότητα στην οποία αποθηκεύονται οι δίαιτες} +{Ισχυρή οντότητα} +{\underline{diet\_id} \\ +& diet\_name \\ +& diet\_description \\ +& diet\_is\_approved}{4}{diet} + +\subsection{Role} + +Για κάθε ρόλο αποθηκεύονται ένα μοναδικό κλειδί, ο τίτλος του ρόλου, μία περιγραφή. + +\entityTable{role} +{Οντότητα στην οποία αποθηκεύονται οι ρόλοι} +{Ισχυρή οντότητα} +{\underline{role\_id} \\ +& role\_name \\ +& role\_description}{3}{role} + +\newpage + +\subsection{Permission} + +Για κάθε δικαίωμα αποθηκεύονται ένα μοναδικό κλειδί, μία περιγραφή. + +\entityTable{permission} +{Οντότητα στην οποία αποθηκεύονται τα δικαιώματα} +{Ισχυρή οντότητα} +{\underline{permission\_id} \\ +& permission\_description}{2}{permission} diff --git a/Database design/3.entity_relationship_model/3.3.relationships_definition.tex b/Database design/3.entity_relationship_model/3.3.relationships_definition.tex new file mode 100644 index 0000000..134ed54 --- /dev/null +++ b/Database design/3.entity_relationship_model/3.3.relationships_definition.tex @@ -0,0 +1,202 @@ +\section{Καθορισμός Συσχετίσεων} + +\subsection{Restaurant offers Food} + +Τα καταστήματα προσφέρουν ένα ή περισσότερα φαγητά. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{restaurant\_offers\_food} +{Κάθε κατάστημα προσφέρει έναν αριθμό από φαγητά} +{Has-A, προσδιορίζουσα συσχέτιση της οντότητας food} +{1:N} +{Ολική συμμετοχή της οντότητας food \\ +& Μερική συμμετοχή της οντότητας restaurant} +{1} +{-} +{restaurantOffersFood} + +\subsection{Restaurant offers Drink} + +Τα καταστήματα προσφέρουν ένα ή περισσότερα ποτά. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{restaurant\_offers\_drink} +{Κάθε κατάστημα προσφέρει έναν αριθμό από ποτά} +{Has-A, προσδιορίζουσα συσχέτιση της οντότητας drink} +{1:N} +{Ολική συμμετοχή της οντότητας drink \\ +& Μερική συμμετοχή της οντότητας restaurant} +{1} +{-} +{restaurantOffersDrink} + +\newpage + +\subsection{Food has Ingredient} + +Τα φαγητά αποτελούνται από ένα ή περισσότερα συστατικά, ενώ τα ίδια συστατικά μπορεί να χρησιμοποιούνται από πολλά φαγητά. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{food\_has\_ingredient} +{Κάθε φαγητό που προσφέρεται αποτελείται από έναν αριθμό συστατικών} +{Has-A συσχέτιση} +{M:N} +{Ολική συμμετοχή της οντότητας food \\ +& Μερική συμμετοχή της οντότητας ingredient} +{1} +{-} +{foodHasIngredient} + +\subsection{Drink has Ingredient} + +Τα ποτά αποτελούνται από ένα ή περισσότερα συστατικά, ενώ τα ίδια συστατικά μπορεί να χρησιμοποιούνται από πολλά ποτά. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{drink\_has\_ingredient} +{Κάθε ποτό που προσφέρεται αποτελείται από έναν αριθμό συστατικών} +{Has-A συσχέτιση} +{M:N} +{Ολική συμμετοχή της οντότητας drink \\ +& Μερική συμμετοχή της οντότητας ingredient} +{1} +{-} +{drinkHasIngredient} + +\subsection{User prohibits Ingredient} + +Οι χρήστες μπορούν να αποκλείσουν ένα ή περισσότερα συστατικά, ενώ τα ίδια συστατικά μπορεί να αποκλείονται από πολλούς χρήστες. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{user\_prohibits\_ingredient} +{Οι χρήστες μπορούν να αποκλείσουν έναν αριθμό από συστατικά} +{Has-A συσχέτιση} +{M:N} +{Μερική συμμετοχή της οντότητας user \\ +& Μερική συμμετοχή της οντότητας ingredient} +{1} +{-} +{userProhibitsIngredient} + +\newpage + +\subsection{User follows Diet} + +Οι χρήστες μπορούν να ακολουθούν μία ή περισσότερες δίαιτες, ενώ οι ίδιες δίαιτες μπορεί να ακολουθούνται από πολλούς χρήστες. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{user\_follows\_diet} +{Οι χρήστες μπορεί να ακολουθούν μία ή περισσότερες δίαιτες} +{Has-A συσχέτιση} +{M:N} +{Μερική συμμετοχή της οντότητας user \\ +& Μερική συμμετοχή της οντότητας diet} +{2} +{-} +{userFollowsDiet} + +\subsection{User rates Food} + +Οι χρήστες μπορούν να αξιολογήσουν ένα ή περισσότερα φαγητά, ενώ τα ίδια φαγητά μπορεί να αξιολογηθούν από πολλούς χρήστες. Κάθε χρήστης μπορεί να κάνει μόνο μία κριτική για ένα φαγητό. Για τη συσχέτιση αυτή απαιτούνται επιπλέον η βαθμολογία, το κείμενο, η ημερομηνία της αξιολόγησης, και η βαθμολογία για το μέγεθος της μερίδας. + +\relationTable{user\_rates\_food} +{Οι χρήστες μπορούν να αξιολογήσουν ένα ή περισσότερα φαγητά} +{Has-A συσχέτιση} +{M:N} +{Μερική συμμετοχή της οντότητας user \\ +& Μερική συμμετοχή της οντότητας food} +{4} +{rating\_grade \\ +& rating\_text \\ +& rating\_date \\ +& rating\_portion\_size} +{userRatesFood} + +\newpage + +\subsection{User rates Drink} + +Οι χρήστες μπορούν να αξιολογήσουν ένα ή περισσότερα ποτά, ενώ τα ίδια ποτά μπορεί να αξιολογηθούν από πολλούς χρήστες. Κάθε χρήστης μπορεί να κάνει μόνο μία κριτική για ένα ποτό. Για τη συσχέτιση αυτή απαιτούνται επιπλέον η βαθμολογία, το κείμενο, η ημερομηνία της αξιολόγησης και η αξιολόγηση για το μέγεθος του ποτού. + +\relationTable{user\_rates\_drink} +{Οι χρήστες μπορούν να αξιολογήσουν ένα ή περισσότερα ποτά} +{Has-A συσχέτιση} +{M:N} +{Μερική συμμετοχή της οντότητας user \\ +& Μερική συμμετοχή της οντότητας drink} +{4} +{rating\_grade \\ +& rating\_text \\ +& rating\_date \\ +& rating\_portion\_size} +{userRatesDrink} + +\subsection{User rates Restaurant} + +Οι χρήστες μπορούν να αξιολογήσουν ένα ή περισσότερα καταστήματα, ενώ τα ίδια καταστήματα μπορεί να αξιολογηθούν από πολλούς χρήστες. Κάθε χρήστης μπορεί να κάνει μόνο μία κριτική για ένα κατάστημα. Για τη συσχέτιση αυτή απαιτούνται επιπλέον η βαθμολογία, το κείμενο, η ημερομηνία της αξιολόγησης και η δίαιτα με βάση την οποία αξιολογεί το κατάστημα (ο χρήστης μπορεί να επιλέξει μια διαφορετική δίαιτα κάθε φορά). + +\relationTable{user\_rates\_restaurant} +{Οι χρήστες μπορούν να αξιολογήσουν ένα ή περισσότερα καταστήματα με βάση μια δίαιτα} +{Has-A τριαδική συσχέτιση} +{M:N:1} +{Μερική συμμετοχή της οντότητας user \\ +& Μερική συμμετοχή της οντότητας restaurant \\ +& Μερική συμμετοχή της οντότητας diet} +{3} +{rating\_grade \\ +& rating\_text \\ +& rating\_date} +{userRatesRestaurant} + +\newpage + +\subsection{User owns Restaurant} + +Όταν ένας χρήστης είναι ιδιοκτήτης, υπάρχει ένα μόνο κατάστημα το οποίο αντιπροσωπεύει. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{user\_owns\_restaurant} +{Ένας χρήστης μπορεί να είναι ιδιοκτήτης ενός καταστήματος} +{Has-A συσχέτιση} +{1:1} +{Μερική συμμετοχή της οντότητας user \\ +& Μερική συμμετοχή της οντότητας restaurant} +{1} +{-} +{userOwnsRestaurant} + +\subsection{Diet prohibits Ingredient} + +Οι δίαιτες μπορεί να αποκλείουν ένα ή περισσότερα συστατικά, ενώ τα ίδια συστατικά μπορεί να αποκλείονται από πολλές δίαιτες. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{diet\_prohibits\_ingredient} +{Οι δίαιτες μπορεί να αποκλείουν ένα ή περισσότερα συστατικά} +{Has-A συσχέτιση} +{M:N} +{Μερική συμμετοχή της οντότητας diet \\ +& Μερική συμμετοχή της οντότητας ingredient} +{1} +{-} +{dietProhibitsIngredient} + +\subsection{User has Role} + +Οι χρήστες πρέπει να έχουν έναν ρόλο. Ωστόσο υποθέτουμε ότι μπορεί να υπάρχει ένας ρόλος που να μην έχει ανατεθεί σε χρήστες. Αυτό είναι απαραίτητο για τον ρόλο του διαχειριστή, τον οποίο δεν θα έχει κανένας χρήστης στην αρχή. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{user\_has\_role} +{Κάθε χρήστης έχει ένα ρόλο} +{Has-A συσχέτιση} +{N:1} +{Ολική συμμετοχή της οντότητας user \\ +& Μερική συμμετοχή της οντότητας role} +{1} +{-} +{userHasRole} + +\newpage + +\subsection{Role has Permission} + +Οι ρόλοι επιτρέπουν τουλάχιστον ένα ή περισσότερα δικαιώματα, ενώ τα ίδια τα δικαιώματα μπορεί να επιτρέπονται από πολλούς ρόλους. Για τη συσχέτιση αυτή δεν απαιτούνται επιπλέον γνωρίσματα. + +\relationTable{role\_has\_permission} +{Κάθε ρόλος έχει ορισμένα δικαιώματα} +{Has-A συσχέτιση} +{M:N} +{Ολική συμμετοχή της οντότητας role \\ +& Μερική συμμετοχή της οντότητας permission} +{1} +{-} +{roleHasPermission} diff --git a/Database design/3.entity_relationship_model/3.4.ERDs.tex b/Database design/3.entity_relationship_model/3.4.ERDs.tex new file mode 100644 index 0000000..d58850c --- /dev/null +++ b/Database design/3.entity_relationship_model/3.4.ERDs.tex @@ -0,0 +1,12 @@ +\section{Διάγραμμα Οντοτήτων/Συσχετίσεων} + +\begin{figure}[H] + \centering + \resizebox{\textwidth}{!}{ + \texttt{ + \input{res/diagrams/ERD.pdf_tex} + } + } + \caption{Διάγραμμα οντοτήτων-συσχετίσεων} + \label{entityTable:ERD} +\end{figure} diff --git a/Database design/4.relational_model/4.0.relational_model.tex b/Database design/4.relational_model/4.0.relational_model.tex new file mode 100644 index 0000000..e3be0a8 --- /dev/null +++ b/Database design/4.relational_model/4.0.relational_model.tex @@ -0,0 +1,6 @@ +\chapter{Σχεσιακό μοντέλο} + +\input{4.relational_model/4.1.attribute_domains.tex} +\input{4.relational_model/4.2.relations.tex} +\input{4.relational_model/4.3.relational_diagram.tex} +\input{4.relational_model/4.4.views.tex} \ No newline at end of file diff --git a/Database design/4.relational_model/4.1.attribute_domains.tex b/Database design/4.relational_model/4.1.attribute_domains.tex new file mode 100644 index 0000000..8b483fa --- /dev/null +++ b/Database design/4.relational_model/4.1.attribute_domains.tex @@ -0,0 +1,24 @@ +\section{Πεδία Ορισμού} + +\begin{table}[H] + \centering + \begin{tabular}{l p{9cm}} \toprule + Πεδίο ορισμού & Τύπος \\ \midrule + ΑΚΕΡΑΙΟΣ & INT \\ + ΣΥΝΤΕΤΑΓΜΕΝΕΣ & FLOAT \\ + ΜΕΓΕΘΟΣ ΜΕΡΙΔΑΣ & ENUMERATE[small, medium, big] \\ + ΕΙΔΟΣ\_ΚΑΤΑΣΤΗΜΑΤΟΣ & ENUMERATE[cafeteria, pub, bar, restaurant, fast\_food, ethnic] \\ + ΤΟΥ\_ΜΠΟΥΛ~\cite{ofBool} & BOOLEAN \\ + ΜΕΣΗ\_ΒΑΘΜΟΛΟΓΙΑ & FLOAT\_RANGE[1, 5] \\ + ΟΝΟΜΑ & VARIABLE\_CHAR(200) \\ + ΠΕΡΙΓΡΑΦΗ & VARIABLE\_CHAR(150) \\ + EMAIL & VARIABLE\_CHAR(500) \\ + HASHED\_PASSWORD & CHAR(64) \\ + SALT & CHAR(32) \\ + ΑΞΙΟΛΟΓΗΣΗ & INT\_RANGE[1, 5] \\ + ΗΜΕΡΟΜΗΝΙΑ & DATE \\ + ΩΡΑ & ΤΙΜΕ \\ \bottomrule + \end{tabular} + \caption{Πεδία ορισμού} + \label{domainTable} +\end{table} \ No newline at end of file diff --git a/Database design/4.relational_model/4.2.relations.tex b/Database design/4.relational_model/4.2.relations.tex new file mode 100644 index 0000000..1143dbe --- /dev/null +++ b/Database design/4.relational_model/4.2.relations.tex @@ -0,0 +1,189 @@ +\section{Σχέσεις} + +\subsection{Restaurant} +\rEntTable{restaurant} +{restaurant\_id & ΑΚΕΡΑΙΟΣ \\ +restaurant\_name & ΟΝΟΜΑ \\ +restaurant\_category & ΕΙΔΟΣ\_ΚΑΤΑΣΤΗΜΑΤΟΣ \\ +restaurant\_longitude & ΣΥΝΤΕΤΑΓΜΕΝΕΣ \\ +restaurant\_latitude & ΣΥΝΤΕΤΑΓΜΕΝΕΣ \\ +restaurant\_opening & ΩΡΑ \\ +restaurant\_closing & ΩΡΑ \\ +%restaurant\_rating & ΜΕΣΗ\_ΒΑΘΜΟΛΟΓΙΑ \\ +%restaurant\_reviews\_number & ΑΚΕΡΑΙΟΣ \\ +restaurant\_is\_approved & ΤΟΥ\_ΜΠΟΥΛ} +{restaurant\_id} +{1} +{user\_id → user} +{restaurant} + +\subsection{Food} +\rEntTable{food} +{food\_id & ΑΚΕΡΑΙΟΣ\\ +food\_name & ΟΝΟΜΑ\\ +food\_description & ΠΕΡΙΓΡΑΦΗ\\ +food\_calories & ΑΚΕΡΑΙΟΣ \\ +%food\_rating & ΑΞΙΟΛΟΓΗΣΗ\\ +%food\_reviews\_number & ΑΚΕΡΑΙΟΣ \\ +%food\_portion\_size & ΜΕΓΕΘΟΣ ΜΕΡΙΔΑΣ \\ +food\_is\_approved & ΤΟΥ\_ΜΠΟΥΛ} +{food\_id} +{1} +{restaurant\_id → restaurant} +{food} + +\subsection{Drink} +\rEntTable{drink} +{drink\_id & ΑΚΕΡΑΙΟΣ \\ +drink\_name & ΟΝΟΜΑ \\ +drink\_description & ΠΕΡΙΓΡΑΦΗ \\ +%drink\_rating & ΑΞΙΟΛΟΓΗΣΗ \\ +%drink\_reviews\_number & ΑΚΕΡΑΙΟΣ \\ +%drink\_portion\_size & ΜΕΓΕΘΟΣ ΜΕΡΙΔΑΣ \\ +drink\_is\_approved & ΤΟΥ\_ΜΠΟΥΛ} +{drink\_id} +{1} +{restaurant\_id → restaurant} +{drink} + +\subsection{Ingredient} +\rEntTable{ingredient} +{ingredient\_name & ΟΝΟΜΑ \\ +ingredient\_has\_alcohol & ΤΟΥ\_ΜΠΟΥΛ} +{ingredient\_name} +{1} +{-} +{ingredient} + +\subsection{User} +\rEntTable{user} +{user\_id & ΑΚΕΡΑΙΟΣ \\ +user\_email & EMAIL \\ +user\_username & ΟΝΟΜΑ \\ +%user\_number\_of\_reviews & ΑΚΕΡΑΙΟΣ \\ +user\_hashed\_password & HASHED\_PASSWORD\\ +user\_salt & SALT} +{user\_id} +{1} +{role\_id → role} +{user} + +\subsection{Diet} +\rEntTable{diet} +{diet\_id & ΑΚΕΡΑΙΟΣ \\ +diet\_name & ΟΝΟΜΑ \\ +diet\_description & ΠΕΡΙΓΡΑΦΗ \\ +diet\_is\_approved & ΤΟΥ\_ΜΠΟΥΛ} +{diet\_id} +{1} +{-} +{diet} + +\subsection{Role} +\rEntTable{role} +{role\_id & ΑΚΕΡΑΙΟΣ \\ +role\_name & ΟΝΟΜΑ \\ +role\_description & ΠΕΡΙΓΡΑΦΗ} +{role\_id} +{1} +{-} +{role} + +\subsection{Permission} +\rEntTable{permission} +{permission\_id & ΑΚΕΡΑΙΟΣ \\ +permission\_description & ΠΕΡΙΓΡΑΦΗ} +{permission\_id} +{1} +{-} +{permission} + +\subsection{Food has Ingredient} +\rEntTable{food\_has\_ingredient} +{- & -} +{food\_id \& ingredient\_name} +{2} +{food\_id → food \\ +& ingredient\_name → ingredient} +{foodHasIngredient} + +\subsection{Drink has Ingredient} +\rEntTable{drink\_has\_ingredient} +{- & -} +{drink\_id \& ingredient\_name} +{2} +{drink\_id → drink \\ +& ingredient\_name → ingredient} +{drinkHasIngredient} + +\subsection{User prohibits Ingredient} +\rEntTable{user\_prohibits\_ingredient} +{- & -} +{user\_id \& ingredient\_name} +{2} +{user\_id → user \\ +& ingredient\_name → ingredient} +{userProhibitsIngredient} + +\subsection{User follows Diet} +\rEntTable{user\_follows\_diet} +{- & -} +{user\_id \& diet\_id} +{2} +{user\_id → user \\ +& diet\_id → diet} +{userFollowsDiet} + +\subsection{User rates Food} +\rEntTable{user\_rates\_food} +{rating\_grade & ΑΞΙΟΛΟΓΗΣΗ \\ +rating\_date & ΗΜΕΡΟΜΗΝΙΑ \\ +rating\_text & ΠΕΡΙΓΡΑΦΗ \\ +rating\_portion\_size & ΜΕΓΕΘΟΣ ΜΕΡΙΔΑΣ} +{user\_id \& food\_id} +{2} +{user\_id → user \\ +& food\_id → food} +{userRatesFood} + +\subsection{User rates Drink} +\rEntTable{user\_rates\_drink} +{rating\_grade & ΑΞΙΟΛΟΓΗΣΗ\\ +rating\_date & ΗΜΕΡΟΜΗΝΙΑ\\ +rating\_text & ΠΕΡΙΓΡΑΦΗ \\ +rating\_portion\_size & ΜΕΓΕΘΟΣ ΜΕΡΙΔΑΣ} +{user\_id \& drink\_id} +{2} +{user\_id → user \\ +& drink\_id → drink} +{userRatesDrink} + +\subsection{User rates Restaurant} +\rEntTable{user\_rates\_restaurant} +{rating\_grade & ΑΞΙΟΛΟΓΗΣΗ \\ +rating\_text & ΗΜΕΡΟΜΗΝΙΑ \\ +rating\_date & ΠΕΡΙΓΡΑΦΗ} +{user\_id \& restaurant\_id} +{3} +{user\_id → user \\ +& restaurant\_id → restaurant\\ +& diet\_id → diet} +{userRatesRestaurant} + +\subsection{Diet prohibits Ingredient} +\rEntTable{diet\_prohibits\_ingredient} +{- & -} +{diet\_id \& ingredient\_name} +{2} +{diet\_id → diet \\ +& ingredient\_name → ingredient} +{dietProhibitsIngredient} + +\subsection{Role has Permission} +\rEntTable{role\_has\_permission} +{- & -} +{role\_id \& permission\_id} +{2} +{role\_id → role \\ +& permission\_id → permission} +{roleHasPermission} \ No newline at end of file diff --git a/Database design/4.relational_model/4.3.relational_diagram.tex b/Database design/4.relational_model/4.3.relational_diagram.tex new file mode 100644 index 0000000..96ae858 --- /dev/null +++ b/Database design/4.relational_model/4.3.relational_diagram.tex @@ -0,0 +1,14 @@ +\section{Σχεσιακό Διάγραμμα} + +\begin{figure}[H] + \centering + \resizebox{\textwidth}{!}{ + \begin{small} + \texttt{ + \input{res/diagrams/Relational_Diagram.pdf_tex} + } + \end{small} + } + \caption{Διάγραμμα οντοτήτων-συσχετίσεων} + \label{entityTable:relationalDiagram} +\end{figure} \ No newline at end of file diff --git a/Database design/4.relational_model/4.4.views.tex b/Database design/4.relational_model/4.4.views.tex new file mode 100644 index 0000000..d6921b0 --- /dev/null +++ b/Database design/4.relational_model/4.4.views.tex @@ -0,0 +1,19 @@ + \section{Όψεις} + +Μια όψη που περιέχει όλα τα εστιατόρια που υπάρχουν στη βάση και τα πιάτα και ποτά που προσφέρουν τα οποία έχουν εγκριθεί από διαχειριστές. Η όψη αυτή είναι χρήσιμη για την κατηγορία χρηστών των πελατών. + +\begin{align*} + V1 \leftarrow & (\sigma_{\text{restaurant\_is\_approved} = \text{TRUE}}(\text{restaurant}) \bowtie \sigma_{\text{food\_is\_approved} = \text{TRUE}}(\text{food}) \bowtie \\ + &\text{food\_has\_ingredient} \bowtie \text{ingredient}) \cup \\ + &(\sigma_{\text{restaurant\_is\_approved = TRUE}}(\text{restaurant}) \bowtie \sigma_{\text{drink\_is\_approved = TRUE}}(\text{drink}) \bowtie \\ + &\text{drink\_has\_ingredient} \bowtie \text{ingredient}) +\end{align*} + +Μια όψη που περιέχει όλα τα πιάτα και τα ποτά που δεν έχουν εγκριθεί ακόμα, καθώς και το κατάστημα που τα προσφέρει όπως και τη λίστα των συστατικών τους. Η όψη αυτή είναι χρήσιμη για την κατηγορία χρηστών των διαχειριστών. + +\begin{align*} + V2 \leftarrow & (\text{restaurant} \bowtie \sigma_{\text{food\_is\_approved} = \text{FALSE}}(\text{food}) \bowtie \\ + &\text{food\_has\_ingredient} \bowtie \text{ingredient}) \cup \\ + &(\text{restaurant} \bowtie \sigma_{\text{drink\_is\_approved = FALSE}}(drink) \bowtie \\ + &\text{drink\_has\_ingredient} \bowtie \text{ingredient}) +\end{align*} diff --git a/Database design/5.examples/5.0.examples.tex b/Database design/5.examples/5.0.examples.tex new file mode 100644 index 0000000..f1a0359 --- /dev/null +++ b/Database design/5.examples/5.0.examples.tex @@ -0,0 +1,4 @@ +\chapter{Παραδείγματα} + +\input{5.examples/5.1.table_examples.tex} +\input{5.examples/5.2.query_examples.tex} \ No newline at end of file diff --git a/Database design/5.examples/5.1.table_examples.tex b/Database design/5.examples/5.1.table_examples.tex new file mode 100644 index 0000000..65cca30 --- /dev/null +++ b/Database design/5.examples/5.1.table_examples.tex @@ -0,0 +1,284 @@ +\section{Παραδείγματα Πινάκων} + +\subsection{Restaurant} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + restaurant\_id & 8132 & 7365 & 4330 & 1356 & 6211 \\ + user\_id & 1566 & NULL & 24788 & 356 & NULL \\%foreign + restaurant\_name & Γιαννούλα & McDonald's & Οδυσσέας & Αιθερόπλοο & Pulp\\ + restaurant\_category & restaurant & fast\_food & restaurant & pub & bar\\ + restaurant\_longitude & -122.78955 & -78.59138 & 40.31655 & -88.488 & -54.258\\ + restaurant\_latitude & 47.13832 & 4.26262 & 40.31655 & 57.587 & 54.73\\ + restaurant\_opening & 13:30 & 12:00 & 12:30 & 08:00 & 09:00\\ + restaurant\_closing & 01:00 & 23:59 & 18:00 & 02:00 & 23:59\\ + %restaurant\_rating & 4.9 & ΝULL & 4.3 & 5 & 4.7\\ + %restaurant\_reviews\_number & 2358 & ΝULL & 5711 & 1747 & 8615\\ + restaurant\_is\_approved & TRUE & FALSE & TRUE & TRUE & TRUE \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Restaurant} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: \textasciitilde15.000 ανά πόλη + +\subsection{Food} +\begin{table}[H] + \centering + \begin{tabular}{ l >{\raggedleft}p{3.5cm} >{\raggedleft}p{3.5cm} >{\raggedleft\arraybackslash}p{3.5cm}} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{3}{c}{Πλειάδα \#} \\ + \cmidrule{2-4} + & 1 & 2 & 3 \\ \toprule + food\_id & 124 & 548 & 478 \\ + restaurant\_id & 6137 & 3275 & 4378 \\ %foreign + food\_name & Γεμιστά & Fish\&Chips & Πατσάς με σκορδοστούμπι \\ + food\_description & Παραδοσιακό ελληνικό πιάτο & Μία γεύση από Αγγλία & Ένα πιάτο που θυμίζει πολύ χωριό \\ + food\_calories & 392 & 840 & 450 \\ + %food\_rating & 4.2 & 4.7 & 2.3\\ + %food\_reviews\_number & 154 & 5 & 30\\ + %food\_portion\_size & medium & big & small \\ + food\_is\_approved & TRUE & TRUE & TRUE \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Food} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 300.000 ανά πόλη + +\subsection{Drink} +\begin{table}[H] + \centering + \begin{tabular}{ l >{\raggedleft}p{3.5cm} >{\raggedleft}p{3.5cm} >{\raggedleft\arraybackslash}p{3.5cm}} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{3}{c}{Πλειάδα \#} \\ + \cmidrule{2-4} + & 1 & 2 & 3 \\ \toprule + drink\_id & 6363 & 26427 & 3214 \\ + restaurant\_id & 152 & 1256 & 5622 \\ %foreign + drink\_name & White Russian & Old Fashioned & Mojito \cr + drink\_description & Διάσημο coctail που έπινε ο Jeff Bridges στη ταινία "The big Lebowski" & Κοκτέιλ με αμερικάνικες ρίζες & Δροσιστικό κουβανέζικο κοκτέιλ \\ + %drink\_rating & 4.99 & NULL & 4.1 \\ + %drink \_reviews\_number & 3716 & NULL & 735 \\ + %drink\_portion\_size & medium & NULL & big \\ + drink\_has\_alcohol & TRUE & TRUE & TRUE \\ + drink\_is\_approved & TRUE & FALSE & TRUE \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Drink} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 150.000 ανά πόλη + +\subsection{Ingredient} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + ingredient\_name & Μερέντα & Ρούμι & Καρύδι & Πατάτα & Πορτοκάλι \\ + ingredient\_has\_alcohol & FALSE & TRUE & FALSE & FALSE & FALSE \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Ingredient} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 1.000 + +\subsection{User} +\begin{table}[H] + \centering + \begin{tabular}{ l >{\raggedleft}p{4.5cm} >{\raggedleft\arraybackslash}p{4.5cm}} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{2}{c}{Πλειάδα \#} \\ + \cmidrule{2-3} + & 1 & 2 \\ \toprule + user\_id & 2304 & 1235 \\ + role\_id & 0 & 2\\%foreign + user\_email & iamanonymous@ not.your.buisness.ελ & nonexistent@noidea.bn \\ + user\_username & Ανώνυμος & Ανύπαρκτος \\ + %user\_number\_of\_reviews & ΑΚΕΡΑΙΟΣ \\ + user\_hashed\_password & 5F4783987A5E5B9B 2D7FBA6BA5D8879A 6EA94D24CE374570 BD74CFF205D2E552 & 09986D06B9EABA02 00318069CD372659 C6036E2B9F0B1D44 083F438E5DDE5821\\ + user\_salt & 7g2pnmg118k9h4h5 zphkntixwb4wtyn8 & vjp4a15w7n6806fm he3x45qxz988xxql \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα User} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 200.000.000 παγκοσμίως + +\subsection{Diet} +\begin{table}[H] + \centering + \begin{tabular}{ l >{\raggedleft}p{3cm} >{\raggedleft}p{1.7cm} >{\raggedleft}p{1.8cm} >{\raggedleft}p{1.8cm} >{\raggedleft\arraybackslash}p{3cm}} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + diet\_id & 2 & 7 & 20 & 13 & 18 \\ + diet\_name & Διαβητικών & Vegan & Vegetarian & Bulking & Christian Fasting \\ + diet\_description & Χαρακτηρίζεται από φαγητά χαμηλά σε ζάχαρη & Not found & Όχι vegan & Μόνο κρέας & Όχι τροφές παραγώμενες από ζώα και όχι λάδι \\ + diet\_is\_approved & TRUE & FALSE & FALSE & TRUE & TRUE \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Diet} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 40 + +\subsection{Role} +\begin{table}[H] + \centering + \begin{tabular}{ l >{\raggedleft}p{3cm} >{\raggedleft}p{3cm} >{\raggedleft\arraybackslash}p{3cm}} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{3}{c}{Πλειάδα \#} \\ + \cmidrule{2-4} + & 1 & 2 & 3 \\ \toprule + role\_id & 0 & 1 & 2 \\ + role\_name & user & moderator & owner \\ + role\_description & Απλός χρήστης & Διαχειριστής & Ιδιοκτήτης \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Role} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 4 + +\subsection{Permission} +\begin{table}[H] + \centering + \begin{tabular}{ l >{\raggedleft}p{2cm} >{\raggedleft}p{2cm} >{\raggedleft}p{2cm} >{\raggedleft}p{2cm} >{\raggedleft\arraybackslash}p{2cm}} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{3}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + permission\_id & 8 & 4 & 16 & 32 & 64 \\ %Μόνο δυνάμεις του 2, δεν είναι τυχαίο, μη πειράζετε! + permission\_description & Μπορεί να εγκρίνει κατάστημα & Μπορεί να προσθέσει πιάτο σε κατάστημα χωρίς αναμονή έγκρισης & Μπορεί να αξιολογήσει καταστήματα & Μπορεί να αξιολογήσει ποτό & Μπορεί να κάνει ban σε χρήστη \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Permission} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 15 + +\subsection{Food has Ingredient} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + food\_id & 1112 & 827 & 1807 & 3366 & 4635 \\ + ingredient\_id & 247 & 89 & 34 & 75 & 50 \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Food has Ingredient} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 2.100.000 ανά πόλη + +\subsection{Drink has Ingredient} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + drink\_id & 3603 & 321 & 5493 & 1317 & 3677 \\ + ingredient\_id & 147 & 301 & 19 & 233 & 38 \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Drink has Ingredient} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 300.000 ανά πόλη + +\subsection{User prohibits Ingredient} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + user\_id & 7566 & 2112 & 7908 & 3604 & 10597 \\ + ingredient\_id & 38 & 89 & 110 & 78 & 297 \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα User prohibits Ingredient} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 1.000.000.000 παγκοσμίως + +\subsection{User follows Diet} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + user\_id & 963 & 11318 & 1305 & 14744 & 14312 \\ + diet\_id & 24 & 23 & 28 & 20 & 32 \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα User follows Diet} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 400.000.000 παγκοσμίως + +\subsection{User rates Food} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + user\_id & 5357 & 9347 & 11724 & 1744 & 9641 \\ + food\_id & 435 & 3586 & 7767 & 5868 & 2378 \\ + rating\_grade & 2 & 3 & 5 & 4 & 1 \\ + rating\_date & 2018-08-20 & 2018-11-11 & 2018-03-25 & 2018-09-07 & 2018-12-18 \\ + rating\_text & NULL & Μέτριο & Πολύ γευστικό & NULL & NULL \\ + rating\_portion\_size & NULL & medium & medium & medium & small \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα User rates Food} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 400.000.000 παγκοσμίως + +\subsection{User rates Drink} +\begin{table}[H] + \centering + \begin{tabular}{ l r >{\raggedleft}p{2cm} >{\raggedleft}p{2cm} >{\raggedleft}p{2cm} >{\raggedleft\arraybackslash}p{2cm}} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + user\_id & 18899 & 6328 & 9954 & 14381 & 8254 \\ + drink\_id & 1509 & 1598 & 1000 & 982 & 618 \\ + rating\_grade & 4 & 5 & 1 & 2 & 3\\ + rating\_date & 2018-12-17 & 2018-07-08 & 2018-05-01 & 2018-06-28 & 2018-09-13 \\ + rating\_text & NULL & Τέλειο!!1 & Τίγκα στη ζάχαρη.. & NULL & Μετριότης κύριοι.\\ + rating\_portion\_size & medium & medium & medium & NULL & small \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα User rates Drink} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 400.000.000 παγκοσμίως + +\subsection{User rates Restaurant} +\begin{table}[H] + \centering + \begin{tabular}{ l >{\raggedleft}p{3cm} r >{\raggedleft\arraybackslash}p{3cm} r r} + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + user\_id & 783 & 5878 & 5469 & 6531 & 325 \\ + restaurant\_id & 3307 & 1548 & 1198 & 2326 & 400 \\ + rating\_grade & 5 & 1 & 4 & 3 & 2 \\ + rating\_date & 2018-01-04 & 2018-06-08 & 2018-09-16 & 2018-10-02 & 2018-04-04 \\ + rating\_text & Εξαιρετικό service. Θα ξαναπάω! & NULL & Όμορφος χώρος, λίγο ακριβό. & NULL & NULL \\ + diet\_id & 25 & 13 & NULL & 17 & NULL \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα User rates Restaurant} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 180.000.000 παγκοσμίως + + +\subsection{Diet prohibits Ingredient} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + diet\_id & 22 & 16 & 7 & 11 & 6 \\ + ingredient\_id & 47 & 27 & 4 & 96 & 128 \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Diet prohibits Ingredient} +\end{table} +Εκτίμηση για τον αριθμό των εγγραφών: 6.000 + +\subsection{Role has Permission} +\begin{table}[H] + \centering + \begin{tabular}{ l r r r r r } + \multirow{2}{*}{Γνώρισμα} & \multicolumn{5}{c}{Πλειάδα \#} \\ + \cmidrule{2-6} + & 1 & 2 & 3 & 4 & 5 \\ \toprule + role\_id & 1 & 2 & 1 & 3 & 2 \\ + permission\_id & 78 & 964 & 147 & 36 & 663 \\ \bottomrule + \end{tabular} + \caption{Παραδείγματα εγγραφών για τον πίνακα Role has Permission} +\end{table} + +Εκτίμηση για τον αριθμό των εγγραφών: 60 \ No newline at end of file diff --git a/Database design/5.examples/5.2.query_examples.tex b/Database design/5.examples/5.2.query_examples.tex new file mode 100644 index 0000000..bd7407f --- /dev/null +++ b/Database design/5.examples/5.2.query_examples.tex @@ -0,0 +1,92 @@ +\section{Παραδείγματα Ερωτημάτων} + +\begin{enumerate} + + \item + Όλα τα ονόματα των εστιατορίων τα οποία έχουν εγκριθεί και βρίσκονται κοντά σε μία περιοχή: + \begin{align*} + &\Pi_{\text{restaurant\_name}}( + \sigma_{\text{long\_dist} > -4 \wedge \text{long\_dist} < 4 \wedge \text{lat\_dist} > -4 \wedge \text{lat\_dist} < 4}( \\ + &\Pi_{\text{restaurant\_name}, \text{given\_current\_longitude} - \text{restaurant\_longitude as long\_dis}, \text{given\_current\_latitude} - \text{restaurant\_latitude as lat\_dis}}( \\ + &\sigma_{\text{restaurant\_is\_approved} = \text{TRUE}} + (\text{restaurant})))) + \end{align*} + + \item + Όλα τα ονόματα εστιατορίων τα οποία δεν έχουν εγκριθεί ακόμα: + \begin{displaymath} + \Pi_{\text{restaurant\_name}} + (\sigma_{\text{restaurant\_is\_approved} = \text{FALSE}}(\text{restaurant})) + \end{displaymath} + + \item + Συστατικά που απαγορεύονται από τις δίαιτες που ακολουθεί ένας χρήστης καθώς και αυτά που έχει αποκλείσει μεμονωμένα: + \begin{align*} + Q3 \leftarrow &\sigma_{\text{user\_id} = \text{given\_id}}(\text{user\_follows\_diet})\triangleleft_{\theta}\text{diet}\triangleleft_{\theta}\text{diet\_prohibits\_ingredient}\triangleleft_{\theta}\text{ingredient} \cup \\ + &\sigma_{\text{user\_id} = \text{given\_id}}(\text{user\_prohibits\_ingredient})\triangleleft_{\theta}\text{ingredient} + \end{align*} + + \item + Πιάτα ενός εστιατορίου, εκτός αυτά που περιέχουν συστατικά τα οποία απαγορεύονται από τις δίαιτες που ακολουθεί ένας χρήστης ή τα έχει αποκλείσει μεμονωμένα. Για την ευκολότερη γραφή αυτού του ερωτήματος έγινε η ανάθεση του αποτελέσματος του προηγούμενου ερωτήματος στην προσωρινή μεταβλητή σχέσης Q3: + \begin{displaymath} + \sigma_{\text{restaurant\_id} = \text{given\_id}}(\text{food}) - (Q3\triangleleft_{\theta}\text{food\_has\_ingredient}\triangleleft_{\theta}\text{food}) + \end{displaymath} + + \item + Ονόματα ποτών ενός καταστήματος: + \begin{displaymath} + \Pi_{\text{drink\_name}} + (\sigma_{\text{restaurant\_id} = \text{given\_id}}(\text{drink})) + \end{displaymath} + + \item + Ονόματα συστατικών ενός ποτού: + \begin{displaymath} + \Pi_{\text{ingredient\_name}} + (\sigma_{\text{drink\_id} = \text{given\_id}}(\text{drink\_has\_ingredient}) \bowtie \text{ingredient}) + \end{displaymath} + + \item + Τα mails των χρηστών που έχουν αξιολογήσει ένα εστιατόριο: + \begin{displaymath} + \Pi_{user\_mail} + (\sigma_{\text{restaurant\_id} = \text{given\_id}}(\text{user\_rates\_restaurant}) \bowtie \text{user}) + \end{displaymath} + + \item + Μέσος όρων αξιολογήσεων ενός ποτού ενός καταστήματος: + \begin{displaymath} + \mathcal{G}_{\text{avg(rating\_grade) as Average rating}} + (\sigma_{\text{drink\_id} = \text{given\_id}}(\text{user\_rates\_drink})) + \end{displaymath} + + \item + Μέσος όρος αξιολογήσεων ενός καταστήματος με κριτήριο τις δίαιτες ενός χρήστη, για κάθε δίαιτα ξεχωριστά: + \begin{align*} + _{\text{diet\_id}}\mathcal{G}_{\text{avg(rating\_grade) as Average rating}} + (&\sigma_{\text{restaurant\_id} = \text{given\_restaurant\_id}}(\text{user\_rates\_restaurant}) + \triangleright_{\theta} \\ + \Pi_{\text{diet\_id}}(&\sigma_{\text{user\_id} = \text{given\_user\_id}}(\text{user\_folows\_diet}))) + \end{align*} + + \item + Μέση βαθμολογία όλων των καταστημάτων μίας αλυσίδας, για κάθε κατάστημα ξεχωριστά: + \begin{align*} + &_{restaurant\_id}\mathcal{G}_{\text{avg(rating\_grade) as Average grade}}( \\ + &\sigma_{\text{restaurant\_name} = \text{given\_franchise\_name}}(\text{restaurant})\bowtie\text{user\_rates\_restaurant}) + \end{align*} + + \item + Δικαιώματα ενός χρήστη: + \begin{displaymath} + \sigma_{\text{user\_id} = \text{given\_id}}(\text{user})\triangleleft_{\theta}\text{role\_has\_permission}\triangleleft_{\theta}\text{permission} + \end{displaymath} + + \item + Ονόματα εστιατορίων που προσφέρουν φαγητά με θερμίδες λιγότερες από κάποιο συγκεκριμένο αριθμό: + \begin{displaymath} + \Pi_{\text{restaurant\_name}} + (\sigma_{\text{food\_calories} < \text{given\_number}}(\text{food}) \bowtie \text{restaurant}) + \end{displaymath} + +\end{enumerate} \ No newline at end of file diff --git a/Database design/TOC.tex b/Database design/TOC.tex new file mode 100644 index 0000000..67f93b1 --- /dev/null +++ b/Database design/TOC.tex @@ -0,0 +1 @@ +\tableofcontents \ No newline at end of file diff --git a/Database design/cites.bib b/Database design/cites.bib new file mode 100644 index 0000000..7111255 --- /dev/null +++ b/Database design/cites.bib @@ -0,0 +1,20 @@ +@misc{ofBool, + title = {{Μετάφραση της λέξης "Boolean" στα Ελληνικά, σύμφωνα με το WordReference.com}}, + howpublished = "\url{https://www.wordreference.com/engr/boolean}", + year = {2008}, + note = "[Τελευταία πρόσβαση; \today]" +} + +@misc{numberOfRestaurants, + title = {{Αναφορά στον εκτιμώμενο αριθμό εστιατορίων σε μεγάλες πόλεις ανά την υφήλιο σύμφωνα με το worldcitiescultureforum.com}}, + howpublished = "\url{http://www.worldcitiescultureforum.com/data/number-of-restaurants}", + year = {2018}, + note = "[Τελευταία πρόσβαση; \today]" +} + +@misc{numberOfMenuItems, + title = {{Αναφορά σε παραδείγματα από μενού καταστημάτων της Θεσσαλονίκης σύμφωνα με το e-food.gr}}, + howpublished = "\url{https://www.e-food.gr/delivery/thessaloniki}", + year = {2018}, + note = "[Τελευταία πρόσβαση; \today]" +} \ No newline at end of file diff --git a/Database design/custom_commands_and_enviroments.tex b/Database design/custom_commands_and_enviroments.tex new file mode 100644 index 0000000..7c52ee1 --- /dev/null +++ b/Database design/custom_commands_and_enviroments.tex @@ -0,0 +1,46 @@ +\newcommand{\entityTable}[6] {{ + \begin{table}[H] + \centering + \begin{tabular}{l l l} \toprule + Όνομα Οντότητας & \multicolumn{2}{p{10cm}}{\texttt{#1}} \\ + Περιγραφή & \multicolumn{2}{p{10cm}}{#2} \\ + Ιδιότητες & \multicolumn{2}{p{10cm}}{#3} \\ \midrule + \multirow[t]{#5}{*}{Γνωρίσματα} & #4 \\ \bottomrule + \end{tabular} + \caption{Περιγραφή οντότητας "#1"} + \label{entityTable:#6} + \end{table} +}} + +\newcommand{\relationTable}[8] {{ + \begin{table}[H] + \centering + \begin{tabular}{l p{10cm}} \toprule + Όνομα Συσχέτισης & \texttt{#1} \\ + Περιγραφή & #2 \\ + Ιδιότητες & #3 \\ + Λόγος πληθικότητας & #4 \\ + \multirow[t]{2}{*}{Συμμετοχή} & #5 \\ + \multirow[t]{#6}{*}{Γνωρίσματα} & #7 \\ \bottomrule + \end{tabular} + \caption{Περιγραφή συσχέτισης "#1"} + \label{relationTable:#8} + \end{table} +}} + +\newcommand{\rEntTable}[6] {{ + \begin{table}[H] + \centering + \begin{tabular}{l l} \toprule + Όνομα Σχέσης & \texttt{#1} \\ \midrule + \multicolumn{2}{l}{Γνωρίσματα:} \\ + Όνομα & Τύπος \\ + #2 \\ \midrule + \multicolumn{2}{l}{Περιορισμοί Ακεραιότητας:} \\ + Πρωτεύον κλειδί & #3 \\ + \multirow[t]{#4}{*}{Ξένα κλειδιά} & #5 \\ \bottomrule + \end{tabular} + \caption{Περιγραφή πίνακα "#1"} + \label{rEntTable:#6} + \end{table} +}} \ No newline at end of file diff --git a/Database design/front_page.tex b/Database design/front_page.tex new file mode 100644 index 0000000..2a8b21e --- /dev/null +++ b/Database design/front_page.tex @@ -0,0 +1 @@ +\maketitle diff --git a/Database design/report.tex b/Database design/report.tex new file mode 100644 index 0000000..055b6b6 --- /dev/null +++ b/Database design/report.tex @@ -0,0 +1,63 @@ +\documentclass{report} +\usepackage{geometry} +\geometry{a4paper, top=2.5cm, bottom=2.5cm, left=2.2cm,right=2.2cm} +\usepackage{fontspec} +\setmainfont{Lato} +\setmonofont[Mapping=tex-text]{Courier New} +\usepackage[nonumeralsign]{xgreek} +\usepackage{fancyhdr} +\usepackage{hyperref} +\usepackage{enumitem} +\usepackage{cite} +\usepackage{titlesec} +\usepackage{float} +\usepackage{booktabs} +\usepackage{array} +\usepackage{multirow} +\usepackage{graphicx} +\usepackage{amsmath} +%\usepackage[all]{hypcap} +%\usepackage{tikz} + +\restylefloat{table} +\hypersetup{colorlinks=true, linkcolor=black, urlcolor=blue, citecolor=blue} +\urlstyle{same} +\setlength{\parskip}{\baselineskip} +%\setlength{\parindent}{0pt} + +\input{custom_commands_and_enviroments.tex} + +\title{\large ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ \\ +\large ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ \\ +\vspace{5cm} +\includegraphics[width=\textwidth]{res/fwbLOGO}\\ +\vspace{5cm} +\large Ομάδα 13 \\ +Πρώτο παραδοτέο} +\titleformat{\chapter} + {\normalfont\LARGE\bfseries}{\thechapter}{1em}{} + +\author{Φανάκης Απόστολος, 8261, apostolof@ece.auth.gr \\ +Τσάκωνας Γεώργιος Νικόλαος, 8252, tsakonag@ece.auth.gr \\ +Παπαδιάκος Χαράλαμπος, 8302, charaldp@ece.auth.gr} +\date{\today} + +\pagestyle{fancy} +\lhead{Βάσεις Δεδομένων 2018} + +\begin{document} + +\input{front_page.tex} +\newpage +\input{TOC.tex} +\input{1.introduction/1.0.introduction.tex} +\input{2.user_categories_and_requirements/2.0.user_categories_and_requirements.tex} +\input{3.entity_relationship_model/3.0.entity_relationship_model.tex} +\input{4.relational_model/4.0.relational_model.tex} +\input{5.examples/5.0.examples.tex} + +\bibliographystyle{ieeetr} +\bibliography{cites}{} +\bibliographystyle{plain} + +\end{document} diff --git a/Database design/res/diagrams/Copy of Flavors without borders ERD.svg b/Database design/res/diagrams/Copy of Flavors without borders ERD.svg new file mode 100644 index 0000000..2d1704e --- /dev/null +++ b/Database design/res/diagrams/Copy of Flavors without borders ERD.svg @@ -0,0 +1,2 @@ + +
role
role
permission
permission
user
user
restaurant
restaurant
food
food
drink
drink
ingredient
ingredient
diet
diet
restaurant_id
<u>restaurant_id</u>
restaurant_rating
restaurant_rating
1
1
N
N
offers
offers
restaurant_reviews_number
restaurant_reviews_number
restaurant_name
restaurant_name
restaurant_working_hours
restaurant_working_hours
restaurant_coordinates
restaurant_coordinates
restaurant_category
restaurant_category
restaurant_is_approved
restaurant_is_approved
restaurant_longitude
restaurant_longitude
restaurant_latitude
restaurant_latitude
restaurant_opening
restaurant_opening
restaurant_closing
restaurant_closing
food_id
<u>food_id</u>
food_name
food_name
food_description
food_description
food_calories
food_calories
food_is_approved
food_is_approved
food_rating
food_rating
food_reviews_number
food_reviews_number
food_portion_size
food_portion_size
drink_id
<u>drink_id</u>
drink_name
<div>drink_name</div>
drink_description
drink_description
drink_is_approved
drink_is_approved
drink_rating
drink_rating
drink_reviews_number
drink_reviews_number
drink_portion_size
drink_portion_size
ingredient_name
<u>ingredient_name</u>
ingredient_has_alcohol
ingredient_has_alcohol
diet_id
<u>diet_id</u>
diet_name
<div>diet_name</div>
diet_description
diet_description
diet_is_approved
diet_is_approved
user_id
<u>user_id</u>
user_email
<div>user_email</div>
prohibits
prohibits
offers
offers
has
has
has
has
has
has
1
[Not supported by viewer]
has
has
prohibits
prohibits
follows
follows
owns
owns
1
1
N
N
1
1
1
1
M
M
N
N
M
M
N
N
M
M
N
N
N
N
M
M
N
N
user_username
<div>user_username</div>
user_hashed_password
<div>user_hashed_password</div>
user_salt
<div>user_salt</div>
user_number_of_reviews
user_number_of_reviews
permission_id
<u>permission_id</u>
permission_description
permission_description
1
1
1
1
role_id
<u>role_id</u>
role_description
role_description
role_name
<div>role_name</div>
N
N
N
N
Μ
Μ
Ν
Ν
1
1
Μ
Μ
Ν
Ν
Μ
Μ
Ν
Ν
rates
rates
rates
rates
rates
rates
rating_grade
rating_grade
rating_text
rating_text
rating_date
rating_date
rating_portion_size
rating_portion_size
rating_grade
rating_grade
rating_text
rating_text
rating_date
rating_date
rating_portion_size
rating_portion_size
rating_grade
rating_grade
rating_text
rating_text
rating_date
rating_date
\ No newline at end of file diff --git a/Database design/res/diagrams/Copy of Flavors without borders relational diagram.svg b/Database design/res/diagrams/Copy of Flavors without borders relational diagram.svg new file mode 100644 index 0000000..e88a6dc --- /dev/null +++ b/Database design/res/diagrams/Copy of Flavors without borders relational diagram.svg @@ -0,0 +1,2 @@ + +
restaurant_id
<u>restaurant_id</u>
restaurant
restaurant
restaurant_name
restaurant_name
restaurant_category
restaurant_category
restaurant_opening
restaurant_opening<br>
restaurant_longitude
restaurant_longitude
restaurant_latitude
restaurant_latitude
restaurant_closing
restaurant_closing<br>
restaurant_is_approved
restaurant_is_approved<br>
user_id
user_id
user_id
<u>user_id</u>
restaurant_id
<u>restaurant_id</u>
user_rates_restaurant
user_rates_restaurant
rating_grade
<span>rating_grade<br></span>
rating_text
<span>rating_text<br></span>
rating_date
<span>rating_date<br></span>
diet_id
diet_id
food_id
<u>food_id</u>
food_name
food_name
food_description
food_description
food
food<br>
food_calories
food_calories
food_is_approved
food_is_approved<br>
restaurant_id
restaurant_id
food_id
<u>food_id</u>
ingredient_name
<u>ingredient_name</u>
food_has_ingredient
food_has_ingredient<br>
drink_id
<u>drink_id</u>
drink_name
drink_name
drink_description
drink_description
drink
drink<br>
drink_is_approved
drink_is_approved<br>
restaurant_id
restaurant_id
drink_id
<u>drink_id</u>
ingredient_name
<u>ingredient_name</u>
drink_has_ingredient
drink_has_ingredient<br>
user_id
<u>user_id</u>
user_rates_food
user_rates_food<br>
food_id
<u>food_id</u>
rating_grade
<span>rating_grade<br></span>
rating_text
<span>rating_text<br></span>
rating_date
<span>rating_date<br></span>
rating_pοrtion_size
<span>rating_pοrtion_size<br></span>
user_id
<u>user_id</u>
drink_id
<u>drink_id</u>
user_rates_drink
user_rates_drink<br>
rating_pοrtion_size
<span>rating_pοrtion_size<br></span>
rating_date
<span>rating_date<br></span>
rating_text
<span>rating_text<br></span>
rating_grade
<span>rating_grade<br></span>
ingredient_name
<u>ingredient_name</u>
ingredient
ingredient
ingredient_has_alcohol
ingredient_has_alcohol
user_id
<u>user_id</u>
user_prohibits_ingredient
user_prohibits_ingredient
ingredient_name
<u>ingredient_name</u>
diet_id
<u>diet_id</u>
diet_prohibits_ingredient
diet_prohibits_ingredient
ingredient_name
<u>ingredient_name</u>
user_id
<u>user_id</u>
user_username
user_username
user_email
user_email
user
user<br>
user_hashed_password
user_hashed_password
user_salt
user_salt
role_id
role_id
user_id
<u>user_id</u>
user_follows_diet
user_follows_diet
diet_id
<u>diet_id</u>
diet_id
[Not supported by viewer]
diet
diet
diet_name
<span>diet</span>_name
diet_description
<span>diet</span>_description
diet_is_approved
<span>diet</span>_is_approved
role_id
<u>role_id</u>
role_name
role_name
role_description
<span>role</span>_description
role
role
role_id
<u>role_id</u>
role_has_permission
role_has_permission
permission_id
<u>permission_id</u>
permission_id
<u>permission_id</u>
permission
permission
permission_description
<span>permission</span>_description
\ No newline at end of file diff --git a/Database design/res/diagrams/ERD.pdf_tex b/Database design/res/diagrams/ERD.pdf_tex new file mode 100644 index 0000000..a528dd8 --- /dev/null +++ b/Database design/res/diagrams/ERD.pdf_tex @@ -0,0 +1,263 @@ +%% Creator: Inkscape inkscape 0.92.3, www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'res/diagrams/ERD.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{1236bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.70145631)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{res/diagrams/ERD.pdf}}% + \put(0.9214199,0.17930825){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=2]{res/diagrams/ERD.pdf}}% + \put(0.83525485,0.02639563){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}permission\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=3]{res/diagrams/ERD.pdf}}% + \put(0.58768204,0.17930825){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=4]{res/diagrams/ERD.pdf}}% + \put(0.79945388,0.43841019){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=5]{res/diagrams/ERD.pdf}}% + \put(0.40625,0.54277913){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=6]{res/diagrams/ERD.pdf}}% + \put(0.19265777,0.47481796){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=7]{res/diagrams/ERD.pdf}}% + \put(0.19265777,0.22785194){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}ingredient\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=8]{res/diagrams/ERD.pdf}}% + \put(0.30248786,0.14775485){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=9]{res/diagrams/ERD.pdf}}% + \put(0.68476942,0.51061893){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{restaurant\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=10]{res/diagrams/ERD.pdf}}% + \put(0.93294903,0.50394417){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_rating\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=11]{res/diagrams/ERD.pdf}}% + \put(0.62408981,0.47967233){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=12]{res/diagrams/ERD.pdf}}% + \put(0.47299757,0.53246359){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=13]{res/diagrams/ERD.pdf}}% + \put(0.5306432,0.52032767){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}offers\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=14]{res/diagrams/ERD.pdf}}% + \put(0.92991505,0.46753641){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_reviews\_number\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=15]{res/diagrams/ERD.pdf}}% + \put(0.6871966,0.55491505){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=16]{res/diagrams/ERD.pdf}}% + \put(0.82372573,0.62105583){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_working\_hours\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=17]{res/diagrams/ERD.pdf}}% + \put(0.70115291,0.60163835){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_coordinates\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=18]{res/diagrams/ERD.pdf}}% + \put(0.8910801,0.58950243){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_category\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=19]{res/diagrams/ERD.pdf}}% + \put(0.93294903,0.53731796){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=20]{res/diagrams/ERD.pdf}}% + \put(0.65078883,0.64775485){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_longitude\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=21]{res/diagrams/ERD.pdf}}% + \put(0.75151699,0.66231796){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_latitude\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=22]{res/diagrams/ERD.pdf}}% + \put(0.84739078,0.68416262){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_opening\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=23]{res/diagrams/ERD.pdf}}% + \put(0.93355583,0.66231796){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_closing\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=24]{res/diagrams/ERD.pdf}}% + \put(0.3121966,0.58464806){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{food\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=25]{res/diagrams/ERD.pdf}}% + \put(0.32493932,0.61377427){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=26]{res/diagrams/ERD.pdf}}% + \put(0.32675971,0.64411408){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_description\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=27]{res/diagrams/ERD.pdf}}% + \put(0.36923544,0.67445388){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_calories\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=28]{res/diagrams/ERD.pdf}}% + \put(0.46571602,0.68598301){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=29]{res/diagrams/ERD.pdf}}% + \put(0.51729369,0.65928398){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_rating\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=30]{res/diagrams/ERD.pdf}}% + \put(0.55006068,0.62287621){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_reviews\_number\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=31]{res/diagrams/ERD.pdf}}% + \put(0.54824029,0.59010922){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_portion\_size\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=32]{res/diagrams/ERD.pdf}}% + \put(0.10042476,0.51001214){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{drink\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=33]{res/diagrams/ERD.pdf}}% + \put(0.06523058,0.54581311){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=34]{res/diagrams/ERD.pdf}}% + \put(0.05188107,0.5773665){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_description\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=35]{res/diagrams/ERD.pdf}}% + \put(0.08222087,0.61680825){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=36]{res/diagrams/ERD.pdf}}% + \put(0.15260922,0.64411408){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_rating\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=37]{res/diagrams/ERD.pdf}}% + \put(0.22542476,0.61438107){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_reviews\_number\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=38]{res/diagrams/ERD.pdf}}% + \put(0.28489078,0.55734223){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_portion\_size\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=39]{res/diagrams/ERD.pdf}}% + \put(0.0779733,0.25394417){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{ingredient\_name}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=40]{res/diagrams/ERD.pdf}}% + \put(0.06583738,0.21268204){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}ingredient\_has\_alcohol\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=41]{res/diagrams/ERD.pdf}}% + \put(0.17809466,0.09921117){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{diet\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=42]{res/diagrams/ERD.pdf}}% + \put(0.21146845,0.07493932){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=43]{res/diagrams/ERD.pdf}}% + \put(0.28246359,0.05612864){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_description\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=44]{res/diagrams/ERD.pdf}}% + \put(0.35406553,0.08100728){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=45]{res/diagrams/ERD.pdf}}% + \put(0.48149272,0.10831311){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{user\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=46]{res/diagrams/ERD.pdf}}% + \put(0.49423544,0.07493932){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_email\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=47]{res/diagrams/ERD.pdf}}% + \put(0.19265777,0.14775485){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}prohibits\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=48]{res/diagrams/ERD.pdf}}% + \put(0.5306432,0.43841019){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}offers\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=49]{res/diagrams/ERD.pdf}}% + \put(0.9214199,0.08100728){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}has\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=50]{res/diagrams/ERD.pdf}}% + \put(0.25637136,0.38865291){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}has\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=51]{res/diagrams/ERD.pdf}}% + \put(0.19265777,0.38865291){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}has\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=52]{res/diagrams/ERD.pdf}}% + \put(0.6878034,0.17930825){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}M\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=53]{res/diagrams/ERD.pdf}}% + \put(0.77760922,0.17930825){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}has\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=54]{res/diagrams/ERD.pdf}}% + \put(0.41777913,0.22785194){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}prohibits\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=55]{res/diagrams/ERD.pdf}}% + \put(0.41777913,0.14775485){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}follows\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=56]{res/diagrams/ERD.pdf}}% + \put(0.86620146,0.36559466){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}owns\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=57]{res/diagrams/ERD.pdf}}% + \put(0.69872573,0.4378034){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=58]{res/diagrams/ERD.pdf}}% + \put(0.28489078,0.48331311){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=59]{res/diagrams/ERD.pdf}}% + \put(0.19326456,0.43537621){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=60]{res/diagrams/ERD.pdf}}% + \put(0.32615291,0.50212379){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=61]{res/diagrams/ERD.pdf}}% + \put(0.24362864,0.14775485){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}M\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=62]{res/diagrams/ERD.pdf}}% + \put(0.19265777,0.19205097){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=63]{res/diagrams/ERD.pdf}}% + \put(0.48998786,0.16535194){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}M\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=64]{res/diagrams/ERD.pdf}}% + \put(0.36498786,0.14775485){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=65]{res/diagrams/ERD.pdf}}% + \put(0.49059466,0.20661408){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}M\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=66]{res/diagrams/ERD.pdf}}% + \put(0.27336165,0.22785194){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=67]{res/diagrams/ERD.pdf}}% + \put(0.84496359,0.17930825){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=68]{res/diagrams/ERD.pdf}}% + \put(0.9214199,0.13379854){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}M\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=69]{res/diagrams/ERD.pdf}}% + \put(0.90989078,0.02518204){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=70]{res/diagrams/ERD.pdf}}% + \put(0.5476335,0.05066748){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_username\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=71]{res/diagrams/ERD.pdf}}% + \put(0.62894417,0.06887136){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_hashed\_password\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=72]{res/diagrams/ERD.pdf}}% + \put(0.68294903,0.09617718){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_salt\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=73]{res/diagrams/ERD.pdf}}% + \put(0.71268204,0.12955097){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_number\_of\_reviews\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=74]{res/diagrams/ERD.pdf}}% + \put(0.72845874,0.04399272){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{permission\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=75]{res/diagrams/ERD.pdf}}% + \put(0.71632282,0.00879854){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}permission\_description\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=76]{res/diagrams/ERD.pdf}}% + \put(0.86620146,0.41231796){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=77]{res/diagrams/ERD.pdf}}% + \put(0.78974515,0.21086165){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=78]{res/diagrams/ERD.pdf}}% + \put(0.89532767,0.23027913){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{role\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=79]{res/diagrams/ERD.pdf}}% + \put(0.95782767,0.29035194){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\_description\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=80]{res/diagrams/ERD.pdf}}% + \put(0.90442961,0.26061893){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=81]{res/diagrams/ERD.pdf}}% + \put(0.19326456,0.32251214){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=82]{res/diagrams/ERD.pdf}}% + \put(0.23816748,0.30370146){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}N\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=83]{res/diagrams/ERD.pdf}}% + \put(0.75758495,0.22178398){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Μ\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=84]{res/diagrams/ERD.pdf}}% + \put(0.79945388,0.36498786){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Ν\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=85]{res/diagrams/ERD.pdf}}% + \put(0.40260922,0.25879854){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=86]{res/diagrams/ERD.pdf}}% + \put(0.48695388,0.30066748){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Μ\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=87]{res/diagrams/ERD.pdf}}% + \put(0.48756068,0.47845874){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Ν\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=88]{res/diagrams/ERD.pdf}}% + \put(0.40382282,0.27214806){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Μ\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=89]{res/diagrams/ERD.pdf}}% + \put(0.30248786,0.46510922){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Ν\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=90]{res/diagrams/ERD.pdf}}% + \put(0.31826456,0.38865291){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rates\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=91]{res/diagrams/ERD.pdf}}% + \put(0.48756068,0.38865291){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rates\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=92]{res/diagrams/ERD.pdf}}% + \put(0.75758495,0.26001214){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rates\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=93]{res/diagrams/ERD.pdf}}% + \put(0.38743932,0.44508495){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_grade\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=94]{res/diagrams/ERD.pdf}}% + \put(0.42081311,0.4056432){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_text\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=95]{res/diagrams/ERD.pdf}}% + \put(0.42930825,0.36134709){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_date\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=96]{res/diagrams/ERD.pdf}}% + \put(0.39654126,0.31462379){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_portion\_size\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=97]{res/diagrams/ERD.pdf}}% + \put(0.6089199,0.41777913){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_grade\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=98]{res/diagrams/ERD.pdf}}% + \put(0.62651699,0.37773058){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_text\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=99]{res/diagrams/ERD.pdf}}% + \put(0.60527913,0.34010922){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_date\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=100]{res/diagrams/ERD.pdf}}% + \put(0.55734223,0.31158981){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_portion\_size\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=101]{res/diagrams/ERD.pdf}}% + \put(0.66595874,0.29945388){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_grade\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=102]{res/diagrams/ERD.pdf}}% + \put(0.75212379,0.36438107){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_text\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=103]{res/diagrams/ERD.pdf}}% + \put(0.68962379,0.33404126){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_date\end{tabular}}}}% + \end{picture}% +\endgroup% diff --git a/Database design/res/diagrams/Relational_Diagram.pdf_tex b/Database design/res/diagrams/Relational_Diagram.pdf_tex new file mode 100644 index 0000000..029d077 --- /dev/null +++ b/Database design/res/diagrams/Relational_Diagram.pdf_tex @@ -0,0 +1,209 @@ +%% Creator: Inkscape inkscape 0.92.3, www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'res/diagrams/Relational_Diagram.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{592.125bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,1.34497209)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.14692844,1.30968968){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{restaurant\_id}\end{tabular}}}}% + \put(0.12919569,1.33628879){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=2]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.30778974,1.30968968){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=3]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.49525016,1.30968968){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_category\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=4]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.39138695,1.27802407){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_opening\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=5]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.70044332,1.30968968){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_longitude\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=6]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.90436985,1.30968968){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_latitude\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=7]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.58771374,1.27802407){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_closing\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=8]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.8030399,1.27802407){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=9]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.96136795,1.27802407){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_id\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=10]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11652945,1.18556048){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{user\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=11]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.23052565,1.18556048){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{restaurant\_id}\end{tabular}}}}% + \put(0.18366054,1.21215959){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_rates\_restaurant\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=12]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.36985434,1.18556048){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_grade\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=13]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.49778341,1.18556048){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_text\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=14]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.61684611,1.18556048){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_date\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=15]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.71564281,1.18556048){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_id\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=16]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11526282,1.10069664){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{food\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=17]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.20772641,1.10069664){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=18]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.34452185,1.10069664){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_description\end{tabular}}}}% + \put(0.10006333,1.12729576){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=19]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.50284991,1.10069664){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_calories\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=20]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.66244459,1.10069664){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=21]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.82077264,1.10069664){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_id\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=22]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.12286257,1.01709943){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{food\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=23]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.25585814,1.01709943){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{ingredient\_name}\end{tabular}}}}% + \put(0.17479417,1.04369854){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}food\_has\_ingredient\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=24]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.12286257,0.93223559){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{drink\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=25]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.2229259,0.93223559){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=26]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.37112096,0.93223559){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_description\end{tabular}}}}% + \put(0.10512983,0.95883471){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=27]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.55478151,0.93223559){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=28]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.71817606,0.93223559){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}restaurant\_id\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=29]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.12159595,0.84863838){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{drink\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=30]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.25712476,0.84863838){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{ingredient\_name}\end{tabular}}}}% + \put(0.17859405,0.87523749){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}drink\_has\_ingredient\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=31]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11526282,0.76377454){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{user\_id}\end{tabular}}}}% + \put(0.15452818,0.79037365){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_rates\_food\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=32]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.19886004,0.76377454){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{food\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=33]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.30652312,0.76377454){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_grade\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=34]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.43318556,0.76377454){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_text\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=35]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.55478151,0.76377454){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_date\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=36]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.71437619,0.76377454){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_pοrtion\_size\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=37]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11526282,0.68017733){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{user\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=38]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.20519316,0.68017733){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{drink\_id}\end{tabular}}}}% + \put(0.15959468,0.70677644){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_rates\_drink\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=39]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.73717543,0.68017733){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_pοrtion\_size\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=40]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.57124763,0.68017733){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_date\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=41]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.44838505,0.68017733){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_text\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=42]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.31792274,0.68017733){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}rating\_grade\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=43]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.15832806,0.59531349){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{ingredient\_name}\end{tabular}}}}% + \put(0.12919569,0.6219126){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}ingredient\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=44]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.35718809,0.59531349){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}ingredient\_has\_alcohol\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=45]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11652945,0.51171628){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{user\_id}\end{tabular}}}}% + \put(0.20392654,0.53831539){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_prohibits\_ingredient\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=46]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.24445852,0.51171628){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{ingredient\_name}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=47]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.70170994,0.25965801){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{diet\_id}\end{tabular}}}}% + \put(0.79037365,0.28625712){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_prohibits\_ingredient\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=48]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.82837239,0.25965801){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{ingredient\_name}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=49]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11652945,0.42685244){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{user\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=50]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.33818873,0.42685244){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_username\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=51]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.21025966,0.42685244){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_email\end{tabular}}}}% + \put(0.10006333,0.45345155){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=52]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.51551615,0.42685244){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_hashed\_password\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=53]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.67131096,0.42685244){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_salt\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=54]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.76250792,0.42685244){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\_id\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=55]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11652945,0.34325522){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{user\_id}\end{tabular}}}}% + \put(0.16466118,0.36985434){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}user\_follows\_diet\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=56]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.19886004,0.34325522){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{diet\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=57]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.11652945,0.25965801){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_id\end{tabular}}}}% + \put(0.10006333,0.28625712){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=58]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.21025966,0.25965801){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=59]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.35085497,0.25965801){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_description\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=60]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.52184927,0.25965801){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}diet\_is\_approved\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=61]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.12159595,0.17479417){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{role\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=62]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.2229259,0.17479417){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\_name\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=63]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.36225459,0.17479417){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\_description\end{tabular}}}}% + \put(0.10006333,0.20139329){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=64]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.12286257,0.09119696){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{role\_id}\end{tabular}}}}% + \put(0.17479417,0.11779607){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}role\_has\_permission\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=65]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.24319189,0.09119696){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{permission\_id}\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=66]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.14692844,0.00633312){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}\underline{permission\_id}\end{tabular}}}}% + \put(0.12919569,0.03293224){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}permission\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=67]{res/diagrams/Relational_Diagram.pdf}}% + \put(0.3369221,0.00633312){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}permission\_description\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=68]{res/diagrams/Relational_Diagram.pdf}}% + \end{picture}% +\endgroup% diff --git a/Database design/res/fwbLOGO.png b/Database design/res/fwbLOGO.png new file mode 100644 index 0000000000000000000000000000000000000000..4443a7857ded59fe9ab1044650f5f8e5cab0b122 GIT binary patch literal 18037 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 E09E^&BLDyZ literal 0 HcmV?d00001