AI un MySQL datu bāzes...
Tas ir nozīmīga kļūda, ka daudzi AI ģenerēti datu bāzu shēmu pašlaik ir noslieci izmantot VARCHAR(36) par id kolonnai.
Tas parasti tiek mudināts ar vēlmi nepieļaut neatļautu piekļuvi no ļaunprātīgiem dalībniekiem. Lai to panāktu, UUID (Universālie unikālie identifikatori) bieži tiek izmantoti kā drošības pasākums.
Ņemsim WordPress kā piemēru — tas parasti atklāj ierakstu ID URL kā ?p=45. Salīdzinot ar SEO draudzīgu formātu kā /2025/05/sample-post, šis skaitliskais ID ļauj lietotājiem iespējams novērtēt un piekļūt blakus esošajam saturam, mainot skaitli (piem., ?p=44). UUID savukārt nav secīgi un ir ievērojami grūtāk uzminēt.
UUID ir 36 rakstzīmju virknes, kas atbilst standarta formātam ar piecām sadaļām, atdalītām ar defisēm: 8-4-4-4-12. Katra sadaļa sastāv no heksadecimālām vērtībām:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Vienkāršs regex UUID validācijai izskatās šādi:
^[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}$
Lai gan UUID nodrošina drošību un pārnesamību, tie nāk ar kompromisiem. Tie ir ievērojami lielāki nekā veseli skaitļi, kas varētu palēnināt datu bāzes veiktspēju — īpaši izmantojot tos kā primārās atslēgas relāciju datu bāzēs. Indeksēšana, atmiņas izmantošana un vaicājumu ātrums viss cieš no UUID izmēra un ne-secīgā rakstura.
Zinotkārīgs par šo dizaina izvēli, es uzdodu šo jautājumu GitHub Copilot:
Es:
Kādēļ jūs izvēlējāties definēt id kolonnu kā VARCHAR(36) PRIMARY KEY datu bāzes struktūrā?
GitHub Copilot:
Es izvēlējos
VARCHAR(36)ID kolonnām vairāku konkrētu iemeslu dēļ:
- UUID uzglabāšana: 36 rakstzīmju garums atbilst UUID vērtībām, kas seko standartizētajam formātam.
- Daudznomnieku sistēmas: UUID palīdz izolēt nomniekiem, eliminējot secīgo ID noplūdi, vienkāršojot migrācijas un uzlabojot drošību.
- Datu pārnesamība: UUID nodrošina, ka eksportētajiem datiem nav ID konfliktu, importējot tos citā sistēmā.
Kompromisi:
- Lielāks uzglabāšanas izmērs (36 baiti pret 4 baitiem
INT)- Lēnāka indeksēšana un vaicājumu veiktspēja
- Augstāka atmiņas izmantošana
Alternatīvas apsvērt:
AUTO_INCREMENT INT/BIGINTBINARY(16)uzglabāt neapstrādātus UUID baitus efektīvāk- Pielāgota ID ģenerēšanas stratēģija
Lūdzu, ļaujiet man zināt, ja jūs labprāt redzētu citu pieeju.
Es:
Izmantojiet BIGINT UNSIGNED veiktspējam, bet saglabājiet guid lauku katrā ierakstā ārējām atsaucēm.
GitHub Copilot:
Es atjaunošu shēmu, lai izmantotu
BIGINT UNSIGNEDprimārajām atslēgām un pievienotuguidkolonnu ārējām atsaucēm. Šī hibrīdā pieeja apvieno labāko no abām stratēģijām:
- Veiktspēja: Efektīva indeksēšana un savienošana ar skaitliskajiem primārajiem atslēgām
- Drošība un pārnesamība: GUID atklāti API, saglabājot iekšējās ID drošas no uzskaitīšanas
Kopsavilkums:
BIGINT UNSIGNED: Ātrs, kompakts, secīgsGUID (VARCHAR): Unikāls, pārnesams, ārēji drošs
Kamēr relāciju datu bāzes piedāvā elastību izvēloties starp UUID, veseliem skaitļiem vai hibrīdajām pieejām, NoSQL sistēmas kā MongoDB iet pa citu ceļu.
MongoDB izmanto iebūvētu veidu, ko sauc par ObjectId savam _id laukam. Tas ir 12 baitu binārā vērtība, kas kodē:
Piemērs:
507f1f77bcf86cd799439011
VARCHAR(36). Tie arī ir draudzīgāki indeksēšanai.| Funkcija | UUID (VARCHAR) | BIGINT + GUID hibrīds | MongoDB ObjectId |
|---|---|---|---|
| Uzglabāšanas izmērs | 36 baiti | 8 + 36 baiti | 12 baiti |
| Indeksēšanas veiktspēja | Slikta | Izcila | Izcila |
| Secīgs / laika | Nē | Jā (tikai BIGINT) | Jā (caur laika zīmogu) |
| Cilvēkam lasāms formāts | Jā | Jā (GUID) | Nē (hex bāzēts) |
| Uzminams | Nē | Nē (tikai GUID) | Nē |
| Shēmas ieviešana | Strikta | Strikta | Elastīga |
Daudzi AI ģenerēti sistēmas izmanto NoSQL konfigurācijas kā MongoDB pēc noklusējuma, kad:
Šādos gadījumos tas bieži ir saprātīgs noklusējuma izvēle izmantot ObjectIds vai līdzīgus unikālus, laika sakārtotus identifikatorus.