ObjectBox একটি উচ্চ-কার্যক্ষমতা সম্পন্ন NoSQL ডাটাবেস যা মোবাইল এবং এজ ডিভাইসের জন্য অপ্টিমাইজ করা হয়েছে। SQLite-এর বিপরীতে, এটি SQL স্তর ছাড়া নিজস্ব ফ্ল্যাট-ফাইল স্টোরেজ ফর্ম্যাট ব্যবহার করে। ObjectBox Benchmarks, 2024 অনুসারে, ObjectBox Android ডিভাইসে SQLite-এর তুলনায় 10–100 গুণ দ্রুত ইনসার্ট এবং রিড অপারেশন সম্পাদন করে, যা এটিকে উচ্চ-লোড মোবাইল অ্যাপ্লিকেশনের জন্য সেরা পছন্দ করে তোলে।
মূল বিষয়
ObjectBox একটি ইন-মেমোরি NoSQL ডাটাবেস যা জার্মান কোম্পানি ObjectBox.io দ্বারা তৈরি। প্রথাগত রিলেশনাল ডাটাবেসের বিপরীতে, ObjectBox তার নিজস্ব SLOT (Super Lightweight Object Tree) ফর্ম্যাট ব্যবহার করে ফ্ল্যাট ফাইলে সরাসরি অবজেক্ট সংরক্ষণ করে। এটি ORM এবং SQL পার্সিংয়ের ওভারহেড দূর করে। SLOT ফর্ম্যাট সীমিত মেমরি বিশিষ্ট ডিভাইসের জন্য অপ্টিমাইজ করা: ডেটা স্বয়ংক্রিয়ভাবে ডিফ্র্যাগমেন্ট হয় এবং একই সংখ্যক রেকর্ড থাকা সমতুল্য SQLite ডাটাবেসের তুলনায় ডাটাবেসের আকার গড়ে 4–6 গুণ ছোট হয়।
ObjectBox সমস্ত প্রধান মোবাইল প্ল্যাটফর্ম সমর্থন করে: Android, iOS এবং Flutter। Android-এর জন্য, ObjectBox Gradle Plugin-এর মাধ্যমে কোড জেনারেশন উপলব্ধ, যা অ্যানোটেটেড এনটিটি প্রক্রিয়া করে এবং ডেটা নিয়ে কাজ করার জন্য Box ক্লাস তৈরি করে। Flutter-এর জন্য, Dart র্যাপার সহ একটি নেটিভ প্লাগইন ব্যবহার করা হয়। মোবাইল প্ল্যাটফর্ম ছাড়াও, ObjectBox Linux, macOS, Windows এবং WebAssembly-তে চলে, যা মোবাইল অ্যাপ এবং সার্ভার সিঙ্ক্রোনাইজেশনের মধ্যে ডেটা মডেল পুনরায় ব্যবহার করার অনুমতি দেয়।
ObjectBox অধ্যয়ন (2023) অনুসারে, ডাটাবেসটি Google Play-তে 5,000-এরও বেশি অ্যাপ্লিকেশনে ব্যবহৃত হয়, যার মধ্যে 10 মিলিয়নেরও বেশি ব্যবহারকারী বিশিষ্ট অ্যাপ অন্তর্ভুক্ত। প্রধান ব্যবহারের ক্ষেত্র: ডেটা ক্যাশিং, অফলাইন অপারেশন এবং টাইম-সিরিজ স্টোরেজ (IoT)। ObjectBox বিশেষ করে স্বাস্থ্য এবং ফিটনেস ট্র্যাকিং অ্যাপে জনপ্রিয় যেখানে ধ্রুবক ইন্টারনেট সংযোগ ছাড়া ডিভাইসে সেন্সর রিডিংয়ের দ্রুত রেকর্ডিং এবং একাধিক ডিভাইস থেকে বিশ্লেষণ সংগ্রহ প্রয়োজন।
ObjectBox Android প্ল্যাটফর্মের জন্য Realm এবং SQLite-এর বিকল্প হিসেবে আবির্ভূত হয়েছে। প্রথম স্থিতিশীল সংস্করণ 2018 সালে প্রকাশিত হয়েছিল। Realm থেকে মূল পার্থক্য হল ObjectBox-এর কোনো GPL সীমাবদ্ধতা নেই (Apache 2.0 ব্যবহার করে) এবং এটি আরও প্ল্যাটফর্ম সমর্থন করে: মোবাইল ডিভাইস থেকে Linux সার্ভার পর্যন্ত।
ObjectBox প্রদান করে: স্বয়ংক্রিয় Box ক্লাস জেনারেশন, দ্রুত অনুসন্ধানের জন্য বিল্ট-ইন ইনডেক্স, রোলব্যাক সমর্থন সহ লেনদেন, RxJava এবং Kotlin Flow-এর মাধ্যমে রিঅ্যাকটিভ কোয়েরি এবং ObjectBox Sync (মালিকানাধীন প্রোটোকল) এর মাধ্যমে ডিভাইস-থেকে-ডিভাইস সিঙ্ক্রোনাইজেশন। Firebase Realtime Database-এর বিপরীতে, ObjectBox Sync কেন্দ্রীয় সার্ভার ছাড়া পিয়ার-টু-পিয়ার মডেলে কাজ করে, যা লেটেন্সি এবং অবকাঠামো খরচ কমায়।
ObjectBox তার নিজস্ব বাইনারি ফর্ম্যাট .mdb (ObjectBox Data File) এ ডেটা সংরক্ষণ করে। প্রতিটি এনটিটি একটি ফাইলে ম্যাপ হয়, যেখানে রেকর্ডগুলি নির্দিষ্ট অফসেট সহ ক্রমানুসারে সংরক্ষিত হয়। এটি সম্পূর্ণ ফাইল স্ক্যান না করে পৃথক অবজেক্ট পড়া এবং লেখার অনুমতি দেয়।
ObjectBox-এর সাথে কাজ করার জন্য SQL প্রয়োজন নেই: কোডে ফ্লুয়েন্ট API-এর মাধ্যমে কোয়েরি তৈরি করা হয়। কম্পাইলার হেল্পার ক্লাস MyObjectBox এবং Boxes তৈরি করে যা সমস্ত CRUD অপারেশন এনক্যাপসুলেট করে। ডেটা মডেল অ্যানোটেশন @Entity, @Id, @Index এবং @Relation-এর মাধ্যমে বর্ণনা করা হয়।
// Connecting ObjectBox in Android
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
অফিসিয়াল বেঞ্চমার্ক অনুসারে, ObjectBox গতিতে SQLite-কে উল্লেখযোগ্যভাবে ছাড়িয়ে যায়, বিশেষ করে ব্যাচ ইনসার্ট এবং গণ রিডে। তবে, SQLite তার ব্যাপকতা এবং বিল্ট-ইন SQL সমর্থনের কারণে মোবাইল অ্যাপ্লিকেশনের জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড হিসাবে রয়ে গেছে।
| অপারেশন | ObjectBox | SQLite | পার্থক্য |
|---|---|---|---|
| ইনসার্ট (1000 রেকর্ড) | ~5 মি.সে. | ~180 মি.সে. | ×36 গুণ দ্রুত |
| পড়া (1000 রেকর্ড) | ~3 মি.সে. | ~70 মি.সে. | ×23 গুণ দ্রুত |
| আপডেট (1000 রেকর্ড) | ~6 মি.সে. | ~150 মি.সে. | ×25 গুণ দ্রুত |
| ইনডেক্স অনুসন্ধান | ~0.1 মি.সে. | ~2 মি.সে. | ×20 গুণ দ্রুত |
| DB আকার (1000 অবজেক্ট) | ~28 KB | ~112 KB | 4 গুণ ছোট |
ObjectBox জটিল JOIN কোয়েরি, সমষ্টিগত ফাংশন (SUM, COUNT গ্রুপিং সহ), বা বিদ্যমান SQL স্কিমার সাথে ইন্টিগ্রেশন প্রয়োজন এমন পরিস্থিতিতে SQLite-এর থেকে পিছিয়ে থাকে। যদি প্রজেক্টটি ইতিমধ্যেই Room ORM-এর সাথে SQLite ব্যবহার করে, তাহলে ObjectBox-এ মাইগ্রেট করতে সমস্ত ডেটা অ্যাক্সেস লজিক পুনরায় লিখতে হবে। ObjectBox কাস্টম SQL কোয়েরিও সমর্থন করে না — শুধুমাত্র ফ্লুয়েন্ট API। তবে, সাধারণ CRUD অপারেশন এবং ক্যাশিংয়ের জন্য, ObjectBox 100 গুণ পর্যন্ত কার্যক্ষমতা উন্নতি প্রদান করে, যা বিভিন্ন OS সংস্করণের Android ডিভাইসে অফিসিয়াল বেঞ্চমার্ক দ্বারা নিশ্চিত।
ObjectBox এনটিটি সংজ্ঞায়িত করতে অ্যানোটেশন ব্যবহার করে। কম্পাইলেশনের পরে, put, get, remove এবং query পদ্ধতি সহ Box ক্লাস তৈরি করা হয়। নিচে একটি টু-ডু লিস্ট অ্যাপে Task মডেলের জন্য সাধারণ অপারেশন দেওয়া হল।
প্রতিটি এনটিটি @Entity দিয়ে অ্যানোটেটেড হয়। @Id সহ ফিল্ডটি প্রাথমিক কী হয়ে যায় এবং @Index সেই ফিল্ডে অনুসন্ধান দ্রুত করে। ObjectBox মান 0 হলে স্বয়ংক্রিয় ID জেনারেশন সমর্থন করে।
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box এনটিটি নিয়ে কাজ করার জন্য প্রধান ক্লাস। put() পদ্ধতি একটি অবজেক্ট সংরক্ষণ বা আপডেট করে, get() ID দিয়ে পড়ে এবং remove() মুছে ফেলে। সমস্ত মৌলিক অপারেশন সিঙ্ক্রোনাস এবং কলিং থ্রেডে সম্পাদিত হয়।
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()-এর মাধ্যমে রিঅ্যাকটিভ কোয়েরি সমর্থন করে। সাবস্ক্রাইবার যখন কোয়েরির শর্ত মেলে এমন ডেটা পরিবর্তন হয় তখন নোটিফিকেশন পায়। এটি UI-এর জন্য সুবিধাজনক যা আইটেম যোগ বা অপসারণ করলে স্বয়ংক্রিয়ভাবে তালিকা আপডেট করে।
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, স্বয়ংক্রিয়ভাবে আপডেট হয়
updateUi(tasks)
}
ObjectBox এনটিটির মধ্যে সম্পর্ক সমর্থন করে — To-One, To-Many এবং Many-to-Many। সম্পর্ক @Relation অ্যানোটেশনের মাধ্যমে সংজ্ঞায়িত করা হয়। SQLite-এর বিপরীতে, ObjectBox ফরেন কী ব্যবহার করে না: সম্পর্ক ফ্ল্যাট ফাইলে ID তালিকার মাধ্যমে বাস্তবায়িত হয়, যা অবজেক্টের গ্রাফ নেভিগেশন দ্রুত করে।
@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 ডিভাইসের মধ্যে রিয়েল-টাইম ডেটা সিঙ্ক্রোনাইজেশনের জন্য একটি মালিকানাধীন প্রযুক্তি। এটি লাস্ট-রাইটার-উইনস দ্বারা কনফ্লিক্ট রেজোলিউশন সহ WebSocket-ভিত্তিক প্রোটোকল ব্যবহার করে। Sync সেই অ্যাপের জন্য উপযুক্ত যেগুলির অফলাইন সিঙ্ক্রোনাইজেশন প্রয়োজন: নোট, টাস্ক লিস্ট, একাধিক সেন্সর থেকে IoT ডেটা। তবে, প্রোডাকশনের জন্য লাইসেন্স ক্রয় প্রয়োজন।
// 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 Apache 2.0 লাইসেন্সের অধীনে বিতরণ করা হয়, যা বিনা সীমাবদ্ধতায় বাণিজ্যিক ব্যবহারের অনুমতি দেয়। ObjectBox Sync বৈশিষ্ট্য (ক্রস-প্ল্যাটফর্ম সিঙ্ক্রোনাইজেশন) মালিকানাধীন এবং প্রোডাকশনের জন্য লাইসেন্স ক্রয় প্রয়োজন।
BoxStore থ্রেড-সেফ: একাধিক থ্রেড একসাথে ডেটা পড়তে পারে। লেখা Box স্তরে লক হয়। জটিল লেনদেনের জন্য boxStore.runInTx() ব্যবহার করুন, যা অপারেশনের একটি গ্রুপের পরমাণুতা নিশ্চিত করে।
হ্যাঁ, ObjectBox সংস্করণ 3.0 থেকে Kotlin Multiplatform (KMP) সমর্থন করে। Android, iOS, JVM এবং Native টার্গেট উপলব্ধ। KMP-এর জন্য, expect/actual সমর্থন সহ একটি পৃথক Gradle প্লাগইন objectbox-kotlin ব্যবহার করা হয়।
ObjectBox অ্যাপ ডিরেক্টরিতে .mdb ফাইলে ডেটা সংরক্ষণ করে। ব্যাকআপের জন্য, BoxStore.copy()-এর মাধ্যমে সম্পূর্ণ ObjectBox ডিরেক্টরি কপি করুন বা boxStore.close() কল করার পরে ম্যানুয়ালি ফাইলগুলি কপি করুন। লাইভ ফাইল কপি করা যাবে না — এটি ডেটা নষ্ট করবে।
Room SQLite-এর উপরে একটি ORM, যার SQL কোয়েরি প্রয়োজন এবং অবজেক্ট ম্যাপিংয়ের ওভারহেড রয়েছে। ObjectBox একটি NoSQL ডাটাবেস SQL ছাড়া, একটি অর্ডার অফ ম্যাগনিচিউড দ্রুত, কিন্তু জটিল JOIN সমর্থন করে না এবং রিলেশনাল ডাটাবেস নয়। পছন্দ কাজের উপর নির্ভর করে: রিলেশনাল ডেটার জন্য — Room, দ্রুত অবজেক্ট স্টোরেজের জন্য — ObjectBox।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন