Βάσεις Δεδομένων [SQL]

Theory Notes


Lab Notes


Αρχές του Σχεσιακού Μοντέλου (Relational Model)


Βασική Δομή

Ο πίνακας (table) είναι δύο διαστάσεων και περιέχει γραμμές (rows) και στήλες (columns).

Ο πίνακας ονομάζεται και σχέση (relation) γιατί ο δημιουργός του μοντέλου το ανέφεραι έτσι. Μπορούμε να σκεφτούμε τον πίνακα ως μία σχέση όπου τα περιεχόμενα της αποθηκεύονται μόνιμα για μελλοντική χρήση.

Χαρακτηριστικά ενός Relational Table:

Νο. Χαρακτηριστικά
1 Ο πίνακας είναι δύο διαστάσεων που αποτελείται από γραμμές και στήλες
2 Κάθε γραμμή (tuple) αντιπροσωπεύει ένα single entity.
3 Κάθε στήλη αντιπροσωπεύει ένα χαρακτηριστικό και έχει μοναδικό όνομα.
4 Κάθε κελί του πίνακα αντιπροσωπεύει μία τιμή (data value).
5 Όλες οι τιμές σε μίας στήλης πρέπει να είναι ιδίου τύπου.
6 Κάθε στήλη έχει ένα συγκεκριμένο πεδίο τιμών που ονομάζεται attribute domain.
7 Σε ένα DBMS η σειρά των γραμμών και των στηλών δεν έχουν σημασία. Μόνο για εμάς έχουν.
8 Κάθε πίνακας πρέπει να έχει ένα χαρακτηριστικό ή έναν συνδυασμό χαρακτηριστικών που προσδιορίζουν μοναδικά κάθε σειρά.


Όνομα Πίνακα: STUDENT

ΑΜ LNAME FNAME DOB HRS GPA TRANSFER DEPART PHONE
P20022 Σ Γιάννης 12-Feb-2002 15 6.2 False CS 6985714125
P19212 Ν Μαρία 16-Jan-2001 16 5.1 False CS 6944531954
P17201 Τ Θανάσης 21-Apr-1999 12 6.5 False CS 6942647248
P17056 Γ Νίκος 04-Nov-1998 24 7.5 False BIO 6986288458
P15134 Μ Ιάσονας 07-Dec-1994 39 5.0 False CS 6947856012

ΑΜ = αριθμός μητρώου

LNAME = επίθετο

FNAME = όνομα

DOB = ημερομηνία γέννησης

HRS = ώρες παρακολούθησης

GPA = μέσος όρος

TRANSFER = μετεγγραφή

DEPART = τμήμα

PHONE = αριθμός τηλεφώνου


Από το από πάνω παράδειγμα παρατηρούμε τα εξής:

  1. Ο πίνακας STUDENT είναι δύο διαστάσεων και έχει (5)γραμμές και (9)στήλες.

  2. Κάθε γραμμή στον STUDENT αντιπροσωπεύει ένα single entity.

  3. Κάθε στήλη του πίνακα αντιπροσωπεύει ένα χαρακτηριστικό και έχει μοναδικό όνομα.

  4. Κάθε στήλη είναι ιδίου τύπου. Πχ η όλες οι τιμές στην στήλη HRS είναι αριθμητικές.



Κλειδιά

Στο relation model τα κλειδιά είναι σημαντικά καθώς χρησιμοποιούνται για είμαστε βέβαιοι ότι κάθε γραμμή του πίνακα μπορεί να ταυτοποιηθεί μοναδικά.

Επίσης χρησιμοποιούνται ώστε να καθιερώσουμε σχέσεις μεταξύ πινάκων.

Ένα κλειδί αποτελείται από ένα ή περισσότερα χαρακτηριστικά. Στον δικό μας πίνακα το κλειδί μας είναι το ΑΜ.

Ο ρόλος του κλειδιού είναι βασισμένος στο consept του determination. Determination είναι η κατάσταση στην οποία, η τιμή ενός χαρακτηριστικού κάνει δυνατή την αναγνώριση των τιμών άλλων χαρακτηριστικών.

