پرش به محتوای اصلی
پرش به محتوای مقاله

DoltLite: قابلیت کنترل نسخه به سبک گیت برای پایگاه‌داده‌های SQLite

·۱۰ شهریور ۱۴۰۵۴ دقیقه مطالعه
لوگوی DoltLite Beta: نسخه سبک‌تر پایگاه داده Dolt با قابلیت کنترل نسخه
لوگوی DoltLite Beta: نسخه سبک‌تر پایگاه داده Dolt با قابلیت کنترل نسخه
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

نخستین ادغام موفقیت‌آمیز ساختار Prolly Tree در یک فورک از SQLite که اجازه می‌دهد عملیات Branch و Merge مستقیماً روی فایل‌های دیتابیس محلی بدون نیاز به سرورهای سنگین انجام شود.

تصور کنید برای داده‌های تولیدی (Production) خود یک دکمهٔ «Undo» داشته باشید و هر تغییری را بتوانید به حالت قبل برگردانید. این رویای توسعه‌دهندگان با عرضه نسخه بتای DoltLite در ۱ سپتامبر ۲۰۲۶ به واقعیت تبدیل شد. قابلیت‌هایی مانند شاخه‌بندی (Branching)، ادغام (Merging) و تفاوت‌یابی (Diffing) که پیش از این فقط در سیستم‌های کنترل نسخه مانند Git دیده می‌شد، اکنون برای یک بسته سازگار با SQLite در دسترس است. در واقع، پایگاه‌داده‌های جاسازی‌شده (Embedded Databases) به طور موثری یک دکمه بازگشت برای داده‌های عملیاتی خود به دست آوردند.

سال‌هاست که برنامه‌نویسان با SQLite مانند یک فایل ایستا یا ذخیره‌ساز ساده کلید-مقدار برخورد کرده‌اند. این ابزار با وجود قدرت زیاد، راهی بومی برای ردیابی تغییرات یا همکاری تیمی از طریق درخواست‌های Pull و Push نداشت. DoltLite این مشکل را با جایگزینی لایه B-tree استاندارد با یک Prolly Tree حل کرده است؛ یک ساختار داده‌ای با آدرس‌دهی محتوایی (Content-addressed) که اجازه می‌دهد بدون بازنویسی کل موتور SQL، نسخه‌بندی کامل داده‌ها انجام شود. این تلاش برای ارتقای قابلیت‌های SQLite، مشابه رویکرد پروژه‌های دیگری است که سعی دارند محدودیت‌های این موتور را برطرف کنند؛ برای مثال پروژه BriskDB نیز با ترکیب SQLite و Rust تلاش کرد تا با استفاده از شاردینگ، مشکل نوشتن‌های موازی را حل کند.

همان‌طور که در تحلیل‌های قبلی ما درباره‌ی زیرساخت‌های داده‌محور اشاره کردیم، نیاز به همگام‌سازی دقیق در محیط‌های توزیع‌شده همواره یک چالش بوده است.

به نقل از وب‌سایت dolthub.com، این پروژه در ابتدا به عنوان آزمونی برای Gas Town (یک ارکستراتور عامل‌های هوش مصنوعی ساخته شده توسط استیو یگی) توسعه یافت. سازنده این ابزار می‌خواست به جای یک پروژه نمایشی و ساده، یک مسئله واقعی و مهندسی را حل کند. اگرچه تیم توسعه سال‌هاست که خواهان یک نسخه جاسازی‌شده از Dolt بوده‌اند، اما بازنویسی موتور ذخیره‌سازی به زبان C یا Rust از نظر آن‌ها «فراتر از توان» (a bridge too far) بود.

در نهایت، SQLite به عنوان میزبان منطقی برای این موتور انتخاب شد. جالب اینجاست که تیمی از عامل‌های هوش مصنوعی (AI Agents) — شبیه به دستیاران دیجیتالی که می‌توانند کارهای پیچیده مهندسی را به صورت مستقل انجام دهند — با ارسال حدود ۲,۰۰۰ درخواست Pull، این پروژه را به نسخه فعلی یعنی ۰.۵۰.۰ رساندند. این دستاورد ثابت می‌کند که تیمی از عامل‌های هوش مصنوعی می‌توانند یک وظیفه مهندسی پیچیده در این مقیاس را با موفقیت اجرا کنند.

