ObjectBox: ما هي قاعدة بيانات NoSQL والعمل مع البيانات

المؤلف: IT Sectr نُشر: 2026-03-13 وقت القراءة: 9 دق

ObjectBox هي قاعدة بيانات NoSQL عالية الأداء محسّنة للأجهزة المحمولة والحافة. على عكس SQLite، تستخدم تنسيق تخزين الملفات المسطحة الخاص بها بدون طبقة SQL. وفقاً لـ ObjectBox Benchmarks, 2024، يقوم ObjectBox بتنفيذ عمليات الإدراج والقراءة أسرع من 10 إلى 100 مرة من SQLite على أجهزة Android، مما يجعله الخيار الأفضل للتطبيقات المحمولة عالية التحميل.

الخلاصة

  • ObjectBox — قاعدة بيانات NoSQL بملفات مسطحة، بدون SQL وبدون طبقة ORM
  • الأداء — أسرع من 10 إلى 100 مرة من SQLite في عمليات الكتابة والقراءة
  • متعدد المنصات — Android و iOS و Linux و macOS و Windows و WebAssembly
  • التفاعلية — Observable و Flow مدمجان لتتبع التغييرات
  • تكامل سهل — إنشاء كود عبر التعليقات التوضيحية، بدون استعلامات SQL

ما هو ObjectBox؟

ObjectBox هي قاعدة بيانات NoSQL داخل الذاكرة تم تطويرها بواسطة الشركة الألمانية ObjectBox.io. على عكس قواعد البيانات العلائقية التقليدية، يخزن ObjectBox الكائنات مباشرة في ملفات مسطحة باستخدام تنسيقه الخاص SLOT (Super Lightweight Object Tree). هذا يلغي الحمل الزائد لـ ORM وتحليل SQL. تم تحسين تنسيق SLOT للأجهزة ذات الذاكرة المحدودة: يتم إلغاء تجزئة البيانات تلقائياً، وحجم قاعدة البيانات أصغر في المتوسط من 4 إلى 6 مرات من قاعدة بيانات SQLite المكافئة بنفس عدد السجلات.

يدعم ObjectBox جميع المنصات المحمولة الرئيسية: Android و iOS و Flutter. لنظام Android، إنشاء الكود متاح عبر ObjectBox Gradle Plugin، الذي يعالج الكيانات المشروحة وينشئ فئات Box للعمل مع البيانات. بالنسبة لـ Flutter، يتم استخدام إضافة أصلية مع غلاف Dart. بالإضافة إلى المنصات المحمولة، يعمل ObjectBox على Linux و macOS و Windows و WebAssembly، مما يسمح بإعادة استخدام نموذج البيانات بين التطبيق المحمول ومزامنة الخادم.

وفقاً لدراسة ObjectBox (2023)، يتم استخدام قاعدة البيانات في أكثر من 5000 تطبيق على Google Play، بما في ذلك التطبيقات التي تضم أكثر من 10 ملايين مستخدم. حالات الاستخدام الرئيسية: التخزين المؤقت للبيانات، العمل دون اتصال، وتخزين السلاسل الزمنية (IoT). يحظى ObjectBox بشعبية خاصة في تطبيقات تتبع الصحة واللياقة البدنية التي تتطلب تسجيلاً سريعاً لقراءات أجهزة الاستشعار على الجهاز بدون اتصال دائم بالإنترنت ولجمع التحليلات من أجهزة متعددة.

التاريخ والموقع

ObjectBox ظهر كبديل لـ Realm و SQLite لمنصة Android. صدرت النسخة المستقرة الأولى في عام 2018. الفرق الرئيسي عن Realm هو أن ObjectBox ليس لديه قيود GPL (يستخدم Apache 2.0) ويدعم منصات أكثر: من الأجهزة المحمولة إلى خوادم Linux.

الميزات الرئيسية

ObjectBox يوفر: إنشاء تلقائي لفئات Box، فهارس مدمجة للبحث السريع، معاملات مع دعم التراجع، استعلامات تفاعلية عبر RxJava و Kotlin Flow، ومزامنة بين الأجهزة عبر ObjectBox Sync (بروتوكول مملوك). على عكس Firebase Realtime Database، يعمل ObjectBox Sync بنموذج نظير لنظير بدون خادم مركزي، مما يقلل من زمن الوصول وتكاليف البنية التحتية.

كيف يعمل ObjectBox؟

ObjectBox يخزن البيانات في تنسيقه الثنائي الخاص .mdb (ObjectBox Data File). يتم تعيين كل كيان لملف واحد، حيث يتم تخزين السجلات بالتسلسل مع إزاحة ثابتة. هذا يسمح بقراءة وكتابة الكائنات الفردية بدون فحص كامل للملف.

العمل مع ObjectBox لا يتطلب SQL: يتم بناء الاستعلامات عبر واجهة برمجة تطبيقات fluent في الكود. يقوم المترجم بإنشاء فئات مساعدة MyObjectBox و Boxes التي تغلف جميع عمليات CRUD. يتم وصف نموذج البيانات باستخدام التعليقات التوضيحية @Entity و @Id و @Index و @Relation.