Πχ Αν δούμε τα χαρακτηριστικά (δλδ τις στήλες) του πίνακα STUDENT μπορούμε να βρούμε την σχέση μεταξύ των χαρακτηριστικών.

Για μία τιμή του ΑΜ αντιστοιχεί μία συγκεκριμένη τιμή του FNAME.

Άρα αν δωθεί μία τιμή ΑΜ μπορούμε με άνεσει να βρούμε όλα τα χαρακτηριστικά που συνδέονται με αυτόν τον αριθμό.

Αυτή η σχέση ονομάζεται functional dependence το οποίο σημαίνει ότι η τιμή ενός ή παραπάνω χαρακτηριστικών καθορίζει την τιμή ενός ή πολλών άλλων χαρακτηριστικών.



Τύποι κλειδιών

Υπάρχουν διάφορα κλειδιά στο relational model και πρέπει να τα γνωρίζουμε όλα.

Composite key είναι το κλειδί που αποτελείται από ένα ή περισσότερα χαρακτηριστικά.

Super Key: είναι το κλειδί που μπορεί να προσδιορίζει μοναδικά κάθε γραμμή του πίνακα.

Στον πίνακα Student το ΑΜ είναι το super key.

Canditate key: είναι ένας ειδικός τύπος super key. Στην ουσία είναι ένα super key αλλά χωρίς περιττά χαρακτηριστικά.

Για παράδειγμα στον πίνακα Student το ΑΜ είναι ένα candidate key. Αντιθέτως ο συνδυασμός (AM, LNAME) είναι απλώς super key και όχι candidate key. Αυτό γιατί αν βγάλουμε το LNAME έχουμε ακόμα ένα super key.

Ονομάζονται candidate keys γιατί μας δίνουν την δυνατότητα να τα επιλέξουμε ως primary keys.

Τα primary keys έχουν κάποιες προυποθέσεις:

  1. Όλες οι τιμές στο primary key πρέπει να είναι μοναδικές
  2. Κανένα χαρακτηριστικό δεν μπορεί να περιέχει null

Σημείωση: Το null σημαίνει καμία τιμή, δεν σημαίνει μηδέν. Το null είναι προβληματικό στο relational model και γενικά θα ήταν σωστό να μην υπάρχει ούτε ένα στην Βάση μας.

Foreign Key: είναι το primary key ενός πίνακα που έχει τοποθετηθεί σε έναν άλλο πίνακα για τη δημιουργία ενός κοινού χαρακτηριστικού.

Secondary key: το κλειδί αυτό δημιουργήθηκε με μοναδικό σκοπό την ανάκτηση δεδομένων.


Σχέσεις στο Relational Model

Υπάρχουν διάφορες σχέσεις μέσα σε ένα Relational Model όπως:

  • 1:Π (ένα προς πολλά)
  • 1:1 (ένα προς ένα)
  • Π:Π (πολλά προς πολλά)

Σχέση 1:Π

Αυτή είναι η πιο γνωστή σχέση για τα relational models.

ΑΜ PROGRAMMER_LNAME PROGRAMMER_FNAME
145 Π Γιώργος
187 Σ Χάρης
196 Σ Δημήτρης

Table Name: Programmer

Primary Key: AM

Foreign Key: None


ΑΜ PROGRAMMING_LANGUAGE PROGRAM_NAME PROGRAM_NUM
145 C++ Dnote 0056
187 Java JCore 0084
187 Java JEngine 0097
196 LUA LuaJitMini 0125

Table Name: Program

Primary Key: PROGRAM_NUM

Foreign Key: ΑΜ

Παρατηρούμε δύο πράγματα:

  • Κάθε πρόγραμμα δημιουργήθηκε από έναν προγραμματιστή αλλά ένας προγραμματιστής μπορεί να έχει φτιάξει πάνω από ένα πρόγραμμα.

  • Υπάρχει μόνο μία γραμμή του πίνακα Programmer για οποιαδήποτε γραμμή του πίνακα Program αλλά μπορεί να υπάρχουν πολλές γραμμές για οποιαδήποτε γραμμή του πίνακα Programmer.


Σχέση 1:1

