Rails Best Practice - Επιτυχημένες διευθύνσεις στην PostgreSQL

Η επέκταση «hstore» υλοποιεί τον τύπο δεδομένων «hstore» για την αποθήκευση ζευγών ζευγών κλειδιού / τιμής

Περίληψη: Προτείνετε μια λύση που προσφέρει μια συνεπή, αποδοτική και αξιόπιστη μέθοδο αποθήκευσης και ανάκτησης σύνθετων τύπων δεδομένων από μια βάση δεδομένων SQL.

Ο σχεδιασμός εφαρμογών αποτελεί ένα κρίσιμο και συχνά παραβλεπόμενο βήμα στην οικοδόμηση επιτυχημένων εφαρμογών στο διαδίκτυο. Το πλαίσιο Rails καθιστά τόσο εύκολο να δημιουργήσετε και να ξεκινήσετε μια εφαρμογή που είναι δελεαστικό για τους προγραμματιστές να παρακάμψουν το σχεδιασμό και να πηδήξουν στην ανάπτυξη. Ωστόσο, η δημιουργία κώδικα εφαρμογής πριν από τον σωστό προγραμματισμό του τομέα μπορεί να οδηγήσει σε παραπλανητικές ή ακόμη και παραμορφωμένες εφαρμογές. Εξετάστε, για παράδειγμα, την καλύτερη μέθοδο χειρισμού του πεδίου "διεύθυνση" σε μια εφαρμογή.

Τι υπάρχει σε μια διεύθυνση;

Εδώ φαίνεται μια τυπική διεύθυνση στις Ηνωμένες Πολιτείες:

Διεύθυνση: [
Οδός: "123 Happy Days Lane" String
Πόλη: Η σειρά "Wonderland"
Κράτος: Σειρά "PA"
Zip: 10102 Χορδές
]

Η τιμή "Διεύθυνση" αποτελείται από μια σειρά ζευγών κλειδιών / τιμών, όπου η τιμή είναι μια συμβολοσειρά. Είναι ένα πολύ κοινό πεδίο για να δείτε σε εφαρμογές. Έτσι, ποιος είναι ο καλύτερος τρόπος για να αντιπροσωπεύσει την τιμή "Διεύθυνση" σε μια βάση δεδομένων SQL; Για να το καταλάβουμε, ας δούμε τι κάνουν οι άλλοι προγραμματιστές σε αυτή την κατάσταση.

Επιλογή 1: Αποθηκεύστε την τιμή σε ένα μόνο πεδίο ως συμβολοσειρά, για παράδειγμα:

Διεύθυνση: "123 Happy Days Ln. Wonderland, ΡΑ 10102 "

Αυτή είναι μια κακή λύση. Όπως έχουμε δει στην παραπάνω ενότητα, μια διεύθυνση είναι μια σειρά από ζεύγη κλειδιών / τιμών. Η αντιμετώπιση της διεύθυνσης όπως κάθε άλλου κλιμακωτού πεδίου θα ήταν ασυνεπής. Αυτή η ασυνέπεια γίνεται εμφανής όταν θέλουμε να επεκτείνουμε την εφαρμογή κάποια στιγμή στο μέλλον. Ας υποθέσουμε ότι θέλουμε να βρούμε όλους τους πελάτες από μια δεδομένη "πόλη" ή "κράτος". Επειδή ολόκληρη η αξία της "Διεύθυνσης" έχει περάσει μέσα σε μια συμβολοσειρά δεν υπάρχει πλέον ένας εύκολος τρόπος να το κάνετε αυτό.

Επιλογή 2: Διαχωρίστε την τιμή "Διεύθυνση" σε ξεχωριστά πεδία και αποθηκεύστε τα πεδία, για παράδειγμα:

Οδός: "123 Happy Days Ln", Πόλη: "Wonderland", Νομός: "PA", Τ.Κ .: "10102"

Εδώ λύσαμε την προηγούμενη υποθετική μας επέκταση για να βρούμε όλους τους πελάτες μιας συγκεκριμένης "πόλης" ή "κράτους". Ωστόσο, αντιπροσωπεύουμε τώρα το πεδίο "Διεύθυνση" ως τέσσερα ξεχωριστά και διακριτά πεδία, όταν, στην πραγματικότητα, τα πεδία πρέπει να συνδυαστούν μαζί.

Επιλογή 3: Δημιουργήστε ξεχωριστό πίνακα διευθύνσεων και σύνδεση ξένου κλειδιού

