TEC610 Δυναμικές Εφαρμογές Διαδικτύου (ΣΤ εξάμηνο) Διδάσκων: Ανδρέας Γιαννακουλόπουλος Εαρινό εξάμηνο
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ιόνιο Πανεπιστήμιο» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 1
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons 2
Προχωρημένη SQL & MySQL 2
Στο κεφάλαιο αυτό θα δούμε πιο αναλυτικά τη σχεδίαση βάσεων δεδομένων, χρησιμοποιώντας ως παράδειγμα έναν πίνακα ανακοινώσεων. Εξελιγμένες βάσεις δεδομένων, όπως ένα φόρουμ, απαιτούν ερωτήματα SQL που ονομάζονται ενώσεις (joins), και θα τα εξετάσουμε σε αυτό το κεφάλαιο. Επίσης θα δούμε μια ειδική κατηγορία συναρτήσεων οι οποίες χρησιμοποιούνται για την ομαδοποίηση των αποτελεσμάτων των ερωτημάτων. Τέλος θα δούμε κάποιες προχωρημένες έννοιες της MySQL όπως: ευρετήρια, αλλαγή της δομής των υπαρχόντων πινάκων, αναζητήσεις πλήρους κειμένου και συναλλαγές (transactions). 3
1. Σχεδίαση Βάσεων Δεδομένων Το πρώτο πράγμα για τη δημιουργία και τη χρήση μιας βάσης δεδομένων είναι να καθορίσετε τη δομή της (που ονομάζεται και σχήμα, schema). Η σχεδίαση μιας βάσης δεδομένων, η οποία λέγεται και μοντελοποίηση δεδομένων (data modeling), είναι κρίσιμη για την επιτυχημένη μακροπρόθεσμη διαχείριση των πληροφοριών. Με τη διαδικασία της κανονικοποίησης (normalization), εξαλείφετε προσεκτικά τους πλεονασμούς και άλλα προβλήματα που υπονομεύουν την ακεραιότητα της βάσης σας. 4
1.1 Κανονικοποίηση Σχεσιακή βάση δεδομένων είναι μια συλλογή δεδομένων οργανωμένων με συγκεκριμένο τρόπο. Ο Δρ. Codd δημιούργησε μια σειρά κανόνων, τις κανονικές μορφές (normal forms) που μας βοηθούν να οργανώνουμε τα δεδομένα μας. Πριν την κανονικοποίηση της βάσης πρέπει να οριστεί ο σκοπός της εφαρμογής που θα αναπτύξετε. Η κατανόηση του τρόπου προσπέλασης των δεδομένων καθορίζει τη μοντελοποίηση. Στο παράδειγμα που θα ακολουθήσει θα φτιάξουμε έναν πίνακα ανακοινώσεων όπου οι χρήστες θα στέλνουν μηνύματα και άλλοι χρήστες θα απαντούν. 5
Η βάση δεδομένων του παραδείγματος θα έχει όνομα forum. Στον πίνακα που ακολουθεί μπορείτε να δείτε ένα δείγμα γραμμής δεδομένων. 6
1.2 Κλειδιά Υπάρχουν δυο είδη κλειδιών: το πρωτεύον (primary) και το ξένο (foreign). Πρωτεύον κλειδί είναι ένα μοναδικό αναγνωριστικό που πρέπει να ακολουθεί τους παρακάτω κανόνες: Έχει πάντα τιμή (δεν μπορεί να είναι NULL) Η τιμή του δεν αλλάζει ποτέ Έχει μοναδική τιμή για κάθε εγγραφή του πίνακα Το καλύτερο πραγματικό παράδειγμα για το πρωτεύον κλειδί είναι το ΑΦΜ (δεν αλλάζει ποτέ και χαρακτηρίζει μοναδικά κάθε φυσικό πρόσωπο). Όταν σχεδιάζετε τη βάση μπορείτε να ορίσετε ένα αυθαίρετο πρωτεύον κλειδί για κάθε πίνακα. 7
Το ξένο κλειδί είναι ένα πεδίο πίνακα, ίδιο με το πρωτεύον κλειδί ενός άλλου πίνακα. Το ξένο και το πρωτεύον κλειδί συνδέουν τους δυο πίνακες μεταξύ τους. Το πρωτεύον κλειδί του πίνακα διευκολύνει την αναφορά στις εγγραφές του πίνακα. 8
Για να ορίσετε το πρωτεύον κλειδί στη βάση δεδομένων forum πρέπει να βρείτε ένα πεδίο που να πληροί τις 3 απαιτήσεις του πρωτεύοντος κλειδιού. Κανένα από τα πεδία δεν είναι κατάλληλο άρα δημιουργούμε ένα εμείς. Εδώ προσθέσαμε το πεδίο message ID. Ένα πρωτεύον κλειδί που δεν έχει άλλη σημασία ή σκοπό λέγεται αναπληρωματικό ή εναλλακτικό (surrogate) κλειδί. 9
1.3 Σχέσεις Στις βάσεις δεδομένων οι σχέσεις αναφέρονται στον τρόπο σύνδεσης των δεδομένων ενός πίνακα με τα δεδομένα ενός άλλου. Υπάρχουν 3 είδη σχέσεων μεταξύ δυο πινάκων: Αμφιμονοσήμαντη ή ένα προς ένα (one-to-one): ένα μοναδικό στοιχείο του πίνακα Α αντιστοιχεί σε ένα μοναδικό στοιχείο του πίνακα Β. Μονοσήμαντη ή ένα προς πολλά (one-to-many): ένα στοιχείο του πίνακα Α μπορεί να αντιστοιχεί σε πολλά στοιχεία του πίνακα Β. (η πιο συνηθισμένη) Πολυσήμαντη ή πολλά προς πολλά (many-to-many): πολλά στοιχεία του πίνακα Α αντιστοιχούν σε πολλά στοιχεία του πίνακα Β. 10
Οι σχέσεις και τα κλειδιά συνεργάζονται, κατά το ότι ένα κλειδί ενός πίνακα είναι συσχετισμένο με ένα κλειδί κάποιου άλλου. 11
1.4 Πρώτη Κανονική Μορφή Κανονικοιποίηση είναι η διαδικασία προσαρμογής της δομής μιας βάσης δεδομένων σύμφωνα με κάποιους κανόνες, τις μορφές. Η βάση δεδομένων σας θα πρέπει να ακολουθεί κάθε κανόνα πιστά και τις μορφές με τη σειρά. Για να συμφωνεί η βάση δεδομένων με την Πρώτη Κανονική Μορφή (First Normal Form 1NF) κάθε πίνακς πρέπει να έχει τις εξής ιδιότητες: 1. Κάθε στήλη πρέπει να έχει μόνο μια τιμή 2. Κανένας πίνακας δε μπορεί να περιέχει επαναλαμβανόμενες ομάδες σχετικών μεταξύ τους δεδομένων. 12
Για να κάνετε μια βάση δεδομένων συμβατή με 1NF πρέπει: 1. Να εντοπίσετε τα πεδία που περιέχουν πολλές μονάδες πληροφοριών, όπως το πεδίο στο παράδειγμα του forum με το όνομα actual name. 2. Διαιρέστε κάθε πεδίο σε ξεχωριστά πεδία, το πεδίο actual name διαιρέθηκε σε first name και last name κάθε ένα από τα οποία περιέχει μόνο μια τιμή. 3. Μετατρέψτε τις επαναλαμβανόμενες στήλες σε ξεχωριστό πίνακα. 4. Ελέγξτε ξανά αν όλες οι στήλες και οι πίνακες που δημιουργήσαμε είναι συμβατοί με την Πρώτη Κανονική Μορφή. 13
Ο πίνακας movies παραβιάζει τον πρώτο κανόνα 1NF γιατί περιέχει επαναλαμβανόμενες στήλες ίδιων δεδομένων (actor 1, actor 2) και επίσης οι στήλες ηθοποιών (actor) και σκηνοθετών (director) δεν είναι ατομικές. 14
Για να γίνει ο πίνακας ταινιών συμβατός με τη μορφή 1NF η συσχέτιση ηθοποιών με μια ταινία θα γίνεται σε αυτόν τον πίνακα. 15
1.5 Δεύτερη Κανονική Μορφή Για να είναι μια βάση δεδομένων στη Δεύτερη Κανονική Μορφή (2NF) πρέπει πρώτα να είναι ήδη στην 1NF. Στη συνέχεια κάθε στήλη του πίνακα που δεν είναι κλειδί πρέπει να εξαρτάται από πρωτεύον κλειδί. Οι στήλες που παραβαίνουν αυτόν τον κανόνα έχουν ίδιες τιμές σε πολλές γραμμές. Αυτές οι τιμές πρέπει να αποθηκευτούν σε δικό τους πίνακα και να συνδεθούν με τον αρχικό μέσω ενός κλειδιού. Για να γίνουν πιο κατανοητά όλα τα παραπάνω επιστρέφουμε στα προηγούμενα παραδείγματα. 16
Ο πίνακας movies θα περιέχει το σκηνοθέτη Martin Scorsese περισσότερες από 20 φορές. Έτσι καταστρατηγείται ο κανόνας 2NF επειδή η στήλη με το όνομα του σκηνοθέτη δεν αποτελεί κλειδί και δεν εξαρτάται από το πρωτεύον κλειδί (τον κωδικό της ταινίας). Λύση αποτελεί η δημιουργία ενός ξεχωριστού πίνακα σκηνοθετών (directors) που θα περιέχει τις πληροφορίες για τους σκηνοθέτες και θα αναθέτει ένα πρωτεύον κλειδί σε κάθε σκηνοθέτη. Για να συσχετίσουμε τους 2 πίνακες θα προσθέσουμε το πρωτεύον κλειδί του πίνακα directors ως ξένο κλειδί στον πίνακα movies. 17
Στον πίνακα movies-actors ο τίτλος της ταινίας και τα ονόματα των ηθοποιών καταστρατηγούν τον κανόνα 2NF (δεν είναι κλειδιά και δεν εξαρτώνται από το πρωτεύον κλειδί του πίνακα). Η βάση δεδομένων κινηματογραφικών ταινιών σε αυτή την απλή μορφή της χρειάζεται τέσσερις πίνακες. 18
Για να κάνετε μια βάση δεδομένων συμβατή με 2NF πρέπει: 1. Εντοπίστε τις στήλες που δεν είναι κλειδιά και δεν εξαρτώνται από το πρωτεύον κλειδί του πίνακα. 2. Δημιουργήστε τους κατάλληλους νέους πίνακες.(η πιο λογική τροποποίηση της βάσης δεδομένων forum είναι η δημιουργία 3 πινάκων: users, forums και messages) 19
3. Αναθέστε ή δημιουργήστε νέα πρωτεύοντα κλειδιά. (κάθε νέος πίνακας θα έχει ένα πρωτεύον κλειδί) 20
4. Δημιουργήστε τα αναγκαία ξένα κλειδιά και καθορίστε τις σχέσεις. Το τελευταίο βήμα για τη συμβατότητα με 2NF είναι να συσχετίσετε τους πίνακες με ξένα κλειδιά. Θυμηθείτε ότι το πρωτεύον κλειδί ενός πίνακα πολύ πιθανό να είναι ξένο κλειδί σε κάποιον άλλο. 21
1.6 Τρίτη Κανονική Μορφή Για να είναι μια βάση δεδομένων στην Τρίτη Κανονική Μορφή (3NF) πρέπει να είναι ήδη στη Δεύτερη Κανονική Μορφή (2NF) και όλες οι στήλες που δεν είναι κλειδιά να αμοιβαία ανεξάρτητες. Η βάση δεδομένων forum δεν έχει πρόβλημα και έτσι θα αναλύσουμε τα βήματα που πρέπει να ακολουθήσετε ώστε η βάση δεδομένων clients (περιέχει πληροφορίες των πελατών μιας επιχείρησης όπως όνομα, επώνυμο, τηλέφωνο, διεύθυνση, πόλη, νομός, ταχυδρομικός κωδικός) να είναι συμβατή με 3NF. 22
Για να κάνετε μια βάση δεδομένων συμβατή με 3NF πρέπει: 1. Εντοπίστε τυχόν αλληλοεξαρτώμενα πεδία των πινάκων (όπως η πόλη και ο νομός) 2. Δημιουργήστε τους κατάλληλους νέους πίνακες. (δημιουργήστε ξεχωριστούς πίνακες cities και states) 3. Ορίστε ή δημιουργήστε νέα πρωτεύοντα κλειδιά. (κάθε πίνακας πρέπει να έχει πρωτεύον κλειδί) 4. Δημιουργήστε τα αναγκαία ξένα κλειδιά για τη σύνδεση των πινάκων. 23
1.7 Δημιουργία της Βάσης Δεδομένων Τα τρία τελικά βήματα σχεδίασης της βάσης δεδομένων είναι τα εξής: 1. Προσεκτικός έλεγχος αν αποθηκεύονται όλες οι απαιτούμενες πληροφορίες. 2. Προσδιορισμός των τύπων των στηλών. 3. Ονομασία όλων των στοιχείων της βάσης δεδομένων. Αν κάνετε αλλαγές στους πίνακες πρέπει να ελέγχετε αν παραμένουν συμβατοί με τις κανονικές μορφές. Αφού ολοκληρωθεί το σχήμα μπορείτε να το υλοποιήσετε στη MySQL. 24
Το τελικό σχέδιο για τη βάση δεδομένων forum. 25
Δημιουργήστε τη βάση δεδομένων: 1. Προσπελάστε τη MySQL με όποιο πελάτη θέλετε. 2. Δημιουργήστε τη βάση δεδομένων forum. 3. Δημιουργήστε τον πίνακα forum Η σειρά δημιουργίας των πινάκων δεν έχει σημασία. 26
4. Δημιουργήστε τον πίνακα messages 5. Δημιουργήστε τον πίνακα users 27
6. Ελέγξτε τη δομή της βάσης δεδομένων Αν και αυτό το βήμα είναι προαιρετικό καλό είναι να πραγματοποιείται. 28
1.8 Συμπλήρωση της Βάσης Δεδομένων Συμπληρώστε τη βάση δεδομένων: 1. Προσθέστε μερικές νέες εγγραφές στον πίνακα forums 2. Προσθέστε μερικές εγγραφές στον πίνακα users 3. Προσθέστε νέες εγγραφές στον πίνακα messages 4. Επαναλάβετε τα βήματα 1 έως 3 για να συμπληρώσετε τη βάση. 29
2. Ενώσεις Επειδή οι σχεσιακές βάσεις δεδομένων έχουν πιο πολύπλοκη δομή, μερικές φορές για να ανακτήσετε τις πληροφορίες που χρειάζεστε πρέπει να χρησιμοποιήσετε ειδικές εντολές ερωτημάτων. Απλές εργασίες που απαιτούν δυο ξεχωριστά ερωτήματα μπορείτε να τις φέρετε σε πέρας με ένα ερώτημα χρησιμοποιώντας μια ένωση (join). Η ένωση είναι ένα ερώτημα της SQL που χρησιμοποιεί δυο ή περισσότερους πίνακες και παράγει έναν εικονικό πίνακα αποτελεσμάτων. Οι δυο κύριοι τύποι ενώσεων είναι οι εσωτερικές (inner) και οι εξωτερικές (outer), κάθε τύπος έχει διάφορους δευτερεύοντες τύπους. 30
Μια εσωτερική ένωση επιστρέφει όλες τις εγγραφές των καθοριζόμενων πινάκων που ικανοποιούν τις συνθήκες. Παράδειγμα: αν θέλετε να βρείτε όλα τα μηνύματα του φόρουμ kindling η κατάλληλη εσωτερική ένωση είναι η εξής: Αυτή η ένωση επιλέγει κάθε στήλη και από τους δυο πίνακες εφόσον ικανοποιούνται δυο συνθήκες. 1.Η στήλη forums.name πρέπει να έχει τιμή kindling 2.Η τιμή forum_id του πίνακα forums πρέπει να είναι ίση με την τιμή forum)id του πίνακα messages. 31
Λόγω της σύγκρισης ισότητας μεταξύ δυο πινάκων (messages.forum_id = forums.forum_id), η ένωση αυτή είναι γνωστή ως ισοένωση (equijoin). Οι εσωτερικές ενώσεις μπορούν να γραφούν και χωρίςς τον όρο INNER JOIN Εφόσον οι πίνακες που αναφέρονται στο ερώτημα έχουν στήλες με το ίδιο όνομα, πρέπει να χρησιμοποιείτε τη σύνταξη τελείας (πίνακας.στήλη). Αν δεν είστε σαφείς όταν αναφέρεστε στις στήλες σας θα συμβεί σφάλμα. 32
Η εξωτερική ένωση διαφέρει από την εσωτερική στο ότι μπορεί να επιστρέφει εγγραφές που δεν πληρούν κάποια συνθήκη. Υπάρχουν τρεις δευτερεύοντες τύποι εξωτερικών ενώσεων: αριστερή, δεξιά και πλήρης. Στις αριστερές εξωτερικές ενώσεις το πιο σημαντικό είναι ο πίνακας που παραθέτουμε πρώτο. Παράδειγμα αριστερής ένωσης: 33
Και στις εσωτερικές και στις εξωτερικές ενώσεις αν οι στήλες που συγκρίνονται για μια ισότητα έχουν ίδιο όνομα και στους δυο πίνακες, τότε απλοποιήστε το ερώτημα με τον όρο USING: Στις ενώσεις η έννοια των ψευδωνύμων της SQL διευκολύνει τη γραφή τους. Λόγω τη επιστροφής πολλών αποτελεσμάτων καλό είναι να ορίζουμε ακριβώς ποιες στήλες θέλουμε να εμφανίζονται. 34
2.1 Χρησιμοποιήστε Ενώσεις 1. Ανακτήστε το όνομα του φόρουμ και το θέμα του μηνύματος από κάθε εγγραφή του πίνακα messages. αυτό το ερώτημα, που περιλαμβάνει μια εσωτερική ένωση, στη θέση της τιμής forum_id του πίνακα messages θα εμφανίσει την τιμή name του πίνακα forums, για κάθε εγγραφή του πίνακα messages. Έτσι στο τελικό αποτέλεσμα δίπλα από κάθε θέμα μηνύματος εμφανίζεται το όνομα του αντίστοιχου φόρουμ. 35
2. Ανακτήστε το θέμα και την ημερομηνία δημοσίευσης κάθε μηνύματος του χρήστη funny man και αυτή η ένωση χρησιμοποιεί δυο πίνακες, τους users και messages. Η στήλη που τους συνδέει είναι η user_id, γι αυτό και τη συμπεριλάβαμε στον όρο USING. 36
3. Ανακτήστε τον κωδικό μηνύματος, το θέμα και το όνομα του φόρουμ για κάθε μήνυμα του χρήστη troutster. αυτή η ένωση ενσωματώνει και έναν τρίτο πίνακα. 4. Ανακτήστε το όνομα του χρήστη, το θέμα του μηνύματος και το όνομα του φόρουμ για κάθε χρήστη. 37
Μπορείτε να ενώσετε έναν πίνακα ακομά και με τον εαυτό του (αυτοένωση self-join). Στις συνθήκες των ενώσεων μπορείτε να συγκρίνετε οποιεσδήποτε στήλες, όχι μόνο πρωτεύοντα και ξένα κλειδιά. Μπορείτε να εκτελέσετε ενώσεις μεταξύ διαφορετικών βάσεων δεδομένων, χρησιμοποιώντας τη σύνταξη βάση δεδομένων.πίνακας.στήλη εφόσον οι βάσεις δεδομένων βρίσκονται στον ίδιο διακομιστή. Οι ενώσεις που δεν περιέχουν όρο WHERE λέγονται πλήρεις (FULL) και επιστρέφουν όλες τις εγγραφές και από τους δυο πίνακες. 38
3. Ομαδοποίηση επιλεγμένων αποτελεσμάτων Ο όρος GROUP BY συγκεντρώνει τα επιστρεφόμενα δεδομένα σε συναφείς ομάδες πληροφοριών. Παράδειγμα: χρησιμοποιήστε το παρακάτω ερώτημα για να ομαδοποιήσετε τα μηνύματα ανά φόρουμ: SELECT * FROM messages GROUP BY forum_id. Τα δεδομένα που επιστρέφονται διαφέρουν στο ότι τώρα οι συναφείς πληροφορίες είναι συγκεντρωμένες αντί να παρουσιάζονται ασύνδετες η μια από την άλλη. 39
3.1 Ομαδοποιήστε Δεδομενα 1. Υπολογίστε το πλήθος των εγγεγραμμένων χρηστών. SELECT COUNT(user_id) FROM users; Η COUNT() ίσως είναι η πιο δημοφιλής συνάρτηση ομαδοποίησης. Σας επιτρέπει να μετρήσετε γρήγορα τις εγγραφές ενός πίνακα. Σημειώστε ότι δεν περιλαμβάνουν απαραίτητα όρους GROUP BY όλα τα ερωτήματα που χρησιμοποιούν συναρτήσεις ομαδοποίησης. 2. Υπολογίστε πόσες φορές έχει στείλει μήνυμα κάθε χρήστης. 40
3. Βρείτε τους δυο χρήστες με τα περισσότερα μηνύματα. Ο όρος GROUP BY συγκεντρώνει όλες τις τιμές NULL μαζί. Όταν εφαρμόζετε τη συνάρτηση COUNT() να είστε προσεκτικοί γιατί μετράει μόνο τις μη NULL τιμές. 41
4. Δημιουργία Ευρετηρίων Τα ευρετήρια (indexes) είναι ένα ειδικό σύστημα που χρησιμοποιούν οι βάσεις δεδομένων για τη βελτίωση της απόδοσης των ερωτημάτων επιλογής (SELECT). Τα ευρετήρια τοποθετούνται σε μια ή περισσότερες στήλες οποιουδήποτε τύπου. Η MySQL επιτρέπει τη χρήση τουλάχιστον 16 ευρετηρίων σε κάθε πίνακα και κάθε ευρετήριο μπορεί να περιλαμβάνει μέχρι 15 στήλες. Αν και ένα ευρετήριο επιταχύνει τη διαδικασία ανάγνωσης από βάσεις δεδομένων, επιβραδύνει τα ερωτήματα που τροποποιούν τα δεδομένα μιας βάσης δεδομένων. 42
Τα ευρετήρια είναι πιο κατάλληλα για τις στήλες με τις εξής ιδιότητες: Χρησιμοποιούνται συχνά στον όρο WHERE των ερωτημάτων Χρησιμοποιούνται συχνά στον όρο ORDER BY των ερωτημάτων Χρησιμοποιούνται συχνά σε ερωτήματα ένωσης Έχουν πολλές διαφορετικές τιμές Η MySQL έχει 4 είδη ευρετηρίων: 1. INDEX (τυπικό) 2. UNIQUE (μοναδικό - κάθε γραμμή να έχει διαφορετική τιμή στήλης) 3. FULLTEXT (για αναζητήσεις πλήρους κειμένου) 4. PRIMARY KEY (ένα ειδικό ευρετήριο τύπου UNIQUE που έχετε ήδη χρησιμοποιήσει) 43
Μια στήλη θα έχει πάντα το ίδιο μοναδικό ευρετήριο. Η προσθήκη ευρετηρίου σε υπάρχοντες πίνακες απαιτεί τη χρήση της διαταγής ALTER. Η βασική σύνταξη της ALTER είναι: ALTER TABLE όνομα_πίνακα ΟΡΟΣ 44
Προσθέστε ένα ευρετήριο σε υπάρχοντα πίνακα: 1. Προσθέστε ένα ευρετήριο στη στήλη name του πίνακα forums ALTER TABLE forums ADD UNIQUE(name); Επειδή το πεδίο name μπορεί και αυτό να προσπελάζεται συχνά και η τιμή του πρέπει να είναι μοναδική σε κάθε γραμμή, προσθέστε στον πίνακα ένα ευρετήριο UNIQUE. 2. Προσθέστε ευρετήρια στον πίνακα messages 45
3. Προσθέστε ευρετήρια στον πίνακα users 4. Ελέγξτε την τρέχουσα δομή κάθε πίνακα Ο όρος DESCRIBE εμφανίζει πληροφορίες για τα ονόματα και τη σειρά των στηλών ενός πίνακα, για τους τύπους των στηλών και για τους τύπους των ευρετηρίων. 46
5. Χρήση Διαφορετικών Τύπων Πινάκων Η εφαρμογή βάσεων δεδομένων MySQL υποστηρίζει πολλούς διαφορετικούς τύπους πινάκων (ο τύπος ένος πίνακα λέγεται και μηχανή αποθήκευσης storage engine). Κάθε τύπος πίνακα υποστηρίζει διαφορετικές δυνατότητες, έχει τους δικούς του περιορισμούς και αποδίδει καλύτερα ή χειρότερα ανάλογα με τις περιστάσεις. Παρόλο που κάθε πίνακας έχει διαφορετικό τύπο ο τρόπος αλληλεπίδρασής σας με τον πίνακα όσον αφορά την εκτέλεση ερωτημάτων είναι γενικά ίδιος για όλους τους πίνακες. 47
Ο πιο σημαντικός τύπος πίνακα είναι ο MyISAM, ο προεπιλεγμένος τύπος πίνακα για όλα τα λειτουργικά συστήματα εκτός από τα Windows. Οι πίνακες MyISAM είναι ιδανικοί για τις περισσότερες εφαρμογές και χειρίζονται τα ερωτήματα SELECT και INSERT πολύ γρήγορα. Το κύριο μειονέκτημά τους είναι ότι δεν μπορούν να χειριστούν συναλλαγές. Ο πίνακας InnoDB είναι ο προεπιλεγμένος τύπος πίνακα των εγκαταστάσεων MySQL σε Windows. Είναι κατάλληλος για συναλλαγές και εκτελεί ερωτήματα ενημέρωσης χωρίς πρόβλημα. Είναι όμως πιο αργός από τον προηγούμενο και χρειάζεται περισσότερο χώρο δίσκου στο διακομιστή. Επίσης δεν υποστηρίζει ευρετήρια FULLTEXT 48
Για να καθορίσετε τη μηχανή αποθήκευσης κατά τον ορισμό ενός πίνακα, προσθέστε ένα σχετικό όρο στο τέλος της εντολής: Αν δεν καθορίσετε μηχανή αποθήκευσης θα χρησιμοποιηθεί ο προεπιλεγμένος τύπος του συγκεκριμένου διακομιστή MySQL. Για να αλλάξετε τον τύπο ενός πίνακα χρησιμοποιήστε μια διαταγή ALTER: ALTER TABLE όνομα_πίνακα ENGINE = MYISAM 49
Αλλάξτε τον τύπο ενός πίνακα: 1. Δείτε τις τρέχουσες πληροφορίες για τους πίνακες. SHOW TABLE STATUS; Αυτή η διαταγή εμφανίζει διάφορες χρήσιμες πληροφορίες για τους πίνακες μιας βάσης δεδομένων. Το αποτέλεσμα που επιστρέφει είναι λίγο δυσανάγνωστο. Το πρώτο στοιχείο κάθε γραμμής είναι το όνομα του πίνακα και το δεύτερο είναι η μηχανή αποθήκευσης. 50
2. Αν χρειάζεται, αλλάξτε τον τύπο του πίνακα messages σε MyISAM. ALTER TABLE messages ENGINE = MYISAM; 3. Αν θέλετε επαληθεύστε την αλλαγή της μηχανής αποθήκευσης εκτελώντας ξανά τη διαταγή SHOW TABLE STATUS. Η ίδια βάση δεδομένων μπορεί να περιέχει πίνακες διαφόρων τύπων. 51
6. Αναζητήσεις Πλήρους Κειμένου Οι αναζητήσεις πλήρους κειμένου απαιτούν ευρετήρια τύπου FULLTEXT που με τη σειρά τους απαιτούν πίνακες τύπου MyISAM. Η προσθήκη εγγράφων σε πίνακες με ευρετήρια τύπου FULLTEXT μπορεί να είναι πολύ πιο αργή λόγω του σύνθετου ευρετηρίου που απαιτείται. Μπορείτε να προσθέσετε ευρετήρια FULLTEXT σε πολλές στήλες. Ένα ευρετήριο FULLTEXT μπορεί να εφαρμοστεί σε ένα μόνο πίνακα κάθε φορά. 52
6.1 Εκτέλεση Βασικών Αναζητήσεων Πλήρους Κειμένου Αφού ορίσετε ένα ευρετήριο τύπου FULLTEXT σε μια ή περισσότερες στήλες, μπορείτε να ξεκινήσετε τις αναζητήσεις με τον όρο MATCH AGAINST σε μια συνθήκη WHERE: SELECT * FROM ονομα_πίνακα WHERE MATCH (στήλες) AGAINST (λέξεις_κλειδιά) Η MySQL θα εμφανίσει τις γραμμές που ταιριάζουν με τις λέξεις κλειδιά. 53
Η σειρά εμφάνισης υπολογίζεται με μαθηματικό τρόπο, όπως στις μηχανές αναζήτησης. Εδώ ισχύουν οι παρακάτω κανόνες: Οι συμβολοσειρές αναλύονται στις μεμονωμένες λέξειςκλειδιά. Οι λέξεις-κλειδιά με μήκος μικρότερο από τέσσερις χαρακτήρες αγνοούνται. Οι πολύ συνηθισμένες λέξεις, που ονομάζονται λέξεις διακοπής (stopwords), αγνοούνται. Αν περισσότερο από το 50% των εγγραφών ταιριάζουν με τις λέξεις-κλειδιά, δεν επιστρέφονται εγγραφές. Όταν ο πίνακας είναι αραιός απλώς δεν υπάρχουν αρκετές εγγραφές ώστε η MySQL να επιστρέψει συναφή αποτελέσματα. 54
Εκτελέστε αναζητήσεις πλήρους κειμένου: 1. Συμπληρώστε προσεκτικά τον πίνακα messages, φροντίζοντας να προσθέσετε εκτενή σώματα μηνυμάτων 2. Εκτελέστε μια απλή αναζήτηση πλήρους κειμένου με τη λέξη-κλειδί database. 3. Εκτελέστε την ίδια αναζήτηση πλήρους κειμένου, αυτή τη φορά εμφανίζοντας και τη συνάφεια. 55
4. Εκτελέστε μια αναζήτηση πλήρους κειμένου με πολλές λέξεις-κλειδιά. Η MySQL διαθέτει πολλές εκατοντάδες προεπιλεγμένες λέξεις διακοπής. Το ελάχιστο μήκος των λέξεων-κλειδιών (εξ ορισμού τέσσερις χαρακτήρες) είναι μια ρύθμιση της MySQL που μπορείτε να αλλάξετε. Στις αναζητήσεις πλήρους κειμένου, εξ ορισμού δε γίνεται διάκριση πεζών-κεφαλαίων. 56
6.2 Λογικές Αναζητήσεις Πλήρους Κειμένου Μπορούμε να εκτελέσουμε πιο σύνθετες αναζητήσεις με τη λογική (Boolean) κατάσταση αναζήτησης πλήρους κειμένου. Για το σκοπό αυτό προσθέτουμε τη φράση IN BOOLEAN MODE στον όρο AGAINST: Η λογική κατάσταση αναζήτησης διαθέτει διάφορους τελεστές για να καθορίζουμε τον ακριβή τρόπο χειρισμού κάθε λέξης-κλειδιού: 57
Όταν χρησιμοποιείτε λογική αναζήτηση, υπάρχουν αρκετές διαφορές από την αναζήτηση πλήρους κειμένου (FULLTEXT): Αν πριν από μια λέξη κλειδί δεν υπάρχει τελεστής, αυτή η λέξη είναι προαιρετική, αλλά αν υπάρχει ταύτιση, αυτή θα αξιολογηθεί ως περισσότερο ακριβής. Αποτελέσματα επιστρέφονται ακόμα και αν το κείμενο αναζήτησης υπάρχει σε περισσότερες από τις μισές εγγραφές. Τα αποτελέσματα δεν ταξινομούνται αυτόματα με βάση τη συνάφεια. Ένας βασικός κανόνας είναι ότι υπάρχει ελάχιστο μήκος για το κείμενο αναζήτησης. 58
59
Εκτελέστε λογικές αναζητήσεις πλήρους κειμένου: 1. Εκτελέστε μια απλή αναζήτηση πλήρους κειμένου για τις λέξεις HTML, XHTML, ή (X)HTML. Για να γίνουν τα αποτελέσματα πιο ευανάγνωστα χρησιμοποιήσαμε την παράμετρο \G η οποία ορίζει στην mysql να παρουσιάσει τα αποτελέσματα κατακόρυφα και όχι οριζόντια. 2. Βρείτε τις εγγραφές που περιέχουν τη λέξη database, με έμφαση στη φράση normal form 60
6.3 Βελτιστοποίηση Βάσης Δεδομένων Η απόδοση της βάσης δεδομένων σας εξαρτάται κυρίως από τη δομή της και τα ευρετήρια. Όταν δημιουργείτε βάσεις δεδομένων προσπαθήστε τα εξής: Να επιλέγετε την πιο κατάλληλη μηχανή αποθήκευσης. Να χρησιμοποιείτε για κάθε στήλη το μικρότερο δυνατό τύπο δεδομένων. Να ορίζετε τις στήλες ως NOT NULL, όπου είναι δυνατό. Να χρησιμοποιείτε ακέραιους ως πρωτεύοντα κλειδιά. Να ορίζετε με προσοχή τα ευρετήρια, επιλέγοντας τον κατάλληλο τύπο και εφαρμόζοντάς τα στις κατάλληλες στήλες. Αν γίνεται, να περιορίζετε τα ευρετήρια σε συγκεκριμένο πλήθος χαρακτήρων. 61
Εκτός από τις συμβουλές αυτές, υπάρχουν δυο απλές τεχνικές βελτιστοποίησης βάσεων δεδομένων. Ένας τρόπος είναι η εκτέλεση μιας διαταγής OPTIMIZE σε τέτοιους πίνακες. Το ερώτημα απαλλάσσει έναν πίνακα από περιττές επιβαρύνσεις, επιταχύνοντας έτσι την αλληλεπίδραση με αυτόν. OPTIMIZE TABLE όνομα_πίνακα Ο άλλος τρόπος είναι να καταλάβετε πως θα εκτελέσει το ερώτημα η MySQL. Αυτό μπορεί να επιτευχθεί με τη χρήση της λέξης κλειδιού EXPLAIN της SQL. 62
7. Συναλλαγές Μια συναλλαγή βάσης δεδομένων είναι μια σειρά ερωτημάτων που εκτελούνται σε μια περίοδο εργασίας. Με τις συναλλαγές μπορείτε να ορίσετε σημεία εκκίνησης και διακοπής και μετά να οριστικοποιείτε ή να ανακαλείτε τα ερωτήματα σύμφωνα με τις ανάγκες. Για συναλλαγές στη MySQL πρέπει να χρησιμοποιείτε μόνο πίνακες τύπου InnoDB. Για να ξεκινήσετε μια νέα συναλλαγή πληκτρολογήστε START TRANSACTION; Όταν τελειώσετε είτε δίνετε τη διαταγή COMMIT για την οριστικοποίηση είτε τη ROLLBACK για να αναιρέσετε το αποτέλεσμα όλων των ερωτημάτων. 63
Αφού οριστικοποιήσετε ή ανασκευάσετε τα ερωτήματα, η συναλλαγή θεωρείται ολοκληρωμένη και η MySQL επιστρέφει σε μια κατάσταση αυτόματης οριστικοποίησης. Κάποιοι τύποι ερωτημάτων δεν ανασκευάζονται όπως: ερωτήματα δημιουργίας, τροποποίησης, περικοπής ή διαγραφής πινάκων, δημιουργίας ή διαγραφής βάσεων δεδομένων. Οι συναλλαγές αναφέρονται σε συγκεκριμένη σύνδεση με τη βάση δεδομένων. 64
Εκτελέστε συναλλαγές: 1. Συνδεθείτε στον πελάτη mysql και επιλέξτε τη βάση δεδομένων test. 2. Δημιουργήστε ένα νέο πίνακα με το όνομα accounts 65
3. Συμπληρώστε τον πίνακα. 4. Ξεκινήστε μια συναλλαγή και εμφανίστε τα τρέχοντα περιεχόμενα του πίνακα. 5. Αφαιρέστε 100$ από το λογαριασμό του David Sedaris 66
6. Προσθέστε 100$ στο λογαριασμό της Sarah Vowell 7. Ελέγξτε τα αποτελέσματα SELECT * FROM accounts; 8. Ανασκευάστε τη συναλλαγή ROLLBACK; 9. Ελέγξτε τα αποτελέσματα SELECT * FROM accounts; 10. Επαναλάβετε τα βήματα 4 έως 6 11. Οριστικοποιήστε τη συναλλαγή και επαληθεύστε τα αποτελέσματα 67