Inside SQLite: The 300KB File That Beat Oracle and Postgres
388 segments
الأقوال لا تكلف شيئاً
. أرني الكود البرمجي.
قال لينوس تورفالدز
ذلك في أغسطس عام 2000.
كان أحدهم يطلق
ادعاءات كبيرة حول
برمجته، فقال لينوس
باختصار: "أثبت ذلك".
اليوم، أريد أن أعرض
لكم برنامجاً أثبت ذلك
تماماً. ليس بالأقوال
ولا بالتسويق، بل بكود
جيد لدرجة أنه أصبح
بصمت المكون البرمجي
الأكثر انتشاراً في
تاريخ البشرية. أنا
أتحدث عن SQLite. الآن،
قبل أن تقول: "أجل، لقد
سمعت عنه". دعني أريك
شيئاً. تثبيتات MySQL حول
العالم، حوالي 5
ملايين. PostgreSQL، حوالي
مليون واحد. SQLite، أكثر
من تريليون. هذا ليس
خطأ مطبعياً. تريليون
عملية تثبيت نشطة. لقد
استخدمت SQLite اليوم
بالفعل، ربما عشرات
المرات. عندما فتحت
هاتفك هذا الصباح، كان
SQLite. أرسلت رسالة عبر
واتساب، SQLite. فتحت
متصفح كروم أو سفاري،
SQLite. التقطت صورة، فتم
حفظ البيانات الوصفية
في SQLite. كل آيفون، كل
أندرويد، كل متصفح، كل
جهاز ماك أو ويندوز،
يعمل في الخلفية بصمت
عبر SQLite. والمحرك
بالكامل، يتم تجميعه
في حوالي 300 كيلوبايت.
بدون خادم، بدون
إعدادات، بدون معالج
تثبيت، مجرد ملف واحد.
فكيف انتهى المطاف
بمحرك قاعدة بيانات
صغير كتبه شخص واحد
ليُشغل العالم؟ دعونا
نكتشف ذلك. إنه عام 2000.
مقاول برمجيات يُدعى
ريتشارد هيب يعمل على
المدمرة البحرية "يو
إس إس أوسكار أوستن"،
المصممة لتحمل أضرار
المعارك. ما هي وظيفته
؟ بناء برنامج يساعد
البحارة على إعادة
توجيه الأنابيب عندما
تتعرض أجزاء من
السفينة للتلف. فكر في
الأمر كنظام تحكم في
التمديدات. لكن
المخاطر هنا حياة أو
موت. المشكلة؟ قاعدة
البيانات التي كانوا
يستخدمونها هي Informix.
وكان Informix يحتاج إلى
خادم. عندما كان ذلك
الخادم يتعطل، وهو ما
كان يحدث، كان التطبيق
بالكامل ينهار. كان
البحارة ينقرون على
التطبيق مرتين فيظهر
لهم مربع حوار جميل. لا
يمكن الاتصال بخادم
قاعدة البيانات. فكر
ريتشارد: نحن على متن
سفينة حربية في معركة،
وخادم قاعدة البيانات
يمثل نقطة فشل واحدة.
لذا سأل من حوله: هل
توجد قاعدة بيانات لا
تحتاج إلى خادم؟ شيء
يقرأ ويكتب مباشرة على
القرص. لم يكن هناك شيء
موجود. قال له زميل: "يا
ريتشارد، لماذا لا
تكتب واحدة بنفسك؟"
وخلال فترة توقف
التمويل الحكومي،
عندما تجمدت العقود
لبضعة أشهر، فكر
ريتشارد: "حسناً،
سأكتب واحدة". فتح
محرراً للنصوص وبدأ في
بناء محرك قاعدة
بيانات من الصفر. بدون
تمويل استثماري،
وبدون فريق. مهندس
واحد فقط يحل مشكلته
الخاصة. بعد بضعة أشهر
، قام بنشرها عبر
الإنترنت. أسماها SQLite،
النسخة الخفيفة من SQL.
ظنّ أنه ربما سيجد
البعض فائدة فيه. لم
تكن لديه أدنى فكرة.
قبل أن نتعمق أكثر،
لنفهم ما الذي يجعل
SQLite مختلفاً. لأنك إن
عملت مع MySQL أو PostgreSQL،
فقد يكون تصورك الذهني
خاطئاً. في قاعدة
البيانات التقليدية،
كـ PostgreSQL، يتصل تطبيقك
عبر الشبكة بعملية
خادم منفصلة. يدير هذا
الخادم الاتصالات،
والذاكرة، والتخزين
المؤقت، ويتواصل مع
الملفات الفعلية على
القرص. إنه قوي، وقابل
للتوسع، لكنه معقد
أيضاً. عليك تهيئته،
وتأمينه، وضبطه،
والحفاظ على
استمرارية عمله. تقلب
SQLite هذا النموذج
بالكامل. لا يوجد خادم.
لا يوجد اتصال شبكي. لا
توجد عملية منفصلة.
SQLite عبارة عن مكتبة.
تقوم بربطها مباشرة
داخل تطبيقك. لذا،
عندما يستدعي كودك
دالة SQLite، فإنه يقرأ
ويكتب في ملف واحد على
القرص. هذا كل ما في
الأمر. ذلك الملف هو
قاعدة البيانات. فكر
في الأمر بهذه الطريقة
. قاعدة البيانات
التقليدية تشبه
الذهاب إلى مطعم. أنت
تطلب طلبك من النادل.
يتحدث النادل إلى
المطبخ. يصل الطعام
إليك. أما SQLite فهي كأن
تملك المطبخ بأكمله في
شقتك. أنت تذهب مباشرة.
ولهذا السبب يستخدمه
كل تطبيق جوال. لا
خوادم لإدارتها، لا
منافذ لفتحها، لا
ملفات تهيئة. قاعدة
بياناتك هي مجرد ملف
يمكنك نسخه، أو إرساله
بالبريد، أو رفعه على
Git. ورغم خفته، فإنه لا
يزال متوافقاً تماماً
مع معايير ACID.
المعاملات تعمل،
استعادة البيانات عند
التعطل تعمل، إنها
ليست لعبة. قاعدة
بيانات SQLite هي ملف
واحد، ينتهي عادةً بـ
.db أو .sqlite. ولكن ما
الذي يوجد داخل ذلك
الملف؟ الملف مقسم إلى
أجزاء ثابتة الحجم
تسمى صفحات. افتراضياً
، حجم كل صفحة هو 4096
بايت. وهو نفس حجم كتلة
القرص النموذجية. هذا
ليس من قبيل المصادفة.
صُمم SQLite ليعمل بكفاءة
مع طريقة عمل الأقراص
الفعلية. الصفحة
الأولى خاصة ومميزة.
تحتوي على ترويسة من 100
بايت بها بيانات وصفية
عن قاعدة البيانات،
وحجم الصفحة، وعدد
الصفحات الموجودة،
ورقم الإصدار، وسلسلة
نصية توضح أنها بتنسيق
SQLite 3 في البداية. هكذا
يمكن لأي أداة التعرف
على ملف SQLite فوراً. كل
صفحة أخرى هي جزء من
هيكل B-tree. وهذا هو جوهر
SQLite. إذا لم تكن على
دراية بهياكل B-trees،
فكر فيها كشجرة عائلة
لبياناتك. في الأعلى،
لديك عقدة جذرية. تلك
الجذر تشير إلى عقد
فرعية. تلك الفروع
تشير إلى المزيد من
الفروع. في القاع
تماماً، لديك عقد
ورقية تحتوي على
الصفوف الفعلية. لذا،
عند تشغيل استعلام مثل
"select star from users where ID equal
to 42"، فإن SQLite لا تفحص
كل صف. تبدأ من الجذر،
وتقارن المفاتيح،
وتختار الابن المناسب
للمتابعة، وتستمر حتى
تعثر على الصفحة التي
تحتوي على الصف 42. وهذا
يمثل تعقيداً زمنياً
لوغاريتمياً. إذا كان
لديك ملايين الصفوف،
فقد تقرأ SQLite ثلاث أو
أربع صفحات فقط للعثور
على ما تحتاجه. في
الواقع، تحتفظ SQLite
بنوعين من أشجار B-tree.
أحدهما هو شجرة B-tree
الخاصة بالجدول. هذه
تخزن بيانات الصفوف
الفعلية مفهرسة بمعرف
الصف (row ID). والآخر هو
شجرة B-tree الخاصة
بالفهرس. إذا قمت
بإنشاء فهرس على عمود
البريد الإلكتروني
مثلاً، تبني SQLite شجرة
منفصلة تكون فيها
المفاتيح هي عناوين
البريد والقيم هي
معرفات الصفوف. بهذه
الطريقة، يصبح البحث
عن طريق البريد
الإلكتروني سريعاً.
ابحث عن البريد في
شجرة الفهرس، واحصل
على معرف الصف، ثم
انتقل إلى شجرة الجدول
. وهذا هو نفس الهيكل
الأساسي الذي تستخدمه
PostgreSQL و MySQL و Oracle. لكن
SQLite تطبق ذلك في حوالي
150 ألف سطر من لغة C
بدلاً من الملايين.
حسناً، لدينا ملف
بصفحات منظمة كأشجار
B-trees. لكن إليك سؤالاً
مخيفاً. ماذا يحدث إذا
تعطل تطبيقك في منتصف
كتابة البيانات؟ إذا
كانت SQLite في منتصف
تحديث صفحة وانقطعت
الطاقة، تصبح تلك
الصفحة تالفة. تصبح
قاعدة بياناتك تالفة
تماماً. وهنا تصبح SQLite
ذكية. في الأصل،
استخدمت SQLite شيئاً
يسمى سجل التراجع (
rollback journal). لذا قبل
تعديل أي صفحة، كانت
تنسخ الصفحة الأصلية
إلى ملف سجل منفصل. إذا
حدث خطأ ما، يمكن لـ
SQLite الاستعادة من
السجل عند بدء التشغيل
التالي. لكن SQLite
الحديثة تستخدم شيئاً
أفضل. وهو سجل الكتابة
المسبقة، أو WAL. وإليك
كيف يعمل. بدلاً من
تعديل ملف قاعدة
البيانات الرئيسي
مباشرة، تضيف SQLite
التغييرات إلى ملف WAL
منفصل. يبقى ملف قاعدة
البيانات الرئيسي دون
مساس. لذا، عند تنفيذ
معاملة (transaction)، تكتب
SQLite علامة إتمام في
ملف WAL فقط. لا يتم لمس
ملف قاعدة البيانات
الفعلي بعد. لاحقاً،
أثناء نقطة التحقق (
checkpoint)، تدمج SQLite تلك
التغييرات في الملف
الرئيسي. لماذا هذا
أفضل؟ أولاً، لا يحجب
القراء والكتاب بعضهم
البعض. ينظر القراء
إلى الملف الرئيسي
بالإضافة إلى أي
إدخالات مكتملة في ملف
WAL. يقوم الكتاب
بالإلحاق في ملف WAL فقط
. لا حاجة لأقفال.
ثانياً، عمليات
الكتابة متسلسلة.
الإلحاق بملف أسرع
بكثير من التحديثات
العشوائية، خاصة على
أقراص SSD. ثالثاً،
استعادة النظام بعد
الانهيار بسيطة. إذا
كان ملف WAL يحتوي على
إدخالات غير مكتملة،
يتم تجاهلها ببساطة.
يظل الملف الرئيسي
دائماً في حالة متسقة.
وهكذا تمنحك SQLite
ضمانات ACID كاملة:
الذرية، والاتساق،
والعزل، والمتانة في
ملف واحد دون الحاجة
إلى خادم. لذا، يتم شحن
SQLite على مليارات
الأجهزة. ماذا يحدث
عندما تتسرب الأخطاء
البرمجية؟ اكتشف
ريتشارد هيب ذلك
بالطريقة الصعبة.
عندما بدأت أندرويد
بشحن SQLite على ملايين
الهواتف، ظهرت فجأة في
كل مكان أخطاء لم تظهر
أبداً أثناء الاختبار.
ماذا كانت استجابته؟
قضى عاماً كاملاً، بـ
60 ساعة عمل أسبوعياً،
في كتابة اختبارات حتى
حقق ما يسمى بتغطية 100%
MCDC. يرمز MCDC إلى تغطية
قرار الشرط المعدل.
إنه معيار اختبار
يُستخدم لبرمجيات
الطيران، وهي الأكواد
التي تعمل على
الطائرات. هذا يعني أن
كل فرع في كود الآلة
المترجم قد تم اختباره
في كلا الاتجاهين.
إليكم كيف تبدو مجموعة
اختبارات SQLite اليوم.
يتكون جوهر SQLite من
حوالي 160 ألف سطر من
لغة C. ماذا عن كود
الاختبار؟ حوالي 90
مليون سطر. هذه نسبة
تقريبية تبلغ 600 سطر من
الاختبار لكل سطر من
كود المنتج. تحاكي تلك
الاختبارات أخطاء
نفاد الذاكرة، وفشل
القرص، وانقطاع
الطاقة أثناء
المعاملات، وكل كارثة
يمكن أن تتخيلها. ما
النتيجة؟ تم اعتماد
SQLite للاستخدام في
الطائرات التجارية
بموجب معيار DO-178B، وهو
أحد أكثر معايير سلامة
البرمجيات صرامة. وكم
عدد الأشخاص الذين
يتابعون صيانة كل هذا؟
اثنان فقط. مهندسان
متفرغان يقومان
بصيانة قاعدة
البيانات الأكثر
انتشاراً في التاريخ.
بعد 24 عاماً، هناك
قواعد بيانات SQLite على
الأرض أكثر من عدد
البشر. في بعض الأحيان
، ليست الهندسة الأفضل
هي الأكثر تعقيداً. بل
هي التي يتم شحنها
بالفعل، وتعمل بالفعل
، ولا تعيق طريقك.
الكلام سهل، أرني
الكود. لقد أظهرت لنا
SQLite الكود، وهو يعمل
على هاتفك الآن.
Ask follow-up questions or revisit key timestamps.
يتناول الفيديو قصة نشأة وتطور SQLite، قاعدة البيانات الأكثر انتشاراً في العالم، والتي صممها ريتشارد هيب في عام 2000 لحل مشكلة الاعتماد على الخوادم في الأنظمة الحرجة. يشرح الفيديو كيف تتميز SQLite ببساطتها كملف واحد دون الحاجة لخادم، وكيف تستخدم هياكل B-trees وسجل الكتابة المسبقة (WAL) لضمان الكفاءة والموثوقية ومعايير ACID، وصولاً إلى استراتيجيات الاختبار الصارمة التي جعلتها تستخدم حتى في الطيران.
Videos recently processed by our community