AI και Βάσεις Δεδομένων MySQL...
Ένα αξιοσημείωτο σφάλμα είναι ότι πολλά σχήματα βάσεων δεδομένων που δημιουργούνται από AI επί του παρόντος τείνουν να ευνοούν τη χρήση του VARCHAR(36) για τη στήλη id.
Αυτό συνήθως παρακινείται από μια επιθυμία να αποτραπεί η μη εξουσιοδοτημένη πρόσβαση από κακόβουλους παράγοντες. Για να επιτευχθεί αυτό, τα UUID (Universally Unique Identifiers) χρησιμοποιούνται συχνά ως μέτρο ασφάλειας.
Ας πάρουμε το WordPress ως παράδειγμα — συνήθως εκθέτει ID δημοσιεύσεων στη διεύθυνση URL ως ?p=45. Σε σύγκριση με ένα φιλικό προς SEO μορφότυπο όπως /2025/05/sample-post, αυτό το αριθμητικό ID επιτρέπει στους χρήστες να μαντεύουν και να αποκτούν πρόσβαση σε παρακείμενο περιεχόμενο αλλάζοντας τον αριθμό (π.χ. ?p=44). Τα UUID από την άλλη πλευρά δεν είναι διαδοχικά και είναι πολύ πιο δύσκολα να μαντευτούν.
Τα UUID είναι συμβολοσειρές 36 χαρακτήρων που ακολουθούν ένα τυπικό μορφότυπο με πέντε τμήματα διαχωρισμένα με παύλες: 8-4-4-4-12. Κάθε τμήμα αποτελείται από δεκαεξαδικές τιμές:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Ένα απλό regex για την επικύρωση UUID μοιάζει έτσι:
^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$
Ενώ τα UUID προσφέρουν ασφάλεια και φορητότητα, έρχονται με συμβιβασμούς. Είναι σημαντικά μεγαλύτερα από τους ακέραιους, κάτι που μπορεί να επιβραδύνει την απόδοση της βάσης δεδομένων — ειδικά όταν χρησιμοποιούνται ως πρωτεύοντα κλειδιά σε σχεσιακές βάσεις δεδομένων. Η ευρετηρίαση, η χρήση μνήμης και η ταχύτητα ερωτημάτων υποφέρουν όλα λόγω του μεγέθους και της μη διαδοχικής φύσης των UUID.
Περίεργος για αυτή την επιλογή σχεδίασης, έθεσα στον GitHub Copilot την ακόλουθη ερώτηση:
Εγώ:
Γιατί επιλέξατε να ορίσετε τη στήλη id ως VARCHAR(36) PRIMARY KEY στη δομή της βάσης δεδομένων;
GitHub Copilot:
Επέλεξα
VARCHAR(36)για τις στήλες ID για μερικούς συγκεκριμένους λόγους:
- Αποθήκευση UUID: Το μήκος 36 χαρακτήρων περιλαμβάνει τιμές UUID, οι οποίες ακολουθούν ένα τυποποιημένο μορφότυπο.
- Συστήματα πολλαπλών ενοικιαστών: Τα UUID βοηθούν στην απομόνωση των ενοικιαστών εξαλείφοντας τις διαρροές διαδοχικών ID, απλοποιώντας τις μεταναστεύσεις και βελτιώνοντας την ασφάλεια.
- Φορητότητα δεδομένων: Τα UUID διασφαλίζουν ότι τα εξαγόμενα δεδομένα δεν θα υποστούν συγκρούσεις ID κατά την εισαγωγή σε άλλο σύστημα.
Συμβιβασμοί:
- Μεγαλύτερο μέγεθος αποθήκευσης (36 bytes vs. 4 bytes για
INT)- Πιο αργή απόδοση ευρετηρίασης και ερωτημάτων
- Υψηλότερη χρήση μνήμης
Εναλλακτικές για εξέταση:
AUTO_INCREMENT INT/BIGINTBINARY(16)για πιο αποτελεσματική αποθήκευση ακατέργαστων UUID bytes- Μια προσαρμοσμένη στρατηγική δημιουργίας ID
Ενημερώστε με αν προτιμάτε διαφορετική προσέγγιση.
Εγώ:
Χρησιμοποιήστε BIGINT UNSIGNED για απόδοση, αλλά διατηρήστε ένα πεδίο guid σε κάθε εγγραφή για εξωτερικές αναφορές.
GitHub Copilot:
Θα ενημερώσω το σχήμα για να χρησιμοποιεί
BIGINT UNSIGNEDως πρωτεύον κλειδί προσθέτοντας μια στήληguidγια εξωτερικές αναφορές. Αυτή η υβριδική προσέγγιση συνδυάζει το καλύτερο και των δύο στρατηγικών:
- Απόδοση: Αποτελεσματική ευρετηρίαση και συνδέσεις μέσω αριθμητικών πρωτευόντων κλειδιών
- Ασφάλεια και φορητότητα: GUID εκτεθειμένα σε API, διατηρώντας τα εσωτερικά ID ασφαλή από απαρίθμηση
Περίληψη:
BIGINT UNSIGNED: Γρήγορο, συμπαγές, διαδοχικόGUID (VARCHAR): Μοναδικό, φορητό, εξωτερικά ασφαλές
Ενώ οι σχεσιακές βάσεις δεδομένων προσφέρουν ευελιξία στην επιλογή μεταξύ UUID, ακεραίων ή υβριδίων, τα συστήματα NoSQL όπως το MongoDB παίρνουν διαφορετικό δρόμο.
Το MongoDB χρησιμοποιεί έναν ενσωματωμένο τύπο που ονομάζεται ObjectId για το πεδίο _id του. Αυτή είναι μια δυαδική τιμή 12 bytes που κωδικοποιεί:
Παράδειγμα:
507f1f77bcf86cd799439011
VARCHAR(36). Είναι επίσης πιο φιλικά στην ευρετηρίαση.| Χαρακτηριστικό | UUID (VARCHAR) | BIGINT + GUID Υβρίδιο | MongoDB ObjectId |
|---|---|---|---|
| Μέγεθος αποθήκευσης | 36 bytes | 8 + 36 bytes | 12 bytes |
| Απόδοση ευρετηρίασης | Κακή | Εξαιρετική | Εξαιρετική |
| Διαδοχική / χρονική σειρά | Όχι | Ναι (μόνο BIGINT) | Ναι (μέσω χρονοσφραγίδας) |
| Αναγνώσιμη μορφή | Ναι | Ναι (GUID) | Όχι (βασισμένο σε hex) |
| Προβλέψιμο | Όχι | Όχι (μόνο GUID) | Όχι |
| Εφαρμογή σχήματος | Αυστηρή | Αυστηρή | Ευέλικτη |
Πολλά συστήματα που δημιουργούνται από AI προεπιλέγουν σε διαμορφώσεις NoSQL παρόμοιες με MongoDB όταν:
Σε τέτοιες περιπτώσεις, η χρήση ObjectIds ή παρόμοιων μοναδικών, χρονικά ταξινομήσιμων αναγνωριστικών είναι συχνά μια λογική προεπιλεγμένη επιλογή.