Geri qayıt
SQLite üçün təklif: dörd pis standart davranışı düzəldəcək bir pragma
SiTech AI Team2 წთ. საკითხავი

SQLite üçün təklif: dörd pis standart davranışı düzəldəcək bir pragma

Bloq yazısı iddia edir ki, SQLite-ın standart davranışları — söndürülmüş xarici açarlar, ciddi tipləşdirmənin olmaması, dərhal SQLITE_BUSY xətaları və WAL-sız işləmə — köhnə proqramları pozmadan Rust üslubunda edition pragması ilə dəyişdirilməlidir.

SQLite yerli məlumat saxlama üçün sənaye standartıdır və ənənəvi verilənlər bazası serverindən fərqli olaraq ayrı proses deyil, kitabxana şəklində RDBMS-dir ki, bu da tətbiqləri özünütəmin edir. Lakin 15 iyulda dərc olunmuş yazıda proqramçı Mort standart davranışların səhv olduğunu və mühərrikin köhnə proqramları pozmadan irəliləmə yolu lazım olduğunu iddia edir.

Müəllifin dəyişdirmək istədiyi dörd standart davranış

Birincisi, PRAGMA foreign_keys = ON işlədilmədikcə SQLite-ın saymadığı xarici açar məhdudiyyətləridir. Müəllif deyir ki, bu, onların standart olaraq tətbiq etmədiyi bildiyi yeganə RDBMS-dir və SQLite-ın ROWID dəyərlərini təkrar istifadə etmə meyli nəticələri ağırlaşdırır: asılı qalmış istinad səssizcə yanlış sətri göstərə bilər. Onun nümunəsində silinmiş istifadəçinin qoyub getdiyi yazını təsadüfən eyni ID-ni alan yeni hesab mənimsəyir.

İkincisi tipləşdirmədir. INTEGER kimi elan edilmiş sütun INTEGER affinity istifadə edir; yəni rəqəmə bənzəyən mətn rəqəm kimi, qalan hər şey olduğu kimi saxlanılır. Buna görə müddət sütunu “Way too long, I mean come on” mətnini saxlaya bilir. STRICT cədvəllər bunu düzəldir — INTEGER sütuna TEXT daxil etmək xəta verir — lakin bütün cədvəlləri ciddi edən pragma yoxdur, ona görə açar sözü əl ilə əlavə etmək lazımdır.

Üçüncüsü eyni vaxtlılıqdır: SQLite çoxlu oxucuya, amma yalnız bir yazıcıya icazə verir və standart olaraq yazma kilidini almağa çalışan ikinci proses dərhal SQLITE_BUSY xətası alır. Müəllif kilidi müəyyən vaxt həddinə qədər gözləməyi üstün tutur (PRAGMA busy_timeout = 5000); bu ayarı yalnız istehsalatda real çökmələrdən sonra əlavə etdiyini deyir.

Məhsuldarlıq və edition təklifi

Dördüncüsü məhsuldarlıqdır. Qabaqcadan yazma jurnalı standart olaraq söndürülüb; PRAGMA journal_mode = WAL-ın işə salınması əksər hallarda yazmanı kəskin sürətləndirir və PRAGMA synchronous = NORMAL ilə birlikdə məlumatların korlanması riski olmadan disk sinxronizasiyalarının sayını xeyli azaldır. Yazı təfərrüatlar üçün Sylvain Kerkour-un SQLite-ı serverlər üçün optimallaşdırmaq məqaləsinə istinad edir.

Bütün bunları geriyə uyğunluğu pozmadan düzəltmək üçün — standart davranışların saxlanmasının adi əsaslandırması — müəllif bir super pragma təklif edir: PRAGMA edition = 2026; foreign_keys = ON, busy_timeout = 5000, journal_mode = WAL və synchronous = NORMAL üçün ləqəb, standart olaraq isə STRICT cədvəllər.

İdeya birbaşa Rust editions-dan götürülüb. Müəllifə görə ilə əsaslanan edition JavaScript-dəki “use strict” kimi yanaşmadan daha yaxşıdır, çünki məntiqli standart davranışlar zamanla dəyişir: gələcəkdə WAL2 kimi jurnal formatı əsas budağa daxil olsa, PRAGMA edition = 2034 onu təyin edəcək. Bir oxucu şərhdə qeyd edir ki, SQL 99 artıq CREATE DOMAIN vasitəsilə tip ləqəblərini müəyyən edir.

SSiTech

SiTech — AI ilə gücləndirilmiş veb hazırlanması

Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.