DoltLite در واقع یک فورک (Fork) از SQLite است. این ابزار با حفظ لایه‌های تجزیه و تحلیل SQL (Parser)، تحلیل‌گر (Analyzer) و لایه‌های تعامل با سیستم فایل، سازگاری بالایی با نسخه اصلی دارد. این استراتژی به تیم اجازه داد تا از دشواری‌های ساخت یک موتور SQL از صفر اجتناب کنند.

تفاوت‌های کلیدی و مشخصات فنی این سیستم عبارتند از:

  • موتور ذخیره‌سازی: لایه B-tree با Prolly Tree جایگزین شده است که بر پایه یک ذخیره‌ساز تک‌فایلی (Chunk Store) کار می‌کند. Prolly Treeها در واقع B-treeهای با آدرس‌دهی محتوایی هستند که قدرت کنترل نسخه را به تمام محصولات Dolt می‌بخشند.
  • سازگاری SQL: این مدل ۱۰۰٪ از ۵.۸ میلیون پرس‌وجوی پیچیده در مجموعه sqllogictest عبور کرده است.
  • تفاوت در API: حدود ۹۹.۴۶٪ از ۸۹۲,۲۷۷ تست پذیرش مبتنی بر TCL در SQLite را پاس می‌کند. ۴,۸۰۹ مورد واگرایی (Divergence) شناخته شده وجود دارد که عمدتاً به این دلیل است که جداول به جای rowid بر اساس کلید اصلی (Primary Key) کلیدگذاری شده‌اند و سیستم به جای صفحات (Pages) از تکه‌ها (Chunks) استفاده می‌کند.
  • قابلیت همگام‌سازی: از دستورات Git-style شامل Push، Pull، Clone و Fetch پشتیبانی می‌کند و DoltHub به عنوان بک‌اند همگام‌سازی عمل می‌کند. این سیستم یک موتور همگام‌سازی SQLite فراهم می‌کند که نسبت به تداخلات (Conflict-aware) حساس است.
  • محدودیت‌ها: به دلیل معماری خاص، هیچ فایل جانبی برای WAL یا Journal وجود ندارد؛ در نتیجه، تست‌های مربوط به WAL و Journal نادیده گرفته شده‌اند.

رسیدن به مرحله بتا به این معناست که فرمت ذخیره‌سازی اکنون پایدار است. بر اساس مستندات پروژه، مراحل اولیه توسعه با «تغییرات مکرر فرمت ذخیره‌سازی» (Storage format bumps) همراه بود که سازگاری عقب‌رو (Backward-compatible) نداشتند و کاربران را مجبور می‌کرد داده‌ها را به صورت دستی Dump کرده و دوباره Import کنند. ۱۲ بار تغییر فرمت لازم بود تا به این مرحله برسند. فرمت فعلی برای ۵۷ انتشار متوالی، یا بیش از سه ماه تقویمی، بدون تغییر مانده است. هرگونه تغییر سازنده در آینده، اکنون شامل یک مسیر مهاجرت (Migration path) پشتیبانی‌شده خواهد بود.

البته این قابلیت‌ها هزینه‌ای در عملکرد دارند. در حالی که سرعت خواندن داده‌ها تقریباً مشابه SQLite است، سرعت نوشتن کاهش یافته است. گزارش‌های عملکرد روزانه که DoltLite را با SQLite در بنچ‌مارک‌های استاندارد sysbench مقایسه می‌کند، در گیت‌هاب منتشر می‌شود:

  • در حافظه (In-Memory): خواندن ۱۰٪ کندتر و نوشتن ۶۰٪ کندتر است.
  • پایگاه‌داده فایلی: سرعت خواندن برابر است و نوشتن‌های دسته‌ای (Batched) تنها ۱۰٪ کندتر هستند.
  • نوشتن‌های Autocommit: کندترین بخش است و ۳.۱ برابر کندتر از SQLite عمل می‌کند.