kotlin
// Connecting ObjectBox in Android
class App: Application() {
    lateinit var boxStore: BoxStore

    override fun onCreate() {
        super.onCreate()
        boxStore = MyObjectBox.builder()
            .androidContext(this)
            .build()
    }
}

ObjectBox ضد SQLite: مقارنة الأداء

وفقاً لاختبارات الأداء الرسمية، يتفوق ObjectBox بشكل كبير على SQLite في السرعة، خاصة في الإدراج الجماعي والقراءات الجماعية. ومع ذلك، يظل SQLite هو المعيار الفعلي للتطبيقات المحمولة بسبب انتشاره ودعم SQL المدمج.

العمليةObjectBoxSQLiteالفرق
إدراج (1000 سجل)~5 مللي ثانية~180 مللي ثانيةأسرع ×36
قراءة (1000 سجل)~3 مللي ثانية~70 مللي ثانيةأسرع ×23
تحديث (1000 سجل)~6 مللي ثانية~150 مللي ثانيةأسرع ×25
بحث بالفهرس~0.1 مللي ثانية~2 مللي ثانيةأسرع ×20
حجم قاعدة البيانات (1000 كائن)~28 كيلوبايت~112 كيلوبايتأصغر 4 مرات

عندما لا يكون ObjectBox مثالياً

ObjectBox يخسر أمام SQLite في السيناريوهات التي تتطلب استعلامات JOIN معقدة، دوال تجميعية (SUM، COUNT مع تجميع)، أو تكامل مع مخطط SQL موجود. إذا كان المشروع يستخدم بالفعل SQLite مع Room ORM، فإن الترحيل إلى ObjectBox سيتطلب إعادة كتابة كل منطق الوصول إلى البيانات. ObjectBox أيضاً لا يدعم استعلامات SQL المخصصة — فقط واجهة برمجة تطبيقات fluent. ومع ذلك، لعمليات CRUD النموذجية والتخزين المؤقت، يوفر ObjectBox تحسناً في الأداء يصل إلى 100 مرة، كما تؤكد ذلك الاختبارات الرسمية على أجهزة Android بإصدارات مختلفة من نظام التشغيل.

أمثلة كود مع ObjectBox

ObjectBox يستخدم التعليقات التوضيحية لتعريف الكيانات. بعد التجميع، يتم إنشاء فئات Box بطرق put و get و remove و query. فيما يلي العمليات النموذجية لنموذج Task في تطبيق قائمة المهام.

تعريف كيان

يتم توضيح كل كيان بـ @Entity. الحقل الذي يحتوي على @Id يصبح المفتاح الأساسي، و @Index يسرع البحث في هذا الحقل. يدعم ObjectBox إنشاء المعرفات تلقائياً عندما تكون القيمة 0.

kotlin
@Entity
data class Task(
    @Id var id: Long = 0,
    @Index var title: String = "",
    var isCompleted: Boolean = false,
    var priority: Int = 0
)

عمليات CRUD

Box هي الفئة الرئيسية للعمل مع الكيانات. طريقة put() تحفظ أو تحدث كائناً، get() تقرأ بواسطة المعرف، و remove() تحذف. جميع العمليات الأساسية متزامنة ويتم تنفيذها في سلسلة الاستدعاء.

kotlin
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)

// Create
val task = Task(title = "Buy products", priority = 3)
val newId = taskBox.put(task)

// Read
val savedTask = taskBox.get(newId)

// Update
savedTask.isCompleted = true
taskBox.put(savedTask)

// Delete
taskBox.remove(newId)

الاستعلامات التفاعلية

ObjectBox يدعم الاستعلامات التفاعلية عبر .subscribe(). يتلقى المشترك إشعارات عندما تتغير البيانات المطابقة لشرط الاستعلام. هذا مناسب لواجهة المستخدم التي تقوم بتحديث القائمة تلقائياً عند إضافة أو إزالة العناصر.

kotlin
val query = taskBox.query()
    .equal(Task_.isCompleted, false)
    .orderDesc(Task_.priority)
    .build()

query.subscribe { tasks ->
    // tasks — List, يتحدث تلقائيًا
    updateUi(tasks)
}

العلاقات والاستعلامات في ObjectBox

ObjectBox يدعم العلاقات بين الكيانات — واحد لواحد، واحد لكثير، وكثير لكثير. يتم تعريف العلاقات عبر التعليق التوضيحي @Relation. على عكس SQLite، لا يستخدم ObjectBox المفاتيح الخارجية: يتم تنفيذ العلاقات من خلال قوائم المعرفات في ملفات مسطحة، مما يسرع التنقل في الرسم البياني للكائنات.

واحد لكثير عبر @Backlink

علاقة @Backlink تسمح بالتنقل من كيان فرعي إلى الكيان الأب دون حقل مرجعي منفصل. يحافظ ObjectBox تلقائياً على الرابط العكسي، مما يلغي ازدواجية البيانات والمزامنة بين جدولين.

