شرح ملفات SQLite: البنية، حالات الاستخدام، والحدود الرئيسية

ملف SQLite هو ملف قرص واحد يحتوي على قاعدة بيانات علاقة كاملة — الجداول، والفهارس، والمخطط معاً. تطلق وثائق SQLite الرسمية عليه اسم "ملف قاعدة البيانات الرئيسي" وتشير إلى أن "الحالة الكاملة لقاعدة بيانات SQLite عادة ما تكون محتواة" فيه. كلمة عادةً تؤدي دوراً حقيقياً في تلك الجملة.
إذا تم تسليمك يوماً ما ملفاً بامتداد .db أو .sqlite أو .sqlite3 وتساءلت عما إذا كنت قد تلقيت جميع البيانات، فهذا هو التنسيق الذي يجب فهمه بشكل صحيح.
ما هو ملف SQLite في الواقع
تصف SQLite نفسها بأنها "مكتبة داخل العملية تنفذ محرك قاعدة بيانات SQL تعاملياً، ذاتي الاحتواء، بدون خادم، وبدون تكوين". وتذكر الصفحة نفسها أن SQLite "ليس لديها عملية خادم منفصلة". يقوم التطبيق بربط المكتبة وقراءة الملف.
يترتب على ذلك نتيجتان. أولاً، تنتقل قاعدة البيانات كعنصر واحد، ولهذا السبب تقوم العديد من التطبيقات بشحن بياناتها بهذه الطريقة. ثانياً، يجب أن يكون التنسيق مستقراً للغاية، لأن هذه الملفات تعيش لفترة أطول من البرامج التي كتبتها. تدرج SQLite "تنسيق ملف مستقر ودائم" ضمن ميزاتها الرئيسية. كما تذكر أن الكود متاح للملكية العامة، وهو "مجاني للاستخدام لأي غرض، تجاري أو خاص".
من السهل الاستهانة بحجم الانتشار. تقول صفحة التعريف الخاصة بـ SQLite نفسها إنها "قاعدة البيانات الأكثر انتشاراً في العالم مع تطبيقات أكثر مما يمكننا حصرها".
ماذا يوجد داخل الملف
ترويسة الـ 100 بايت
تحدد البايتات الأولى التنسيق. عند الإزاحة 0، يحمل الملف سلسلة ترويسة مكونة من 16 بايتاً: SQLite format 3\000. هذا التوقيع هو الطريقة التي تتعرف بها الأدوات على الملف بغض النظر عن امتداده.
الحقل التالي يكتسب أهمية أكبر مما يبدو عليه. عند الإزاحة 16 يوجد عدد صحيح بحجم 2 بايت يحمل "حجم صفحة قاعدة البيانات بالبايت". وتذكر الوثائق أنه "يجب أن يكون من قوى العدد اثنين بين 512 و 32768 بما في ذلك هذين الرقمين، أو القيمة 1 التي تمثل حجم صفحة يبلغ 65536". يتم تخزين جميع الحقول متعددة البايتات في الترويسة بحيث يكون البايت الأكثر أهمية أولاً.
يتبع ذلك بايتان آخران عند الإزاحتين 18 و 19: إصدار كتابة تنسيق الملف وإصدار القراءة. وتشير الوثائق إلى أن القيمة هي "1 للأنظمة القديمة؛ 2 لـ WAL".
صفحات، وليست صفوفاً
تحت الترويسة، يكون الملف عبارة عن مكدس من الصفحات ذات الحجم الثابت. المواصفات صريحة في هذا الشأن: "يتكون ملف قاعدة البيانات الرئيسي من صفحة واحدة أو أكثر. حجم الصفحة هو من قوى العدد اثنين بين 512 و 65536 بما في ذلك هذين الرقمين. جميع الصفحات داخل قاعدة البيانات نفسها تكون بنفس الحجم".
يتم ترقيم الصفحات بدءاً من 1، والحد الأقصى لرقم الصفحة هو 4,294,967,294. تعيش الجداول والفهارس داخل تلك الصفحات كبنى B-tree، ولهذا السبب لا يظهر لك محرر النصوص سوى القليل جداً.
الملفات الجانبية المرافقة التي لا يذكرها أحد
هذا هو الجزء الذي يقع فيه الكثيرون. تقول الوثائق إن الحالة الكاملة تكون "عادةً" في ملف واحد. ثم تذكر الاستثناء. أثناء المعاملة، تقوم SQLite "بتخزين معلومات إضافية في ملف ثانٍ يسمى 'rollback journal'". في وضع WAL، يكون هذا الملف الثاني عبارة عن سجل كتابة مسبقة (write-ahead log).
لذلك، فإن النسخة المأخوذة أثناء قيام التطبيق بالكتابة قد تفتقر إلى البيانات المؤكدة التي لا تزال تعيش في الملف الجانبي. إذا أرسل لك زميل ملف .db فقط دون أي شيء آخر، وبدت الأرقام قديمة بعض الشيء، فهذا هو أول شيء يجب التحقق منه.
كيفية فتح ملف SQLite
هناك ثلاثة طرق، والطريقة الصحيحة تعتمد على ما تنوي القيام به بعد ذلك.
قراءته باستخدام برنامج عرض. تفتح برامج عرض SQLite المخصصة لسطح المكتب والمتصفح الملف، وتعرض الجداول، وتتيح لك التنقل بين الصفوف. هذه هي أسرع طريقة للإجابة على سؤال "ماذا يوجد هنا أصلاً"، وهي كافية عادةً لإلقاء نظرة أولى.
الاستعلام عنه باستخدام سطر الأوامر أو مكتبة برمجية. تقرأ واجهة تفاعل sqlite3 والروابط البرمجية للمكتبة القياسية في Python و Node ومعظم اللغات الأخرى التنسيق مباشرة. هذا هو الطريق المناسب عندما تكون على دراية بالمخطط بالفعل وتريد رقماً محدداً.
تصدير جدول وتحليله في مكان آخر. قم بتصدير جدول إلى ملف CSV واستخدمه في أي أداة يستخدمها فريقك بالفعل. ستفقد العلاقات بين الجداول، وهو الشيء الوحيد الذي كان التنسيق يحميه. قم بتصدير النتيجة المدمجة بدلاً من الجداول الخام حيثما أمكن ذلك.
لماذا قد تقول أداة ما إن الملف ليس قاعدة بيانات
توضح المواصفات هذا الأمر. يبدأ كل ملف صالح بسلسلة ترويسة مكونة من 16 بايتاً، وهي SQLite format 3\000. القارئ الذي يفتح ملفاً ولا يجد هذا التوقيع عند الإزاحة 0 لم يتم تسليمه قاعدة بيانات SQLite.
تغطي ثلاثة أسباب عادية معظم الحالات. إما أن الملف تم نقله بشكل غير كامل، وبالتالي فإن الترويسة موجودة ولكن بقية الملف مقتطعة. أو أن الملف مشفر أو مغلف بواسطة تطبيق ما، وبالتالي فإن البايتات الأولى هي شيء آخر. أو أن الامتداد مضلل، وما تلقيته بالفعل كان تصديراً عادياً تمت إعادة تسميته بواسطة شخص أراد المساعدة.
ما هو الحجم الأقصى الذي يمكن أن يصل إليه ملف SQLite
أكبر مما يوحي به السؤال عادةً. تذكر صفحة حدود SQLite أن الحد الأقصى لحجم ملف قاعدة البيانات هو 4,294,967,294 صفحة. عند الحد الأقصى لحجم الصفحة البالغ 65,536 بايت، فإن ذلك يعني حداً أقصى لحجم قاعدة البيانات يبلغ حوالي 281 تيرابايت.
تتسم الصفحة بالصراحة التامة بشأن هذا الرقم. وتشير إلى أن الحد الأقصى "لم يتم اختباره نظراً لأن المطورين لا يملكون إمكانية الوصول إلى أجهزة قادرة على الوصول إلى هذا الحد".
تقتصر أعداد الصفوف بنفس الجدار. الحد الأقصى النظري هو 2^64 صفاً في الجدول. وتشير الوثائق إلى أن هذا الحد "لا يمكن الوصول إليه لأنه سيتم الوصول إلى الحد الأقصى لحجم قاعدة البيانات البالغ 281 تيرابايت أولاً".
بالنسبة للعمل العملي، فإن الفائدة المفيدة هي عكس وجود حد. إذا سلمك شخص ما ملف .db وحذرك من أنه كبير الحجم، فمن المؤكد تقريباً أن التنسيق ليس هو ما سيوقفك. إن حجم الصفحة المختار عند إنشاء الملف، وما إذا كان يحمل فهارس أم لا، سيؤثر على التجربة بشكل أكبر بكثير من أي سقف موثق.
أين تصادف ملفات SQLite
- صادرات التطبيقات. غالباً ما تخزن تطبيقات سطح المكتب والهواتف المحمولة السجل والإعدادات وسجلات الرسائل في ملف SQLite يمكنك نسخه.
- تسليم التحليلات. يقوم المهندسون بشحن لقطة من البيانات كملف واحد بدلاً من منح حق الوصول إلى قاعدة البيانات.
- الأجهزة والقياس عن بعد. تكتب الأنظمة المدمجة محلياً لعدم وجود خادم للتواصل معه.
- الأرشيفات. الاستقرار طويل الأجل للتنسيق يجعله خياراً شائعاً لمجموعات البيانات التي يجب أن تظل قابلة للقراءة لسنوات.
- الأجزاء الداخلية للمتصفح والأدوات. تحتفظ العديد من الأدوات المحلية بالحالة بهذه الطريقة، ولهذا السبب يظهر الامتداد في تذاكر الدعم.
ما هي فائدة ملفات WAL والـ journal
ربما قمت بنسخ ملف .db ووجدت ملف -wal أو -journal بجواره. هذه هي الملفات الجانبية المرافقة التي تصفها المواصفات، وحذفها هو الطريقة التي يفقد بها الأشخاص البيانات.
سجل التراجع (rollback journal) هو الآلية الأقدم. قبل تغيير الصفحة، تكتب SQLite النسخة الأصلية من تلك الصفحة في السجل. إذا تمت مقاطعة الكتابة، يمكن استعادة النسخة الأصلية، وهو ما يجعل المعاملة تنجو من الانهيار.
سجل الكتابة المسبقة (write-ahead log) يعكس هذا الترتيب. تذهب التغييرات إلى السجل أولاً ويتم تحديث الملف الرئيسي لاحقاً. تحدد الترويسة الوضع الذي توجد فيه قاعدة البيانات. إصدار كتابة تنسيق الملف عند الإزاحة 18 هو "1 للأنظمة القديمة؛ 2 لـ WAL".
تتبع القاعدة العملية مباشرة من الجملة المتعلقة بالحالة الكاملة. لنفترض أن قاعدة البيانات في وضع WAL وقام شخص ما بتسليمك الملف الرئيسي فقط. قد لا تزال أحدث التغييرات المؤكدة موجودة في السجل الذي لم تتلقاه.
لذلك عندما يتم إعطاؤك ملف قاعدة بيانات، اطرح سؤالين. هل تم إغلاق التطبيق بشكل نظيف عند أخذ النسخة، وهل جاء أي شيء آخر معها؟ عادةً ما تكون الإجابتان نعم، والمرة الوحيدة التي لا تكونان فيها كذلك هي المرة التي تختلف فيها الأرقام بهدوء عن بيئة الإنتاج الفعلية.
ملف SQLite مقابل CSV مقابل Parquet
| ملف SQLite | CSV | Parquet | |
|---|---|---|---|
| الشكل | جداول متعددة، ملف واحد | جدول واحد، ملف واحد | جدول واحد، ملف واحد أو مجلد |
| الأنواع | مخزنة مع البيانات | يستنتجها القارئ | مخزنة مع البيانات |
| العلاقات | محفوظة، عبر المفاتيح والفهارس | مفقودة | مفقودة |
| قابلة للقراءة البشرية | لا | نعم | لا |
| مكتوبة ليتم الاستعلام عنها | نعم، باستخدام SQL | لا | نعم، بواسطة محركات التحليلات |
| الفشل الشائع | فقدان الملف الجانبي journal أو WAL | تخمين النوع والمحدد | دعم سلسلة الأدوات |
إذا كنت تعمل مع هذه التنسيقات بانتظام، فإن شروحاتنا حول ملفات Parquet و ملفات TSV تغطي نفس الجوانب لهذين التنسيقين.
لماذا تختار الفرق هذا التنسيق
لا شيء لتشغيله. نظراً لأن SQLite "ليس لديها عملية خادم منفصلة"، فإن عملية التسليم هي مجرد نسخ ملف بدلاً من تذكرة إعداد وتجهيز خادم.
تنجو الأنواع من الرحلة. يصل عمود التاريخ كـ تاريخ. وأي شخص شاهد قارئ CSV يحول معرفاً إلى ترميز علمي يدرك قيمة ذلك.
تنجو العلاقات أيضاً. تظل العديد من الجداول المترابطة معاً في عنصر واحد، وبالتالي تظل عمليات الربط (joins) التي جعلت البيانات ذات معنى متاحة.
المتانة مصممة في صلبها. تدرج SQLite المعاملات "حتى بعد انقطاع الطاقة" ضمن ميزاتها الأساسية، ولهذا السبب تعتمد عليها الكثير من البرمجيات المدمجة.
حدود تستحق المعرفة
ملف واحد، كاتب واحد في كل مرة. المحرك مدمج وليس مخدوماً، لذا فإن نموذج التزامن يختلف عن قاعدة بيانات العميل-الخادم. هذا خيار تصميمي وليس عيباً، لكنه يحدد ما يصلح الملف له.
حجم الصفحة ثابت عند الإنشاء. كل صفحة في قاعدة البيانات تكون بنفس الحجم، ويتم تسجيل هذا الحجم في الترويسة. تختار ذلك مرة واحدة.
قاعدة الملف الجانبي مجدداً. أي عملية نسخ أو نسخ احتياطي أو تحميل تلتقط الملف الرئيسي فقط يمكن أن تفقد كل ما كان موجوداً في السجل (journal) أو سجل الكتابة المسبقة (write-ahead log).
العتامة. لا يمكن تصفح ملف SQLite سريعاً بالطريقة التي يتم بها تصفح ملف CSV. قراءته تتطلب أداة، وهذا هو العائق الذي يعطل الكثير من عمليات التحليل.
كيفية الحصول على إجابات من ملف SQLite
الطريق التقليدي هو تثبيت برنامج عميل، وفتح الملف، ومعرفة المخطط، والبدء في كتابة SQL. هذا أمر جيد عندما تكون على دراية بالجداول بالفعل. ولكنه بطيء عندما يتم تسليمك الملف هذا الصباح والاجتماع بعد ظهر اليوم.
الطريق الأقصر هو طرح السؤال مباشرة. يتيح لك Powerdrill Bloom العمل مع بياناتك باللغة الطبيعية ويعيد إجابة مرفقة بمصدرها. تعد الصفحة الرئيسية بأن "كل رقم يعود مع الصفحة والصف والشكل الكامن وراءه". ومن هناك، يمكن لنفس مساحة العمل إنتاج مخططات أو جداول بيانات أو عرض تقديمي قصير.
هناك صفحتان ذاتا صلة تستحقان المعرفة إذا كان هذا هو سير عملك المعتاد. تغطي صفحة Chat with Database المسار الحواري للوصول إلى البيانات المهيكلة، وتغطي صفحة Text to SQL الحالة التي تريد فيها الاستعلام نفسه. وإذا وصلك الملف المصدر كتصدير مسطح بدلاً من ذلك، فإن صفحة CSV AI assistant تغطي هذا المسار.
شيء آخر تخبرك به الترويسة
نظراً لأن حجم الصفحة يقع عند إزاحة ثابتة، يمكنك معرفة شيء مفيد عن الملف قبل فتحه بشكل صحيح. قاعدة البيانات التي تم إنشاؤها بحجم صفحة يبلغ 4,096 بايت تتصرف بشكل مختلف عن تلك التي تم إنشاؤها بصفحات بحجم 65,536 بايت. تم اتخاذ هذا الاختيار مرة واحدة، عند إنشاء الملف.
إنه ليس رقماً تغيره بشكل عشوائي بعد ذلك. إنه ينتمي إلى نفس الفئة الذهنية لقرار المخطط بدلاً من كونه مجرد إعداد.
خاتمة
ملف SQLite هو قاعدة بيانات كاملة في عنصر واحد. يحتوي على توقيع مكون من 16 بايتاً، وحجم صفحة مسجل عند الإزاحة 16، ومكدس من الصفحات ذات الحجم الثابت التي تحمل جداولك وفهارسك. إنه ينتقل بسهولة، ويحافظ على أنواعه، ويظل قابلاً للقراءة لسنوات.
تذكر التحذير الوحيد الذي تحرص المواصفات عليه. الحالة الكاملة تكون عادةً في ذلك الملف. أثناء المعاملة، يعيش جزء منها في سجل تراجع (rollback journal) أو سجل كتابة مسبقة (write-ahead log) بجانبه. تحقق من وجود الملف الجانبي قبل أن تثق في النسخة.
عندما يكون لديك الملف وتحتاج إلى الإجابة بدلاً من المخطط، جرب Powerdrill Bloom واطرح سؤالك على البيانات مباشرة.
الأسئلة الشائعة
ما الفرق بين .db و .sqlite و .sqlite3؟
لا يوجد فرق هيكلي. الثلاثة هي امتدادات تقليدية لنفس التنسيق، والمعرف الحقيقي هو سلسلة الترويسة المكونة من 16 بايتاً SQLite format 3\000 في بداية الملف.
كيف أعرف حجم الصفحة الذي يستخدمه ملف SQLite؟
إنه مسجل في الترويسة. عدد صحيح بحجم 2 بايت عند الإزاحة 16 يحمل حجم الصفحة بالبايت. يجب أن يكون من قوى العدد اثنين بين 512 و 32768، أو القيمة 1 التي تمثل 65536.
هل ملف SQLite هو قاعدة البيانات الكاملة؟
عادةً، ولكن ليس دائماً. تذكر الوثائق أنه أثناء المعاملة، تحتفظ SQLite بمعلومات إضافية في سجل تراجع (rollback journal). وفي وضع WAL، تذهب هذه المعلومات إلى سجل كتابة مسبقة (write-ahead log) بدلاً من ذلك.
هل يمكنني فتح ملف SQLite في Excel؟
ليس مباشرة، لأن الملف يخزن صفحات B-tree بدلاً من صفوف النص. المسار الشائع هو تصدير جدول إلى CSV أولاً، أو استخدام أداة تقرأ تنسيق قاعدة البيانات وتعيد النتائج.
هل SQLite مجانية للاستخدام التجاري؟
نعم. تذكر SQLite أن الكود الخاص بها متاح للملكية العامة وهو "مجاني للاستخدام لأي غرض، تجاري أو خاص".