به طور مشخص، یک Runner کوچک در گیت‌هاب ثبت کرد که زمان نوشتن در SQLite حدود ۱۲۵ میکروثانیه بود، در حالی که در DoltLite این عدد به ۴۰۰ میکروثانیه رسید. توسعه‌دهندگان توصیه می‌کنند برای کاهش این تأخیر از نوشتن‌های دسته‌ای استفاده کنید، هرچند عملکرد همچنان در محدوده میکروثانیه (زیر یک میلی‌ثانیه) باقی می‌ماند.

این تغییر، فرض قدیمی را که پایگاه‌داده‌های جاسازی‌شده باید «تخریبی» باشند یا برای نسخه‌بندی به Snapshotهای خارجی تکیه کنند، می‌شکند. با ادغام کنترل نسخه در لایه ذخیره‌سازی، توسعه‌دهندگان اکنون می‌توانند عامل‌های هوش مصنوعی را روی داده‌های محلی خود رها کنند و اگر عاملی باعث خرابی وضعیت داده‌ها شد، با یک دستور ساده dolt_reset('--hard') همه چیز را به حالت اول برگردانند.

برای کسانی که وضعیت‌های پیچیده محلی را مدیریت می‌کنند یا روی مجموعه‌داده‌های مشترک همکاری می‌کنند، این ابزار اصطکاک مربوط به خروجی‌ها و ورودی‌های دستی (Manual exports/imports) را از بین می‌برد. شما اکنون می‌توانید با پایگاه‌داده خود مانند یک کد منبع (Codebase) برخورد کنید.

کاربران در حال حاضر می‌توانند نسخه بتا را تست کرده و به رابط گرافیکی Dolt Workbench دسترسی پیدا کنند که شامل یک حالت اختصاصی برای عامل‌ها (Agent Mode) جهت دستکاری پایگاه‌داده است. پشتیبانی کاربران از طریق کانال doltlite🪶 در دیسکورد در دسترس است.

گام بعدی شما

  • اگر از SQLite برای مدیریت وضعیت‌های پیچیده محلی استفاده می‌کنید، نسخه بتای DoltLite را برای مدیریت نسخه‌ها امتحان کنید.
  • برای کاهش تأخیر در نوشتن، استراتژی Batched Writes را در اپلیکیشن خود پیاده کنید.
  • رابط گرافیکی Dolt Workbench را برای مدیریت بصری داده‌ها و استفاده از حالت عامل (Agent Mode) بررسی کنید.

اما تأثیر این رویکرد بر مدیریت داده‌های حجیم در لبه (Edge) حتی جذاب‌تر است — به بررسی ما درباره رایانش لبه مراجعه کنید.

چرا این موضوع مهم است؟

این ابزار با آوردن استانداردهای Git به دنیای SQLite، ریسک تغییرات در داده‌های حساس را به شدت کاهش می‌دهد. این تحول بر اساس تجربه توسعه‌دهندگان در مدیریت کدهاست و اکنون اعتبار این روش را به لایه ذخیره‌سازی داده‌ها می‌آورد.

تأثیر برای ایران

برای توسعه‌دهندگان ایرانی که در پروژه‌های آفلاین یا اپلیکیشن‌های دسکتاپ از SQLite استفاده می‌کنند، این ابزار راهکاری رایگان و متن‌باز برای جایگزینی سیستم‌های پیچیده بک‌آپ‌گیری است.

·نگاه ما
تحریریه دات‌هوش

جایگزینی B-tree با Prolly Tree نشان می‌دهد که مرز میان «کد» و «داده» در حال محو شدن است. وقتی پایگاه‌داده رفتاری شبیه به Git پیدا می‌کند، داده‌ها دیگر موجوداتی ایستا نیستند، بلکه به موجوداتی تکاملی تبدیل می‌شوند که می‌توان آن‌ها را آزمایش کرد و در صورت خطا، به سرعت بازگرداند. این زیرساخت دقیقاً همان چیزی است که برای استقرار ایمن عامل‌های هوش مصنوعی در محیط‌های عملیاتی لازم است.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.