חזרה
הצעה ל-SQLite: פרגמה אחת שתתקן ארבע ברירות מחדל גרועות
SiTech AI Team2 წთ. საკითხავი

הצעה ל-SQLite: פרגמה אחת שתתקן ארבע ברירות מחדל גרועות

פוסט בבלוג טוען שברירות המחדל של SQLite — מפתחות זרים כבויים, היעדר טיפוס קפדני, שגיאות SQLITE_BUSY מיידיות ועבודה בלי WAL — צריכות להיות מוחלפות בפרגמת edition בסגנון Rust.

SQLite הוא תקן התעשייה לאחסון נתונים מקומי, ובשונה משרת בסיס נתונים מסורתי הוא RDBMS כספרייה ולא כתהליך נפרד, מה שמשאיר את היישומים עצמאיים. אבל בפוסט שפורסם ב-15 ביולי טוען המפתח Mort שברירות המחדל שלו שגויות, ושהמנוע זקוק לדרך להתקדם בלי לשבור תוכנה קיימת.

ארבע ברירות מחדל שהמחבר היה משנה

הראשונה היא אילוצי מפתח זר, ש-SQLite מתעלם מהם אלא אם מריצים PRAGMA foreign_keys = ON. המחבר אומר שזה ה-RDBMS היחיד שהוא מכיר שאינו אוכף אותם כברירת מחדל, ושהנטייה של SQLite למחזר ערכי ROWID מחמירה את התוצאות: הפניה תלויה עשויה להצביע בשקט על השורה הלא נכונה. בדוגמה שלו, פוסט שהותיר משתמש שנמחק עובר לחשבון חדש שמקבל במקרה את אותו ID.

השנייה היא טיפוס. עמודה שהוצהרה כ-INTEGER משתמשת ב-INTEGER affinity, כך שטקסט שנראה כמו מספר נשמר כמספר וכל השאר נשמר כפי שהוא; לכן עמודת משך יכולה להכיל את המחרוזת “Way too long, I mean come on”. טבלאות STRICT מתקנות זאת — הכנסת TEXT לעמודת INTEGER מחזירה שגיאה — אבל אין פרגמה שהופכת את כל הטבלאות לקפדניות, ולכן יש להוסיף את המילה ידנית.

השלישית היא מקביליות: 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 כברירת מחדל.

הרעיון שאוב מה-editions של Rust. לדברי המחבר, edition מבוסס שנה עדיף על משהו כמו “use strict” ב-JavaScript, משום שברירות מחדל הגיוניות משתנות עם הזמן: אם בעתיד ייכנס לענף הראשי פורמט יומן כמו WAL2, PRAGMA edition = 2034 יפעיל אותו. קורא בתגובות מציין שכבר ב-SQL 99 מוגדרים כינויים לטיפוסים באמצעות CREATE DOMAIN.

SSiTech

SiTech — פיתוח אתרים בכוח ה-AI

אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.