Ορισμένες αναρτήσεις ιστολογίου και απαντήσεις του StackOverflow καταλήγουν στο συμπέρασμα ότι ο καλύτερος τρόπος αποθήκευσης διευθύνσεων σε Rails είναι να χρησιμοποιήσετε ένα ξεχωριστό μοντέλο και μια ανώνυμη ένωση. Με αυτόν τον τρόπο, ένα μοντέλο χρήστη ή επιχείρησης θα μπορούσε να έχει πολλές διευθύνσεις και να μην περιορίζεται σε μία μόνο διεύθυνση. Επίσης, οι διευθύνσεις θα αποθηκεύονται σωστά καθώς κάθε μοντέλο "Διεύθυνσης" θα αποτελείται από τα κλειδιά και τις αντίστοιχες τιμές. Αυτή δεν είναι μια κακή λύση, υποθέτοντας ότι το μοντέλο εφαρμογής σας, για παράδειγμα "Χρήστες", απαιτεί περισσότερες διευθύνσεις. Ωστόσο, αν κάθε μοντέλο χρειάζεται μόνο μία διεύθυνση (όπως συμβαίνει στην πλειοψηφία των ανθρώπων, μια διεύθυνση αλληλογραφίας) τότε με την προσθήκη πρόσθετων πινάκων και συσχετίσεων αυξάνετε αναπόφευκτα την πολυπλοκότητα της εφαρμογής. Είναι πολύ απλό να δημιουργηθούν πίνακες και συσχετίσεις σε Rails, πράγμα που πιθανώς είναι ο λόγος πίσω από αυτή την τρίτη επιλογή. Για να δημιουργήσετε έναν νέο πίνακα "Διεύθυνσης" με τη σωστή συσχέτιση με τον "Χρήστη" είναι τόσο απλό όσο: rails g model Διεύθυνση δρόμου: συμβολοσειρά πόλη: συμβολοσειρά κατάσταση: συμβολοσειρά zip: string user: πρακτική για την αίτησή σας ή είναι μια απλή λύση σε ένα πιο περίπλοκο ζήτημα; "

Λύση:

Rails / PostgreSQL είναι μια κοινή τεχνολογική στοίβα που χρησιμοποιείται στην ανάπτυξη και την παραγωγή. Υπάρχει μια μέθοδος για την αποθήκευση των διευθύνσεων στην κατάλληλη μορφή τους, επιτρέποντας την επέκταση 'hstore'. Αυτή η επέκταση μας επιτρέπει να αποθηκεύουμε τα δεδομένα ως τον τύπο 'hstore' (καταστηματάρχη). Το πρώτο βήμα είναι να ενεργοποιήσετε την ενότητα "hstore". Για να γίνει αυτό, θα γράψουμε μια μετανάστευση:

Όταν τρέχουμε 'rail db: migrate' από τη γραμμή εντολών, το Postgres θα ενεργοποιήσει την επέκταση 'hstore'. Αυτό μπορεί να επαληθευτεί ελέγχοντας το αρχείο schema.rb. Κοντά στην κορυφή του αρχείου θα πρέπει να δείτε τώρα:

 # Αυτές είναι επεκτάσεις που πρέπει να ενεργοποιηθούν για να υποστηρίξουν αυτή τη βάση δεδομένων
enable_extension "plpgsql"
enable_extension "hstore"

Στη συνέχεια, θα δημιουργήσουμε μια μετανάστευση για το μοντέλο χρήστη:

Παρατηρήστε πώς χρησιμοποιούμε τον τύπο δεδομένων 'hstore' για το πεδίο διεύθυνσης. Αυτό μας επιτρέπει να αποθηκεύουμε ζεύγη κλειδιών / τιμών μέσα στην "διεύθυνση".

Παράμετρος: Το πεδίο 'hstore' μπορεί να χρησιμοποιηθεί για την αποθήκευση ζευγών κλειδιών / τιμών. Σε αυτό το άρθρο εξετάζουμε μια "Διεύθυνση", αλλά είναι εξίσου χρήσιμο για την αποθήκευση των "Προτιμήσεων" ή οποιουδήποτε άλλου τύπου δεδομένων κατακερματισμού.