Σε αυτή την περίπτωση, ένα entity μπορεί να σχετίζεται με μόνο ένα άλλο entity. Αν και είναι σπάνιες περιπτώσεις είναι αναπόφευκτες ορισμένες φορές.



Δημιουργία μιας Database

Γενικά στον σχεδιασμό μίας Βάσεις Δεδομένων έχουμε 3 βασικά βήματα τα οποία πρέπει να ακολουθήσουμε:

  1. Αποφασίζουμε ποιά αντικείμενα θέλουμε να συμπεριλάβουμε στην Βάση μας.
  2. Προσδιορίζουμε ποιά από αυτά τα αντικείμενα θα πρέπει να είναι πίνακες και ποιά απλές στήλες.
  3. Ορίζουμε τους πίνακες μας σύμφωνα με το πως πρέπει να οργανώσουμε τα αντικείμενα μας.


Normalization

To Normalization είναι μια διαδικασία αξιολόγησης και διόρθωσης των δομών των πινάκων για την ελαχιστοποίηση των πλεονασμών δεδομένων, μειώνοντας έτσι την πιθανότητα των δεδομένων ανωμαλιών.

Η κανονικοποίηση λειτουργεί μέσω μιας σειράς σταδίων που ονομάζονται κανονικές μορφές.

  • First Normal Form (1NF)
  • Second Normal Form (2NF)
  • Third Normal Form (3NF)
  • Boyce Codd Normal Form (BCNF)
  • Fourth Normal Form (4NF)
  • Fifth Normal Form (5NF)
  • Sixth Normal Form (6NF)

Γενικά ισχύει ότι το 2NF είναι καλύτερο από το 1NF και ότι το 3NF είναι καλύτερο από το 2NF.

Παρόλα αυτά αν και η κανονικοποίηση είναι πολύ σημαντική για το design της βάσης μας, δεν πρέπει να νομίζουμε ότι πάντα πρέπει να πετύχουμε το υψηλότερο επίπεδο NF.

Επίσης πολύ σπάνια αρχίζουμε το design της βάσης μας με την χρήση μόνο της κανονικοποίησης. Ο κύριος ρόλος της κανονικοποίησης είναι να διορθώσει ανωμαλίες των δεδομένων.

Υπάρχουν πολλές ανωμαλίες τις οποίες δεν σκεφτόμαστε την ωρα της δημιουργίας ενός πίνακα στην βαση μας οι οποίες επηρεάζουν αρνητικά την δομή της βάσης μας.

Μερικά παραδείγματα:

Εστω οτι έχουμε μια Βάση η οποία περιλαμβάνει τον ακόλουθο πίνακα:

id First_Name Last_Name Project_Name Project_Description
457 Αναστασία Χ BK13 Design new database model
458 Γιάννης Γ NM43 Improve UI of app
459 Πάρης Β BK13 Design new database model

Insertion Anomalies

Αυτό συμβαίνει όταν δεν μπορούμε να προσθέσουμε νέα δεδομένα γιατί μας λείπουν κάποια στοιχεία.

Στον πίνακα μας δεν μπορούμε να προσθέσουμε νεο άτομο εάν δεν έχει κάποιο Project. Όταν προσλάβουμε νέο άτομο στην επιχείρηση μας δεν θα έχει ακόμα κάποιο Project να δουλέψει. Οπότε δεν μπορεί να μπει και στην βάση μας.

Update Anomalies

Αυτό συμβαίνει όταν έχουμε δεδομένα τα οποία ειναι αποθηκευμένα σε πάνω απο ενα μέρος

Deletion Anomalies

Αυτό συμβαίνει όταν με διαγραφη δεδομένων διαγράφονται κι άλλα δεδομένα.

Αν για παράδειγμα ο Γιάννης έφευγε απο την εταιρία και τον διαγράφαμε, θα διαγράφαμε μαζί και το Project στο οποίο δούλευε.

Για να αποφυγουμε αυτές τις ανωμαλίες χρησιμοποιούμε τα Normal Forms.

Σημείωση: Τα πρωτα τρεία NF ειναι τα σημαντικά για να έχουμε μια σωστη ως προς την λειτουργία Βάση Δεδομένων.