Μια ματιά στη Βάση Δεδομένων WordPress και WooCommerce

blogimages_woo-wpdatabase

Πρόσφατα ήμουν στην ευχάριστη θέση να βρεθώ μπροστά από ένα πολύ ενδιαφέρον κοινό, προσκεκλημένος της ομάδας WordPress Meetup Heraklion, για να παρουσιάσω μερικές πληροφορίες σχετικά με τη Βάση Δεδομένων που χρησιμοποιεί η εφαρμογή WordPress και το συγγενικό WooCommerce. Η παρουσίαση βρήκε θετική ανταπόκριση και σκέφτηκα ότι θα αποτελούσε ενδιαφέρον υλικό για ένα blog post.

[TIP: Ρίξε μια ματιά εδώ για μια γρήγορη εισαγωγή στον κόσμο των Βάσεων Δεδομένων]

Γενική Αρχιτεκτονική

Κάπως έτσι είναι δομημένη η ΒΔ στην τελευταία έκδοση του WordPress 4.7

https://codex.wordpress.org/images/2/25/WP4.4.2-ERD.png

File Source: https://codex.wordpress.org/images/2/25/WP4.4.2-ERD.png

Η ΒΔ του WordPress λειτουργεί εξίσου αποτελεσματικά σε MySQL (έκδοση 5.6 κι έπειτα) αλλά και σε MariaDB (έκδοση 10.0 κι έπειτα), όπως αναφέρεται και στην επίσημη λίστα με τις απαιτήσεις για την εγκατάσταση της εφαρμογής [https://wordpress.org/about/requirements/].

Όπως μπορείς να δεις και παραπάνω, αποτελείται από συνολικά 12 πίνακες των οποίων η ονομασία φέρει ένα κοινό πρόθεμα επιτρέποντας πολλαπλές εγκαταστάσεις εφαρμογών WP στον ίδιο Database Server. Το πρόθεμα αυτό έχει την προεπιλεγμένη τιμή “wp_” και σου προτείνω (αν όχι επιβάλω, για λόγους ασφαλείας) την αλλαγή του σε κάποιο τυχαίο αλφαριθμητικό με στόχο τη δυσκολία εύρεσής του από κακόβουλους χρήστες.

Η αρχιτεκτονική της ΒΔ αποτελεί ένα υβρίδιο αποθηκευτικού χώρου σχεδιασμένου να αποθηκεύσει δεδομένα από τις διάφορες καλά ορισμένες Οντότητες/Αντικείμενα της εφαρμογής (Posts-Custom Post Types, Users, Terms κτλ), με χρήση μοναδικών κλειδιών για κάθε μία διακριτή Οντότητα (primary key: bigint[20] unsigned). Μπορεί επίσης να αποθηκεύσει και δυναμικούς τύπους δεδομένων που δεν έχουν προκαθορισμένη δομή και ιδιότητες, σε ειδικούς πίνακες της μορφής κλειδιού/τιμής (key/value data store). Το σημαντικό πλεονέκτημα αυτής της μεταβλητής μορφής αποθήκευσης δεδομένων είναι η ευελιξία που προσφέρει καθώς δεν υπάρχει περιορισμός στον Τύπο των δεδομένων που θα αποθηκευτούν και δίνει τη δυνατότητα αποθήκευσης απεριόριστου αριθμού και τύπου δυναμικών δεδομένων.

Για κάθε μία από τις βασικές Οντότητες του WordPress (Posts, Comments, Users, Terms) η ΒΔ χρησιμοποιεί ειδικό πίνακα με ονομασία που προέρχεται από τον τύπο της Οντότητας. Έτσι έχουμε τους παρακάτω 4 βασικούς πίνακες (έχουμε επιλέξει πρόθεμα wp_) με προκαθορισμένα πεδία για την αποθήκευση των Oντοτήτων:

  • wp_posts
  • wp_comments
  • wp_users
  • wp_terms

Κάθε ένας απο τους παραπάνω πίνακες είναι συνδεδεμένος με ενα key/value data table, οπότε υπάρχουν και οι 4 παρακάτω πίνακες, με δυναμικά πεδία για αποθήκευση μεταβλητών τύπων δεδομένων:

  • wp_postmeta
  • wp_usermeta
  • wp_commentmeta
  • wp_termmeta

Παρακάτω φαίνεται η δομή του πιο βασικού πίνακα του WordPress -του wp_posts καθως και του βοηθητικού data store wp_postmeta

wp_posts

WP_OPTIONS

Οι πίνακες αποθήκευσης της μορφής key/value data store μπορούν να συγκριθούν με τις Βάσεις Δεδομένων γνωστές ως “NoSQL” διότι όπως και οι NoSQL βάσεις, έτσι και τα data store tables, προσπαθούν να μην έχουν προκαθορισμένη δομή και πεδία ώστε να αποθηκεύουν αρκετά εύκολα οποιοδήποτε δυναμικό τύπο δεδομένων, αλλά και να καταφέρνουν να ολοκληρώνουν τις εργασίες αναζήτησης χωρίς μεγάλη καθυστέρηση.

Θα μπορούσε κανείς να βρει ομοιότητες μεταξύ μιας Δομής Δεδομένων κάποιας γλώσσας προγραμματισμού όπως είναι το Generic Dictionary (στη C#) και των data store tables του WordPress. Όπως και στο Dictionary, έτσι και στους πίνακες αυτούς, οι δυναμικές ιδιότητες του Αντικειμένου προς αποθήκευση χαρακτηρίζονται από ένα μοναδικό κλειδί (key) το οποίο στη ΒΔ του WordPress μπορεί να είναι οποιαδήποτε τιμή αλγαριθμητικού [varchar(255)]. Οι ίδιες οι ιδιότητες (data) μπορούν να είναι δεδομένα οποιουδήποτε τύπου ή ακόμα και δυναμικά αντικείμενα που μπορούν να μετατραπούν σε αλφαριθμητική μορφή με χρήση της συνάρτησης serialize της PHP.

Ένας τέτοιου είδους πίνακας, που είναι πολύ σημαντικός για τη συνολική λειτουργία ενός WordPress App, είναι ο wp_options στον οποίο αποθηκεύονται γενικές ρυθμίσεις της εφαρμογής τόσο από το ίδιο το WordPress core, όσο και από όποια plugins/themes χρειάζονται Global Settings για τη λειτουργία τους.

Τα πεδία του πίνακα wp_options ακολουθούν τη δομή του key/value data store που περιγράψαμε και είναι τα παρακατω:

  • option_id bigint(20)
  • option_name varchar(64) <= key
  • option_value longtext <= value
  • autoload varchar(20)

Terms, Taxonomies, and Term Relationships

Επέλεξα να κάνω ξεχωριστή αναφορά στους πίνακες που χρησιμοποιούνται για τη λειτουργία των Taxonomies, κι αυτό γιατί η αρχιτεκτονική τους διαφέρει από τους υπόλοιπους πίνακες του WordPress Database. Η διαφορά αυτή υπάρχει για λόγους συμβατότητας με προηγούμενες εκδόσεις της εφαρμογής (backwards compatibility). Συγκεκριμένα, στις αρχικες εκδόσεις του WordPress, η λειτουργία των Taxonomies είχε σχεδιαστεί με τέτοιο τρόπο ώστε να υπάρχει δυνατότητα επαναχρησιμοποίησης δεδομένων ανά Οντότητα (term sharing). Έτσι, οι πίνακες στη ΒΔ σχεδιάστηκαν με λίγο ανορθόδοξο τρόπο (σε σχέση με την μοντέρνα αρχιτεκτονική που συζητήσαμε παραπάνω) και καθώς δεν έχει ολοκληρωθεί πλήρως ο επανασχεδιασμός της λειτουργίας αυτής (υπάρχει πλάνο επανασχεδιασμού από την ομάδα προγραμματιστών του WordPress) οι πίνακες στη ΒΔ έχουν κρατήσει κάποια στοιχεία από την αρχιτεκτονική των αρχικών εκδόσεων.

Ήδη ανέφερα παραπάνω τους 2 βασικούς πινακες αποθήκευσης των όρων (terms) wp_terms και wp_termmeta. Για τον ορισμό της κατηγορίας (taxonomy), στην οποία ανήκει ο κάθε όρος, χρησιμοποιείται ο πίνακας wp_term_taxonomy και τέλος, για τη συσχέτιση μεταξύ όρων και οντοτήτων/αντικειμένων υπάρχει ο πίνακας wp_term_relationships με τα παρακάτω πεδία:

  • οbject_id
  • τerm_taxonomy_id
  • term_order

WooCommerce

Το διάσημο αυτό plugin που μετατρέπει οποιονδήποτε ιστότοπο WordPress σε πολυδύναμο και πολυδιάστατο eShop φέρει και αυτό τα δικά του δεδομένα και ρυθμίσεις που χρειάζονται αποθήκευση στη ΒΔ.

Το WooCommerce χρησιμοποιεί τους υπάρχοντες πίνακες της ΒΔ του WordPress για την αποθήκευση δεδομένων που χρησιμοποιούνται για τα προϊόντα, τα κουπόνια, τις παραγγελίες, την κατηγοριοποίηση και τα webhooks (products, coupons, orders, categories, webhooks). Μεταξύ αυτών των πινάκων της κύριας δομής της ΒΔ είναι οι wp_posts/ wp_postmeta/ taxonomy tables.

Έτσι για την αποθήκευση ενός προϊόντος, για παράδειγμα, χρησιμοποιούνται οι wp_posts και wp_postmeta. Ειδικά ο wp_postmeta πίνακας κρατάει όλες τις επιπρόσθετες εκείνες πληροφορίες που αφορούν κάθε προϊόν, από την τρέχουσα τιμή του μέχρι και τον αριθμό αποθέματος. Εύκολα λοιπόν κατανοεί κανείς ότι κατ’αυτόν τον τρόπο ο πίνακας wp_postmeta επιβαρύνεται αρκετά με μεγάλο αριθμό εγγραφών ανά προϊόν (μία εγγραφή για κάθε ιδιότητα προϊόντος) με αποτέλεσμα να παρατηρείται μια μεγάλη αύξηση στον αριθμό εγγραφών σε αυτόν τον πίνακα (αύξηση γραμμών – κάθετη αύξηση). Αυτό το φαινόμενο δημιουργεί προβλήματα στη ΒΔ και ειδικά σε καταστήματα με μεγάλο αριθμό προϊόντων/ παραγγελιών μπορεί να προκαλέσει αρκετή καθυστέρηση στην ανταπόκριση της εφαρμογής. Γι’ αυτό τον λόγο προτείνεται η χρήση διαφόρων τεχνικών βελτιστοποίησης της ΒΔ. Υπάρχουν ενδείξεις ότι το πρόβλημα αυτό θα επιλυθεί σε επόμενες εκδόσεις της εφαρμογής.

Φυσικά το WooCommerce εγκαθιστά και κάποια δικά του tables στη ΒΔ, τα οποία χρησιμοποιεί για τις διάφορες επιμέρους λειτουργίες του. Αυτά τα tables παρουσιάζονται παρακάτω (μέσα σε ένα html table – inception alert  :-D )

woocommerce_sessions woocommerce_tax_rate_locations
woocommerce_tax_rates woocommerce_api_keys
woocommerce_shipping_zones woocommerce_shipping_zone_methods
woocommerce_shipping_zone_locations woocommerce_attribute_taxonomies
woocommerce_order_items woocommerce_payment_tokens
woocommerce_order_itemmeta woocommerce_payment_tokenmeta
woocommerce_downloadable_product_permissions

Αυτή είναι η γενική εικόνα της ΒΔ ενός WordPress/ WooCommerce App. Σίγουρα υπάρχουν σημεία όπου μπορεί να γίνει περισσότερη ανάλυση, όπως επίσης υπάρχουν θέματα στα οποία επέλεξα να μην αναφερθώ, πχ. η εφαρμογή MultiSite του WordPress και η έννοια της βελτιστοποίησης μιας ΒΔ για καλύτερη απόδοση της εφαρμογής. Τα θέματα αυτά μπορούμε να τα προσεγγίσουμε σε επόμενο άρθρο.

Μπορεις να δεις ολόκληρη την παρουσίαση παρακάτω. Οποιαδήποτε σχόλια ή απορίες είναι ευπρόσδεκτα.

Σχετικά με 

Ο Γιώργος είναι μέλος του Development Team μας και ασχολείται κυρίως με την ανάπτυξη και βελτίωση των συστημάτων του Papaki. Έχει μεγάλη εμπειρία πάνω σε τεχνολογίες Web και είναι ένθερμος υποστηρικτής των Open Source συστημάτων.