الاستعلامات المرنة

ObjectBox Query Builder يتيح بناء سلاسل من الشروط: equal، notEqual، greater، less، in، contains، startsWith. يمكن دمج جميع الشروط عبر and/or. يمكن فرز النتيجة وتحديدها والحصول عليها كـ List أو LazyList (لمجموعات البيانات الكبيرة).

إعداد الفهارس لتسريع البحث

ObjectBox يقوم بفهرسة حقل @Id تلقائياً. للفهارس المخصصة، استخدم التعليق التوضيحي @Index على الحقول التي يتم الاستعلام عنها بشكل متكرر. الفهارس تسرع استعلامات equal و in ولكنها تبطئ الإدراج — لا تقم بفهرسة الحقول التي لا يتم البحث عنها. يدعم ObjectBox الفهارس المركبة للتصفية بعدة حقول في وقت واحد. الفهارس المركبة مفيدة بشكل خاص لمرشحات القوائم: على سبيل المثال، البحث عن المهام غير المكتملة ذات الأولوية العالية يكون أسرع بعشرات المرات باستخدام فهرس مركب على حقلي isCompleted و priority.

ObjectBox Sync — المزامنة بين الأجهزة

ObjectBox Sync هي تقنية مملوكة لمزامنة البيانات في الوقت الفعلي بين الأجهزة. تستخدم بروتوكولاً قائماً على WebSocket مع حل النزاعات بواسطة آخر كاتب. Sync مناسب للتطبيقات التي تحتاج إلى مزامنة دون اتصال: الملاحظات، قوائم المهام، بيانات IoT من أجهزة استشعار متعددة. ومع ذلك، يلزم شراء ترخيص للإنتاج.

kotlin
// Query with multiple conditions
val highPriorityIncomplete = taskBox.query()
    .greater(Task_.priority, 5)
    .equal(Task_.isCompleted, false)
    .build()
    .find()

// Substring search
val searchResults = taskBox.query()
    .contains(Task_.title, "product", StringOrder.CASE_INSENSITIVE)
    .build()
    .find()

الأسئلة الشائعة

هل ObjectBox مجاني للاستخدام التجاري؟

ObjectBox يتم توزيعه بموجب ترخيص Apache 2.0، الذي يسمح بالاستخدام التجاري بدون قيود. ميزة ObjectBox Sync (المزامنة عبر المنصات) مملوكة وتتطلب شراء ترخيص للإنتاج.

هل يدعم ObjectBox تعدد الخيوط؟

BoxStore آمن للخيوط: يمكن لعدة خيوط قراءة البيانات في وقت واحد. يتم قفل الكتابة على مستوى Box. للمعاملات المعقدة، استخدم boxStore.runInTx() الذي يضمن ذرية مجموعة من العمليات.

هل يمكن استخدام ObjectBox مع Kotlin Multiplatform؟

نعم، ObjectBox يدعم Kotlin Multiplatform (KMP) بدءاً من الإصدار 3.0. الأهداف المتاحة هي Android و iOS و JVM و Native. بالنسبة لـ KMP، يتم استخدام إضافة Gradle منفصلة objectbox-kotlin مع دعم expect/actual.

كيفية عمل نسخة احتياطية لقاعدة بيانات ObjectBox؟

ObjectBox يخزن البيانات في ملفات .mdb في دليل التطبيق. للنسخ الاحتياطي، انسخ دليل ObjectBox بالكامل عبر BoxStore.copy() أو انسخ الملفات يدوياً بعد استدعاء boxStore.close(). لا يمكن نسخ الملفات الحية — فهذا سيتلف البيانات.

ما الفرق بين ObjectBox و Room؟

Room هو ORM فوق SQLite، يتطلب استعلامات SQL وله حمل زائد لتعيين الكائنات. ObjectBox هي قاعدة بيانات NoSQL بدون SQL، أسرع بمرتبة من حيث الحجم، ولكنها لا تدعم JOIN المعقدة وليست قاعدة بيانات علائقية. يعتمد الاختيار على المهمة: للبيانات العلائقية — Room، للتخزين السريع للكائنات — ObjectBox.

الملخص

  • ObjectBox — قاعدة بيانات NoSQL بأداء يزيد 10–100 مرة عن SQLite على الأجهزة المحمولة
  • الملفات المسطحة — تنسيق SLOT الخاص بدون طبقة SQL وحمل ORM
  • التعليقات التوضيحية — @Entity، @Id، @Index، @Relation لوصف نموذج البيانات
  • التفاعلية — Observable و Flow مدمجان للتحديث التلقائي لواجهة المستخدم
  • متعدد المنصات — Android، iOS، Linux، macOS، Windows، WebAssembly
  • التخزين المؤقت والعمل دون اتصال — حالة الاستخدام الرئيسية لـ ObjectBox في التطبيقات المحمولة
  • توصية — اختر ObjectBox للمهام حيث تكون سرعة الوصول إلى البيانات أكثر أهمية من التكامل العلائقي

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا