Μια καλή προδιαγραφή βάσης δεδομένων συμβάλλει στη μείωση της πολυπλοκότητας της υλοποίησης λογισμικού και στη μείωση του κόστους επικοινωνίας.
1. Ο σιδερένιος νόμος της κατασκευής μιας αποθήκης
- | Σιδερένιος νόμος | Επίπεδο | παρατήρηση | σύνολο χαρακτήρων | Χρησιμοποιήστε UTF-8. Εάν το emoji είναι αποθηκευμένο, χρησιμοποιήστε το utf8mb4 για αποθήκευση. | αναγκαστική |
| | Κανόνες ταξινόμησης | Χρησιμοποιήστε utf8_general_ci | αναγκαστική | |
2. Ο σιδερένιος νόμος της επιτραπέζιας κατασκευής
- | Σιδερένιος νόμος | Επίπεδο | παρατήρηση | εξήγηση | Φροντίστε να έχετε σχολιασμούς πεδίου. | αναγκαστική |
| | κωδικοποιώ | Χρησιμοποιήστε UTF-8. Εάν το emoji είναι αποθηκευμένο, χρησιμοποιήστε το utf8mb4 για αποθήκευση. | αναγκαστική |
| | αν το πεδίο είναι εννοιολογικό | Πρέπει να ονομάζεται με is_xx και ο τύπος δεδομένων είναι ανυπόγραφος tinyint(1 ναι, 0 όχι), π.χ. is_deleted(1 διαγραφή, 0 μη διαγραμμένο). | αναγκαστική | Οποιοδήποτε πεδίο πρέπει να είναι ανυπόγραφο εάν δεν είναι αρνητικό | Όνομα πίνακα, όνομα πεδίου | Μπορούν να χρησιμοποιηθούν μόνο πεζά γράμματα, κάτω παύλες ή αριθμοί. Απαγορεύεται να ξεκινήσετε με υπογράμμιση ή αριθμό. Μόνο οι αριθμοί απαγορεύονται μεταξύ δύο υπογράμμισης. Απενεργοποιήστε τις δεσμευμένες λέξεις. Η χρήση ουσιαστικών στον πληθυντικό αριθμό απαγορεύεται στα ονόματα των πινάκων. | αναγκαστική |
| | Η ονομασία του ονόματος της βάσης δεδομένων και του ονόματος του πίνακα | Το όνομα της βάσης δεδομένων πρέπει να είναι συνεπές με το όνομα της εφαρμογής και το όνομα του πίνακα πρέπει να ονομάζεται με το Business Name_Role του πίνακα. | αναγκαστική |
| | Ονομασία ευρετηρίου | Το ευρετήριο πρωτεύοντος κλειδιού χρησιμοποιεί pk_ όνομα πεδίου. Μοναδικό ευρετήριο με uk_ όνομα πεδίου. Τα κανονικά ευρετήρια χρησιμοποιούν idx_ ονόματα πεδίων. | αναγκαστική | pk_ είναι το πρωτεύον κλειδί. uk_ είναι μοναδικό κλειδί. idx_ είναι ευρετήριο | Δεκαδικός τύπος | Ο τύπος δεδομένων είναι δεκαδικός και η χρήση float και double απαγορεύεται, το float και το double έχουν απώλεια ακρίβειας και εάν το εύρος αποθηκευμένων δεδομένων υπερβαίνει το εύρος του δεκαδικού, συνιστάται να χωρίσετε τα δεδομένα σε ακέραιους και δεκαδικούς αριθμούς και να τα αποθηκεύσετε ξεχωριστά. | αναγκαστική |
| | Τύπος varchar | Το varchar είναι μια μεταβλητή μεγάλη συμβολοσειρά, δεν έχει εκχωρηθεί χώρος αποθήκευσης εκ των προτέρων, το μήκος δεν πρέπει να υπερβαίνει τους 5000 χαρακτήρες, εάν το μήκος είναι μεγαλύτερο από 5000, εφαρμόστε κείμενο (δημιουργήστε έναν ξεχωριστό πίνακα, χρησιμοποιήστε το πρωτεύον κλειδί για να αντιστοιχίσετε, για να αποφύγετε να επηρεάσετε την αποτελεσματικότητα ευρετηρίασης άλλων πεδίων). | αναγκαστική |
| | Πρέπει να υπάρχουν τρία πεδία στο όνομα του πίνακα | ID (Ο τύπος δεδομένων είναι Unsigned Bigint, Αύξηση μεμονωμένου πίνακα, Το μέγεθος βήματος είναι 1), gmt_create, gmt_modified (Ενεργός χρόνος δημιουργίας, Χρόνος παθητικής ενημέρωσης, Τύπος δεδομένων είναι DateTime). | αναγκαστική |
| | Πλεονασμός πεδίου | Τα πεδία επιτρέπουν τον κατάλληλο πλεονασμό, αλλά πρέπει να λαμβάνεται υπόψη η συνέπεια των δεδομένων και τα περιττά πεδία πρέπει να έχουν 1) σπάνιες τροποποιήσεις. 2) Όχι ένα πολύ μεγάλο πεδίο varchar, πόσο μάλλον ένα πεδίο κειμένου. | συστήνω |
| | Διαίρεση της βάσης δεδομένων και των πινάκων | Η κατάτμηση συνιστάται μόνο όταν ο αριθμός των γραμμών σε έναν πίνακα υπερβαίνει τα 5 εκατομμύρια σειρές ή η χωρητικότητα ενός μεμονωμένου πίνακα υπερβαίνει τα 2 GB. | συστήνω | |
Η ρύθμιση του κατάλληλου μήκους αποθήκευσης χαρακτήρων όχι μόνο εξοικονομεί χώρο στον πίνακα της βάσης δεδομένων και αποθήκευση ευρετηρίου, αλλά το πιο σημαντικό, βελτιώνει την ταχύτητα ανάκτησης.
3. Καθιερώστε έναν σιδερένιο νόμο ευρετηρίου
- | Σιδερένιος νόμος | Επίπεδο | παρατήρηση | Μοναδικό ευρετήριο | Τα πεδία με μοναδικά χαρακτηριστικά στην επιχείρηση, ακόμη και αν είναι συνδυασμός πεδίων, πρέπει να ευρετηριάζονται μοναδικά. Αν και το μοναδικό ευρετήριο επηρεάζει την ταχύτητα εισαγωγής, αυτή η απώλεια είναι αμελητέα, αλλά βελτιώνει σημαντικά την ταχύτητα ερωτήματος. Επιπλέον, ακόμα κι αν το επίπεδο εφαρμογής έχει πολύ πλήρη έλεγχο ελέγχου, εφόσον δεν υπάρχει μοναδικό ευρετήριο, σύμφωνα με το νόμο του Murphy, αναπόφευκτα θα δημιουργηθούν βρώμικα δεδομένα. | αναγκαστική |
| | Συμμετοχή | Περισσότεροι από τρεις πίνακες απαγορεύουν τη σύνδεση, τα πεδία που απαιτούν σύνδεση και οι τύποι δεδομένων πρέπει να είναι συνεπείς. Όταν πολλοί πίνακες συσχετίζονται με ερωτήματα, βεβαιωθείτε ότι τα συσχετισμένα πεδία πρέπει να έχουν ευρετήριο. Ακόμα κι αν έχετε διπλή ένωση πίνακα, δώστε προσοχή στην ευρετηρίαση πίνακα, στην απόδοση SQL. | αναγκαστική |
| | Βάρτσαρφιλντ | Το μήκος του ευρετηρίου πρέπει να καθοριστεί και δεν χρειάζεται να ευρετηριαστούν όλα τα πεδία, απλώς καθορίστε το μήκος του ευρετηρίου σύμφωνα με την πραγματική διάκριση κειμένου. Το μήκος και η διάκριση του ευρετηρίου είναι ένα ζεύγος αντιφάσεων, γενικά για δεδομένα τύπου συμβολοσειράς, τα ευρετήρια με μήκος 20 θα έχουν βαθμό διάκρισης μεγαλύτερο από 90%, ο οποίος μπορεί να προσδιοριστεί από τον βαθμό διάκρισης του count(διακριτό αριστερά (όνομα στήλης, μήκος ευρετηρίου))/count(*). | αναγκαστική |
| | Απαγορεύεται το θάμπωμα στην αναζήτηση σελίδας | Η αναζήτηση σελίδας απαγορεύει το θάμπωμα ή το πλήρες θάμπωμα, εάν είναι απαραίτητο, μεταβείτε στη μηχανή αναζήτησης για να το λύσετε. Λόγος απαγόρευσης: Το αρχείο ευρετηρίου έχει την ιδιότητα αντιστοίχισης αριστερού προθέματος του B-Tree και εάν η τιμή στα αριστερά δεν έχει καθοριστεί, τότε αυτό το ευρετήριο δεν μπορεί να χρησιμοποιηθεί. | αναγκαστική |
| | Παραγγελία από | Εάν υπάρχει σειρά ανά σενάριο, δώστε προσοχή στην τάξη του ευρετηρίου. Το τελευταίο πεδίο παραγγελίας κατά είναι μέρος του συνδυασμένου ευρετηρίου και τοποθετείται στο τέλος της σειράς συνδυασμού ευρετηρίου για να αποφευχθεί η file_sort και να επηρεαστεί η απόδοση του ερωτήματος. Παράδειγμα: όπου a=? και b=? Διαταγή από τον Γ. Ο δείκτης θα πρέπει να δημιουργηθεί ως a_b_c. Αντιπαράδειγμα: Εάν υπάρχει αναζήτηση εύρους στο ευρετήριο, τότε δεν μπορεί να χρησιμοποιηθεί η σειρά ευρετηρίου, όπως όπου το a>10 ταξινομεί το b. Το ευρετήριο a_b δεν μπορεί να ταξινομηθεί. | συστήνω | |
4. Γράψτε σιδερένιους κανόνες SQL
- | Σιδερένιος νόμος | Επίπεδο | παρατήρηση | αριθμός(*) | Μην χρησιμοποιείτε count(όνομα στήλης) ή count(σταθερά) αντί για count(*), η οποία είναι η σύνταξη για το τυπικό πλήθος γραμμών που ορίζεται από το SQL92, ανεξάρτητα από τη βάση δεδομένων και ανεξάρτητα από NULL και non-NULL. Το count(*) μετράει σειρές με τιμή NULL, ενώ το count(όνομα στήλης) δεν μετράει σειρές με αυτήν τη στήλη NULL. | αναγκαστική |
| | αριθμός (διακριτή στήλη) | Μετρά τον αριθμό των μοναδικών γραμμών στη στήλη εκτός από το NULL. Σημειώστε ότι το count(distinct col1, col2), εάν μία από τις στήλες είναι όλες NULL, τότε επιστρέφει 0 ακόμα κι αν η άλλη στήλη έχει διαφορετική τιμή. | αναγκαστική |
| | άθροισμα(col) | Όταν οι τιμές μιας στήλης είναι όλες NULL, το count(col) επιστρέφει 0, αλλά το sum(col) επιστρέφει NULL, επομένως πρέπει να γνωρίζετε τα ζητήματα NPE όταν χρησιμοποιείτε το sum(). Τα προβλήματα NPE μπορούν να αποφευχθούν με τους ακόλουθους τρόπους: επιλέξτε if(isnull(sum(g)), 0, sum(g)) από τον πίνακα. | αναγκαστική |
| | isnull | Χρησιμοποιήστε την isnull() για να προσδιορίσετε εάν πρόκειται για τιμή NULL. Το NULL είναι NULL σε σύγκριση με οποιαδήποτε τιμή. | αναγκαστική |
| | Λογική ερωτήματος σελιδοποίησης | Εάν η μέτρηση είναι 0, θα πρέπει να επιστραφεί απευθείας για να αποφευχθεί η εκτέλεση της επόμενης δήλωσης σελιδοποίησης. | αναγκαστική |
| | Εξωτερικά πλήκτρα και καταρράκτες | Απαγορεύεται η χρήση ξένων κλειδιών και διαδοχικών κλειδιών και όλες οι έννοιες ξένων κλειδιών πρέπει να επιλυθούν στο επίπεδο εφαρμογής. Αιτία: Τα ξένα κλειδιά και οι καταρράκτες δεν είναι κατάλληλα για κατανεμημένα συμπλέγματα υψηλής ταυτόχρονης χρήσης, οι διαδοχικές ενημερώσεις είναι ισχυρός αποκλεισμός, υπάρχει κίνδυνος καταιγίδων ενημερώσεων βάσης δεδομένων και τα ξένα κλειδιά επηρεάζουν την ταχύτητα εισαγωγής της βάσης δεδομένων. | αναγκαστική |
| | Αποθηκευμένες διαδικασίες | Οι αποθηκευμένες διαδικασίες απαγορεύονται και οι αποθηκευμένες διαδικασίες είναι δύσκολο να εντοπιστούν σφάλματα και να κλιμακωθούν και δεν είναι φορητές. | αναγκαστική |
| | Διόρθωση δεδομένων | Κατά τη διόρθωση δεδομένων (ειδικά τη διαγραφή ή την τροποποίηση εγγραφών), επιλέξτε πρώτα για να αποφύγετε την ακούσια διαγραφή και εκτελέστε τη δήλωση ενημέρωσης μόνο αφού επιβεβαιώσετε ότι είναι σωστή. | αναγκαστική |
| | Σε | Εάν δεν μπορεί να αποφευχθεί, ο αριθμός των καθορισμένων στοιχείων μετά την είσοδο θα πρέπει να ελέγχεται εντός 1000. | συστήνω |
| | Περικοπή πίνακα | Απαγορεύεται η χρήση του πίνακα περικοπής, ο οποίος είναι ταχύτερος από τη διαγραφή και χρησιμοποιεί λιγότερους πόρους συστήματος και καταγραφής, αλλά η περικοπή είναι χωρίς συναλλαγές και δεν ενεργοποιεί ενεργοποιητές, οι οποίοι μπορεί να προκαλέσουν ατυχήματα, επομένως μην χρησιμοποιείτε αυτήν τη δήλωση στον κώδικα ανάπτυξης. | αναφορά |
|
5. Το ORM χαρτογραφεί σιδερένιους νόμους
| - | Σιδερένιος νόμος | Επίπεδο | παρατήρηση | ερώτημα πίνακα | Η λίστα των πεδίων στα οποία απαγορεύεται η χρήση του * για ερωτήματα πρέπει να είναι σαφής σχετικά με τα πεδία που απαιτούνται. | αναγκαστική |
| | ΠΟΤΖΟ | Το χαρακτηριστικό Boolean της κλάσης POJO δεν μπορεί να προστεθεί στο is, ενώ το πεδίο της βάσης δεδομένων πρέπει να προστεθεί στο is, απαιτώντας αντιστοίχιση μεταξύ πεδίων και χαρακτηριστικών στο resultMap. | αναγκαστική |
| | Παράμετροι επιστροφής | Απαγορεύεται η χρήση resultClass ως παραμέτρου επιστροφής, ακόμα κι αν όλα τα ονόματα χαρακτηριστικών κλάσης αντιστοιχούν σε πεδία βάσης δεδομένων ένα προς ένα, πρέπει να οριστούν. Με τη σειρά του, κάθε πίνακας πρέπει να έχει ένα χαρακτηριστικό που αντιστοιχεί σε αυτόν. Αιτία: Διαμορφώστε τη σχέση αντιστοίχισης για να αντιστοιχίσετε το πεδίο με την κλάση DO για εύκολη συντήρηση. | αναγκαστική |
| | Παράμετροι επιστροφής | Απαγορεύεται η απευθείας χρήση του HashMap και του HashTable ως εξόδου του συνόλου αποτελεσμάτων ερωτήματος. Αιτία: Ο τύπος της τιμής του χαρακτηριστικού είναι μη ελεγχόμενος. | αναγκαστική |
| | sql.xml Διαμόρφωση παραμέτρων | sql.xml Χρησιμοποιήστε #{}, #param# για παραμέτρους διαμόρφωσης και μην χρησιμοποιείτε ${}, καθώς το ${} είναι επιρρεπές σε SQL injection. | αναγκαστική |
| | queryForList | Απαγορεύεται η χρήση του queryForList(String statementName, int start, int size) που συνοδεύει το Mybatis. Αιτία: Υλοποιείται με την ανάκτηση όλων των εγγραφών της δήλωσης SQL που αντιστοιχούν στο statementName στη βάση δεδομένων και, στη συνέχεια, χρησιμοποιώντας την υπολίστα για να λάβετε ένα υποσύνολο έναρξης, μεγέθους. | αναγκαστική |
| | Χρόνος ενημέρωσης | Κατά την ενημέρωση μιας εγγραφής πίνακα βάσης δεδομένων, πρέπει να ενημερώσετε ταυτόχρονα το χρόνο τροποποίησης της εγγραφής. | αναγκαστική |
| | Ενημέρωση εγγραφών πίνακα βάσης δεδομένων | Μην γράφετε μια μεγάλη και πλήρη διεπαφή ενημέρωσης δεδομένων (που μεταβιβάζεται ως κλάση POJO). Κατά την εκτέλεση της SQL, μην ενημερώνετε τα αμετάβλητα πεδία λόγω επιρρεπούς σε σφάλματα, αναποτελεσματικού και αυξημένου χώρου αποθήκευσης binlog. | συστήνω |
| | @Transactional | @Transactional Μην κάνετε κατάχρηση συναλλαγών. Οι συναλλαγές επηρεάζουν το QPS της βάσης δεδομένων. Επιπλέον, όταν χρησιμοποιείτε συναλλαγές, πρέπει να λάβετε υπόψη διάφορες πτυχές των σχημάτων επαναφοράς, συμπεριλαμβανομένης της επαναφοράς της προσωρινής μνήμης, της επαναφοράς της μηχανής αναζήτησης, της αντιστάθμισης μηνυμάτων, της στατιστικής διόρθωσης κ.λπ. | αναφορά |
| | Mybatis dynamic sql tags | < compareValue στο isEqual> είναι μια σταθερά σε σύγκριση με την τιμή του χαρακτηριστικού, συνήθως ένας αριθμός, που υποδεικνύει ότι η αντίστοιχη δήλωση SQL εκτελείται όταν είναι ίση. < isNotEmpty> υποδεικνύει ότι εκτελείται όταν δεν είναι κενό και δεν είναι μηδενικό. < isNotNull> υποδεικνύει ότι εκτελείται όταν δεν είναι null. | αναφορά | |
|