
Առաջարկ SQLite-ի համար. մեկ պրագմա՝ չորս վատ կանխադրված արժեքների ուղղման համար
Բլոգի գրառման հեղինակը պնդում է, որ SQLite-ի կանխադրված արժեքները՝ անջատված արտաքին բանալիներ, խիստ տիպայնացման բացակայություն, անմիջական SQLITE_BUSY սխալներ և WAL-ի բացակայություն, պետք է փոխարինվեն Rust-ի ոճով edition պրագմայով։
SQLite-ը տեղային տվյալների պահպանման ոլորտային ստանդարտն է և, ի տարբերություն ավանդական տվյալների բազայի սերվերի, գրադարանի ձևով RDBMS է, այլ ոչ թե առանձին գործընթաց, ինչը հավելվածները պահում է ինքնաբավ։ Սակայն հուլիսի 15-ին հրապարակված գրառման մեջ ծրագրավորող Mort-ը պնդում է, որ կանխադրված արժեքները սխալ են, և որ շարժիչին անհրաժեշտ է առաջ շարժվելու ուղի՝ չկոտրելով գոյություն ունեցող ծրագրերը։
Չորս կանխադրված արժեք, որոնք հեղինակը կփոխեր
Առաջինը արտաքին բանալիների սահմանափակումներն են, որոնք SQLite-ը անտեսում է, եթե չգործարկեք PRAGMA foreign_keys = ON։ Հեղինակի խոսքով՝ սա միակ RDBMS-ն է, որ նա գիտի, որը դրանք կանխադրված չի պարտադրում, և ROWID արժեքների կրկնակի օգտագործման միտումը վատթարացնում է հետևանքները. կախված հղումը կարող է լուծել աննկատ սխալ տողի վրա։ Նրա օրինակում ջնջված օգտվողի թողած գրառումը ժառանգում է նոր հաշիվ, որը պատահաբար ստանում է նույն ID-ն։
Երկրորդը տիպայնացումն է։ INTEGER հռչակված սյունը օգտագործում է INTEGER affinity, ուստի թվի նման տեքստը պահվում է որպես թիվ, իսկ մնացածը՝ ինչպես կա. այդ պատճառով տևողության սյունը կարող է պարունակել «Way too long, I mean come on» տողը։ Սա ուղղում են STRICT աղյուսակները. INTEGER սյան մեջ TEXT տեղադրելը սխալ է առաջացնում, սակայն բոլոր աղյուսակները խիստ դարձնող պրագմա չկա, ուստի բառը պետք է ձեռքով ավելացնել։
Երրորդը զուգահեռականությունն է. SQLite-ը թույլ է տալիս շատ ընթերցողներ, բայց միայն մեկ գրող, և կանխադրված գրելու կողպեքը վերցնել փորձող երկրորդ գործընթացը անմիջապես ստանում է SQLITE_BUSY սխալ։ Հեղինակը նախընտրում է սպասել կողպեքին մինչև ժամանակի սահմանը (PRAGMA busy_timeout = 5000)՝ կարգավորում, որը, ըստ նրա, ավելացրել է միայն իրական խափանումներից հետո։
Արտադրողականությունը և edition-ի առաջարկը
Չորրորդը արտադրողականությունն է։ Նախնական գրանցամատյանը կանխադրված անջատված է. PRAGMA journal_mode = WAL-ի միացումը շատ դեպքերում կտրուկ արագացնում է գրառումները, իսկ PRAGMA synchronous = NORMAL-ի հետ միասին թույլ է տալիս զգալիորեն կրճատել սկավառակի համաժամացումները՝ առանց տվյալների վնասման ռիսկի։ Մանրամասների համար գրառումը հղում է Սիլվեն Կերկուրի՝ SQLite-ը սերվերների համար օպտիմիզացնելու մասին հոդվածին։
Այս ամենը հետհամատեղելիությունը չխախտելով ուղղելու համար — ինչը սովորաբար նշվում է որպես կանխադրված արժեքների պահպանման հիմնավորում — հեղինակը առաջարկում է մեկ սուպեր պրագմա. PRAGMA edition = 2026, որը կլինի foreign_keys = ON, busy_timeout = 5000, journal_mode = WAL և synchronous = NORMAL-ի համարժեքը, իսկ STRICT աղյուսակները՝ նոր կանխադրվածը։
Գաղափարը փոխառված է Rust-ի editions-ից։ Հեղինակի կարծիքով՝ տարվա վրա հիմնված edition-ը ավելի լավն է, քան JavaScript-ի «use strict»-ը, քանի որ խելամիտ կանխադրված արժեքները ժամանակի ընթացքում փոխվում են. եթե ապագայում հիմնական ճյուղ մտնի WAL2-ի նման գրանցամատյանի ձևաչափ, PRAGMA edition = 2034-ը կմիացնի այն։ Ընթերցողը մեկնաբանության մեջ նշում է, որ SQL 99-ն արդեն սահմանում է տիպերի համարժեքներ CREATE DOMAIN-ի միջոցով։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։