Έτσι, τώρα έχουμε ένα μόνο πεδίο που γνωρίζουμε ότι μπορεί να αποθηκεύσει δεδομένα με τη μορφή City => "Wonderland" και State => "PA". Μπορούμε να δημιουργήσουμε τον ελεγκτή "Χρήστη" και τον "Ελεγκτή χρηστών" αλλά πώς αποθηκεύουμε τα ζεύγη κλειδιών / τιμών σε ένα μόνο πεδίο βάσης δεδομένων; Υπάρχει μια άλλη σκέψη να κάνουμε, πώς μπορούμε να διατηρήσουμε το ζεύγος κλειδιών / τιμών City => "Wonderland" στο πεδίο της "διεύθυνσης";

Από τη σκοπιά του ελεγκτή, πρέπει πρώτα να επισημάνουμε όλες τις παραμέτρους πριν να μπορέσουν να εκχωρηθούν μάζα. Αυτό γίνεται με την ιδιωτική μέθοδο 'user_params', το ίδιο με οποιοδήποτε άλλο πεδίο βάσης δεδομένων.

Με την καταχώριση σε λευκή λίστα όσων μπορούν να αντιστοιχιστούν με τη διεύθυνση, έχουμε παράσχει συγκεκριμένες οδηγίες ως προς τα δεδομένα που αναμένουμε. Το πεδίο διεύθυνσης μπορεί να έχει ζεύγος πόλης / τιμής ή ζεύγος κατάστασης / τιμής, αλλά όχι ζευγάρι πίθηκος / τιμής.

Στη φόρμα χρήστη μας, παρέχουμε τα κατάλληλα πεδία για τη συλλογή των δεδομένων:

Ολόκληρη η φόρμα εμφανίζεται για επίδειξη. Ωστόσο, η αρχή και το τέλος του πεδίου διεύθυνσης επισημαίνονται με html σχόλια. Παρατηρήστε πώς χρησιμοποιούμε τον βοηθό φόρμας για να δημιουργήσετε πεδία για τη διεύθυνση. Κάθε πεδίο αντιστοιχεί σε μια παραμετροποιημένη παράμετρο που έχουμε καθορίσει στον ελεγκτή. Παρόλο που δεν είναι σχετικό με αυτό το άρθρο, η φόρμα είναι σε στιλ με τις κατηγορίες από τη βιβλιοθήκη Semantic-UI - πράγμα που σημαίνει ότι πρόκειται να ανταποκρίνεται και να δείχνει εκπληκτικό!

Η παραπάνω φόρμα εμφανίζεται στο πρόγραμμα περιήγησης

Μπορούμε να δημιουργήσουμε γρήγορα έναν χρήστη και να δούμε πώς φαίνεται το πεδίο "Διεύθυνση":

Το πεδίο διεύθυνσης αποθηκεύεται ως hash των ζευγών κλειδιών / τιμών, τέλεια!

Στην παραπάνω εικόνα, ο όρος "θέμα" είναι συνώνυμος με τον "χρήστη". Όπως βλέπετε, το πεδίο "Διεύθυνση" έχει αποθηκεύσει τα ζεύγη κλειδιών / τιμών από τον ελεγκτή, όπως ακριβώς περίμενε. Αν θέλουμε να βρούμε την αξία μιας πόλης ενός συγκεκριμένου χρήστη μπορούμε να χρησιμοποιήσουμε @ user.address ['city'] και αυτό θα επιστρέψει το "Wonderland" στην περίπτωση χρήσης παραδείγματος.

Σε αυτό το άρθρο ανακαλύψαμε τη βέλτιστη μέθοδο αποθήκευσης και διερεύνησης σύνθετων τύπων δεδομένων στο PostgreSQL μέσω της επέκτασης 'hstore'. Διαπιστώσαμε ότι ως βέλτιστη πρακτική τα πρώτα βήματα στη δημιουργία μιας διαδικτυακής εφαρμογής προγραμματίζουν και συγκεντρώνουν πληροφορίες. Επίσης μάθαμε την αξία της ανακαλύψεως των πληροφοριών από εμάς με την έρευνα και την ανάγνωση της τεκμηρίωσης. Ακριβώς επειδή ένας άλλος προγραμματιστής ή εταιρεία κάνει κάτι με έναν τρόπο δεν σημαίνει ότι πρέπει να ακολουθήσουμε τυφλά. Είναι σημαντικό να αναρωτηθούμε "γιατί" και να χρησιμοποιήσουμε τις δικές μας γνωστικές ικανότητες για να καταλήξουμε λογικά σε συμπεράσματα. Ελπίζω να βρήκατε αυτό το άρθρο χρήσιμο. Για περισσότερες δωρεάν πληροφορίες και σεμινάρια σχετικά με τεχνολογίες ιστού, επισκεφθείτε το Learn2Code.