Realm হল একটি মোবাইল অবজেক্ট-ওরিয়েন্টেড NoSQL ডেটাবেস যা iOS এবং Android-এর জন্য SQLite এবং Core Data-এর বিকল্প হিসেবে তৈরি করা হয়েছে। ডেটা মেমরিতে অবজেক্টে সরাসরি অ্যাক্সেস সহ নিজস্ব ফরম্যাটে সংরক্ষিত হয়, যা উচ্চ পড়া এবং লেখার গতি নিশ্চিত করে। রিঅ্যাকটিভ নোটিফিকেশন, Realm Sync-এর মাধ্যমে স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন এবং ক্রস-প্ল্যাটফর্ম ডেটা মডেলের জন্য ধন্যবাদ, Realm 1 বিলিয়নেরও বেশি ডিভাইসে ব্যবহৃত হয় (MongoDB ডেটা, 2025)।
মূল পয়েন্ট
Realm হল একটি অবজেক্ট-ওরিয়েন্টেড ডেটাবেস যা বিশেষভাবে মোবাইল অ্যাপ্লিকেশনের জন্য তৈরি করা হয়েছে। SQLite-এর বিপরীতে, Realm SQL বা রিলেশনাল মডেল ব্যবহার করে না — ডেটা লাইভ অবজেক্ট (Live Objects) হিসাবে সংরক্ষিত হয়, যা কোনো মধ্যস্থতাকারী ORM স্তর ছাড়াই সরাসরি অ্যাক্সেস করা যায়। ডেভেলপার ভাষার সাধারণ অবজেক্ট (Swift, Kotlin, Dart) নিয়ে কাজ করে যা স্বয়ংক্রিয়ভাবে ডেটাবেসে সংরক্ষিত হয়।
Realm 2014 সালে একটি স্টার্টআপ Realm Inc. হিসাবে আবির্ভূত হয় এবং 2019 সালে MongoDB Inc. দ্বারা অধিগৃহীত হয়। তারপর থেকে, Realm MongoDB Realm হিসাবে বিকশিত হচ্ছে — মোবাইল ডেটা সিঙ্ক্রোনাইজেশনের জন্য ইউনিফাইড Atlas Device Sync প্ল্যাটফর্মের অংশ। মৌলিক স্থানীয় Realm ডেটাবেস বিনামূল্যে এবং ওপেন সোর্স (Apache 2.0 লাইসেন্স) রয়ে গেছে, যখন Realm Sync (ক্লাউড সিঙ্ক্রোনাইজেশন) সাবস্ক্রিপশনের মাধ্যমে বিতরণ করা হয়।
MongoDB Developer Report (2025) অনুসারে, Realm 15% মোবাইল অ্যাপ্লিকেশনে প্রাথমিক স্থানীয় স্টোরেজ হিসাবে ব্যবহৃত হয়। প্রধান ব্যবহারের ক্ষেত্রগুলি হল অফলাইন মোড সহ অ্যাপ্লিকেশন, জটিল অবজেক্ট মডেল এবং ডিভাইসের মধ্যে সিঙ্ক্রোনাইজেশনের প্রয়োজনীয়তা, যেখানে Realm উন্নয়নের গতি এবং অবজেক্ট নিয়ে কাজ করার সহজতায় SQLite-কে ছাড়িয়ে যায়।
Live Objects — প্রতিটি Realm অবজেক্ট মেমরি-ম্যাপড ফাইলের মাধ্যমে ডিস্কের সাথে যুক্ত। যেকোনো থ্রেডে অবজেক্ট পরিবর্তন করা ম্যানুয়াল নোটিফিকেশন ছাড়াই অবিলম্বে অন্যান্য সমস্ত থ্রেডে প্রতিফলিত হয়। Realm নোটিফিকেশনের মাধ্যমে ডেটা পরিবর্তিত হলে UI স্বয়ংক্রিয়ভাবে পুনরায় আঁকে। Zero-copy — Realm ডেটাবেস থেকে ডেটা অবজেক্টে কপি করে না; অবজেক্টগুলিই মেমরিতে থাকা ডেটা।
Realm কোর C++-এ লেখা এবং ডেটা ইনডেক্সিংয়ের জন্য B+ Tree ব্যবহার করে। SQLite-এর বিপরীতে, যেখানে প্রতিটি সারি একটি রিলেশনাল টেবিলের রেকর্ড, Realm অবজেক্টগুলিকে তাদের মধ্যে সরাসরি রেফারেন্স (forward pointers) সহ গ্রাফ কাঠামোতে নোড হিসাবে সংরক্ষণ করে। অবজেক্টের মধ্যে সম্পর্কগুলি বিদেশী কী নয় বরং সরাসরি পয়েন্টার, যা JOIN অপারেশনের প্রয়োজনীয়তা দূর করে।
Realm ফাইলগুলি (.realm এক্সটেনশন) মেমরি-ম্যাপড — OS নিজেই অ্যাক্সেস করার সময় ফাইল পৃষ্ঠাগুলি মেমরিতে লোড করা পরিচালনা করে। এটি Realm-কে উপলব্ধ RAM-এর চেয়ে বড় ডেটাবেস নিয়ে কাজ করার অনুমতি দেয় এবং RAM-এ ফিট হওয়া ডেটার জন্য নেটিভ ভাষা ডেটা স্ট্রাকচারের (Swift Array বা Kotlin List) স্তরে পড়ার লেটেন্সি প্রদান করে।
মেমরি-ম্যাপড ফাইল — Realm-এর মূল প্রযুক্তি। ডেটাবেস ফাইল থেকে ভাষা অবজেক্টে ডেটা কপি করার পরিবর্তে (যেমন SQLite sqlite3_step + sqlite3_column_* এর মাধ্যমে করে), Realm ডেটাবেস ফাইলটিকে সরাসরি প্রক্রিয়ার ঠিকানা স্পেসে ম্যাপ করে। ভাষা অবজেক্টগুলি ম্যাপ করা মেমরিতে ডেটার জন্য কেবল পয়েন্টার। অবজেক্ট পরিবর্তন করা আলাদা save কল ছাড়াই ডিস্কে ডেটাবেস পরিবর্তন করে।
| বৈশিষ্ট্য | Realm (zero-copy) | SQLite (কপি করা) |
|---|---|---|
| পড়া | সরাসরি মেমরি অ্যাক্সেস (ন্যানোসেকেন্ড) | অবজেক্টে কপি (মাইক্রোসেকেন্ড) |
| লেখা | মেমরি-ম্যাপড ফাইলে তাৎক্ষণিক লেখা | SQL INSERT/UPDATE লেনদেন সহ save() |
| সম্পর্ক | সরাসরি পয়েন্টার (forward pointers) | বিদেশী কী + JOIN |
| মেমরি খরচ | ফাইল + OS পৃষ্ঠা ক্যাশ | অবজেক্ট + SQLite পৃষ্ঠা ক্যাশ |
| লাইভ অবজেক্ট | হ্যাঁ (স্বয়ংক্রিয় আপডেট) | না (নতুন fetch প্রয়োজন) |
মেমরি খরচ সক্রিয় পড়ার সময় Realm-এ বেশি (পুরো ফাইল বা তার বড় অংশ মেমরিতে ম্যাপ করা), কিন্তু লেখার অপারেশনের সময় কম কারণ অবজেক্ট কপির জন্য মেমরি বরাদ্দের প্রয়োজন হয় না। মোবাইল ডিভাইসে 1 GB পর্যন্ত ডেটাবেসের জন্য, মেমরি-ম্যাপড পদ্ধতি তার মধ্যস্থতাকারী কপি সহ SQLite-এর তুলনায় ভালো সামগ্রিক কর্মক্ষমতা দেয়।
SQLite হল SQL এবং ACID লেনদেন সহ একটি রিলেশনাল DBMS। Realm হল মেমরি-ম্যাপড অ্যাক্সেস সহ একটি অবজেক্ট NoSQL ডেটাবেস। Core Data হল SQLite-এর উপরে Apple-এর ORM স্তর। তিনটি পদ্ধতির প্রতিটির নিজস্ব প্রয়োগের ক্ষেত্র এবং শক্তি রয়েছে। Realm প্রত্যক্ষ অবজেক্ট অ্যাক্সেস গতি এবং প্রতিক্রিয়াশীলতায় জয়ী, SQLite বহুমুখিতা এবং পরিপক্কতায়, Core Data Apple ইকোসিস্টেমের সাথে একীকরণে।
Realm-এর পড়ার কর্মক্ষমতা zero-copy অ্যাক্সেসের কারণে SQLite-এর তুলনায় 10-50% বেশি। Realm লেখার ক্ষেত্রেও দ্রুত কারণ SQL পার্সিংয়ের অনুপস্থিতি এবং মেমরি-ম্যাপড পৃষ্ঠাগুলির সরাসরি সংশোধন। তবে, বড় ডেটাবেস (>500 MB) নিয়ে কাজ করার সময় Realm বেশি RAM খরচ করতে পারে, কারণ ফাইলটি পুরোপুরি ঠিকানা স্পেসে ম্যাপ করা হয়।
| মানদণ্ড | Realm | SQLite | Core Data |
|---|---|---|---|
| ধরন | NoSQL অবজেক্ট DB | রিলেশনাল DBMS (SQL) | SQLite-এর উপরে ORM |
| পড়ার গতি | উচ্চ (zero-copy) | মধ্যম | মধ্যম (ORM ওভারহেড) |
| প্রতিক্রিয়াশীলতা | Live Objects (বিল্ট-ইন) | র্যাপার প্রয়োজন (Room/GRDB) | NSFetchedResultsController |
| সিঙ্ক্রোনাইজেশন | Realm Sync (MongoDB Atlas) | কাস্টম বাস্তবায়ন প্রয়োজন | NSPersistentCloudKitContainer |
| প্ল্যাটফর্ম | iOS, Android, Flutter, RN, Node.js | iOS, Android, Web, ডেস্কটপ | শুধুমাত্র iOS/macOS |
| লাইব্রেরির আকার | ~4 MB | ~600 KB | SDK-তে বিল্ট-ইন |
Realm এবং SQLite-এর মধ্যে পছন্দ প্রায়শই অগ্রাধিকারে নেমে আসে: উন্নয়ন গতি এবং প্রতিক্রিয়াশীলতা (Realm) বনাম নিয়ন্ত্রণ এবং বহুমুখিতা (SQLite)। Realm বিশেষ করে MVP এবং প্রোটোটাইপের জন্য ভালো যেখানে ডেটা মডেল ঘন ঘন পরিবর্তিত হয় এবং দ্রুত লাইভ UI আপডেট পাওয়া গুরুত্বপূর্ণ। SQLite/Room বড় ডেটা ভলিউম এবং জটিল বিশ্লেষণাত্মক ক্যোয়ারী সহ পরিণত পণ্যের জন্য পছন্দনীয়।
Realm Kotlin SDK হল Android-এর জন্য অফিসিয়াল লাইব্রেরি, Kotlin-এ লেখা (Java SDK-এর উপর র্যাপার নয়)। ডেটা মডেল RealmObject থেকে উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাসের মাধ্যমে সংজ্ঞায়িত করা হয়, অনন্য শনাক্তকারীর জন্য @PrimaryKey অ্যানোটেশন সহ। Realm Kotlin Kotlin Coroutines, Flow এবং KSP (Kotlin Symbol Processing) কে কম্পাইল-টাইম কোড জেনারেশনের জন্য সমর্থন করে।
RealmQuery SQL ছাড়া ফিল্টারিংয়ের জন্য একটি type-safe API প্রদান করে। ক্যোয়ারীগুলি পদ্ধতি চেইনের মাধ্যমে তৈরি করা হয়: query → filter → sort → find। ফলাফল একটি তালিকা হিসাবে (মেমরিতে লোড) বা Flow হিসাবে (রিঅ্যাকটিভ স্ট্রিম যা ডেটা পরিবর্তিত হলে আপডেট হয়) ফেরত দেওয়া যেতে পারে। Realm Kotlin নেস্টেড অবজেক্ট এবং তালিকা (RealmList) সমর্থন করে।
ডেটা মডেল Realm একটি ডেটা ক্লাস হিসাবে সংজ্ঞায়িত করা হয় যা RealmObject ইন্টারফেস বাস্তবায়ন করে। _id ফিল্ডটি অনন্য শনাক্তকরণের জন্য @PrimaryKey দিয়ে চিহ্নিত। এক-থেকে-অনেক সম্পর্ক RealmList-এর মাধ্যমে বাস্তবায়িত হয় — অন্যান্য RealmObject-এর একটি তালিকা। সমস্ত লেখার অপারেশন (তৈরি, আপডেট, মুছে ফেলা) write লেনদেন ব্লকের ভিতরে সঞ্চালিত হয়।
class Project : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId().generate()
var name: String = ""
var tasks: RealmList<Task> = realmListOf()
}
class Task : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId().generate()
var title: String = ""
var isComplete: Boolean = false
}
val config = Realm.Configuration.Builder(
schema = setOf(Project::class, Task::class)
).build()
val realm = Realm.open(config)
realm.write { transactionRealm ->
val project = copyToRealm(Project().apply {
name = "Mobile App"
})
project.tasks.add(copyToRealm(Task().apply {
title = "Design UI"
}))
}
val projects: Flow<RealmResults<Project>> =
realm.query<Project>()
.sort(Project::name, Sort.ASCENDING)
.asFlow()
Flow-ফেরত ক্যোয়ারী Realm-এ যেকোনো ডেটা পরিবর্তনে স্বয়ংক্রিয়ভাবে নতুন ফলাফল নির্গত করে: Project বা Task যোগ করা, আপডেট করা বা মুছে ফেলা। Flow পদ্ধতি Compose-এর সাথে পুরোপুরি মেলে: ViewModel-এ collectAsState() ম্যানুয়ালি তালিকা অ্যাডাপ্টার আপডেট না করে বা LiveData ব্যবহার না করেই ডেটা পরিবর্তিত হলে স্বয়ংক্রিয়ভাবে UI পুনঃসংযোজন করে।
Realm Swift SDK async/await, Combine Publishers এবং Swift Concurrency-এর সমর্থন সহ একটি নেটিভ Swift API প্রদান করে। ডেটা মডেল Object থেকে উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাস হিসাবে সংজ্ঞায়িত করা হয়, বৈশিষ্ট্যগুলির জন্য @Persisted ব্যবহার করে। Realm Swift পরিবর্তনে স্বয়ংক্রিয়ভাবে অবজেক্ট আপডেট করে, এবং নোটিফিকেশন (NotificationToken) পৃথক অবজেক্ট বা সংগ্রহে পরিবর্তনের সাবস্ক্রাইব করার অনুমতি দেয়।
@ObservedRealmObject এবং @ObservedResults হল SwiftUI-এর জন্য Property Wrappers যা Realm ডেটা পরিবর্তিত হলে স্বয়ংক্রিয়ভাবে View পুনরায় আঁকে। @ObservedResults ক্যোয়ারী ফলাফলের সাথে কাজ করে, @ObservedRealmObject একটি নির্দিষ্ট অবজেক্টের সাথে। উভয় বৈশিষ্ট্যই View ডিইনিশিয়ালাইজ হলে সাবস্ক্রিপশন বাতিল করে।
SwiftUI ইন্টিগ্রেশন Realm SDK-এর শক্তিশালী দিকগুলির মধ্যে একটি। @ObservedResults Property Wrapper একটি Realm ক্যোয়ারীকে SwiftUI ডিসপ্লের সাথে লিঙ্ক করে। যখন কোনো টাস্ক পরিবর্তিত হয়, SwiftUI স্বয়ংক্রিয়ভাবে তালিকা পুনঃসংযোজন করে। realm.writeAsync UI ব্লক না করে ব্যাকগ্রাউন্ড থ্রেডে লেনদেন সম্পাদন করে।
import RealmSwift
class TaskItem: Object, Identifiable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var title: String = ""
@Persisted var isDone: Bool = false
@Persisted var priority: Int = 0
}
struct TaskListView: View {
@ObservedResults(TaskItem.self,
sortDescriptor: SortDescriptor(["priority"]))
var tasks
var body: some View {
List {
ForEach(tasks) { task in
TaskRow(task: task)
}
}
Button("Add Task") {
let realm = try! Realm()
try! realm.write {
realm.add(TaskItem(value: ["title": "New task"]))
}
}
}
}
@ObservedResults স্বয়ংক্রিয়ভাবে Realm ক্যোয়ারী জীবনচক্র পরিচালনা করে: View তৈরি হলে পরিবর্তনের সাবস্ক্রিপশন তৈরি হয়; ধ্বংস হলে বাতিল হয়। Property Wrapper একটি ঐচ্ছিক প্রিডিকেট (NSPredicate) এবং সর্ট ডেসক্রিপ্টর গ্রহণ করে। এটি ম্যানুয়ালি fetch অনুরোধ লেখা, ViewModels তৈরি এবং Realm নোটিফিকেশনে সাবস্ক্রাইব করার প্রয়োজনীয়তা দূর করে।
অফলাইন অ্যাপ্লিকেশন — Realm সেই পরিস্থিতির জন্য আদর্শ যেখানে ইন্টারনেট ছাড়াই ডেটা উপলব্ধ থাকতে হবে। বিল্ট-ইন সিঙ্ক্রোনাইজেশন (MongoDB Atlas-এর সাথে Realm Sync) নেটওয়ার্কে সংযুক্ত হলে স্বয়ংক্রিয়ভাবে দ্বন্দ্ব সমাধান করে। অ্যাপ স্থানীয় ডেটা নিয়ে কাজ চালিয়ে যায় এবং ব্যাকগ্রাউন্ড সিঙ্ক সংযোগ উপলব্ধ হলে তা আপডেট করে।
রিঅ্যাকটিভ ইন্টারফেস — Live Objects এবং Flow/Combine নোটিফিকেশন Realm-কে ঘন ঘন আপডেট হওয়া ডেটা সহ অ্যাপ্লিকেশনের জন্য সুবিধাজনক পছন্দ করে তোলে: চ্যাট, টাস্ক ফিড, সহযোগী ডকুমেন্ট। ম্যানুয়ালি reloadData বা invalidate কল না করেই ডেটা যোগ, পরিবর্তন বা মুছে ফেললে UI স্বয়ংক্রিয়ভাবে আপডেট হয়।
ক্রস-প্ল্যাটফর্ম প্রকল্প — Realm Kotlin Multiplatform (KMP), Flutter, React Native এবং Xamarin সমর্থন করে। ডেটা মডেল একবার সংজ্ঞায়িত করা হয় এবং সমস্ত প্ল্যাটফর্মে ব্যবহৃত হয়। এটি কোড পুনরাবৃত্তি হ্রাস করে এবং শেয়ার্ড বিজনেস লজিক সহ iOS এবং Android অ্যাপ্লিকেশনের মধ্যে স্কিমা ধারাবাহিকতা নিশ্চিত করে।
Realm Sync MongoDB Atlas-এ নির্মিত একটি ক্লাউড পরিষেবা। অ্যাপ্লিকেশন স্বয়ংক্রিয়ভাবে ব্যবহারকারীর ডিভাইস এবং সার্ভারের মধ্যে ডেটা সিঙ্ক্রোনাইজ করে। "last write wins" কৌশল বা সার্ভারে কাস্টম Conflict Resolution Functions-এর মাধ্যমে দ্বন্দ্ব সমাধান করা হয়। Realm Sync ট্র্যাফিক কমানোর জন্য আংশিক সিঙ্ক্রোনাইজেশন (ডেটার উপসেট) সমর্থন করে।
class SyncRepository {
private val app = App(
AppConfiguration(
appId = "my-realm-app-id"
)
)
suspend fun syncData() {
val user = app.login(Credentials.anonymous())
val config = SyncConfiguration.Builder(
user, setOf(Project::class)
).build()
val syncedRealm = Realm.open(config)
// স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন সক্রিয়
}
}
SyncConfiguration MongoDB Atlas-এ সংযোগ কনফিগার করে এবং সিঙ্ক্রোনাইজ করার মডেলের সেট সংজ্ঞায়িত করে। ব্যবহারকারী প্রমাণীকরণের পর, Realm স্বয়ংক্রিয়ভাবে ক্লাউড থেকে ডেটা লোড করে এবং স্থানীয় পরিবর্তনের সাথে একত্রিত করে। সিঙ্ক্রোনাইজেশন ব্যাকগ্রাউন্ড থ্রেডে চলে এবং ম্যানুয়াল কলের প্রয়োজন হয় না — শুধু SyncConfiguration দিয়ে Realm ইনস্ট্যান্স তৈরি করুন।
সচরাচর জিজ্ঞাসা
হ্যাঁ, স্থানীয় Realm ডেটাবেস সম্পূর্ণ বিনামূল্যে (Apache 2.0 লাইসেন্স)। MongoDB Atlas-এর মাধ্যমে Realm Sync (ক্লাউড সিঙ্ক্রোনাইজেশন) Atlas Device Sync সাবস্ক্রিপশনে অন্তর্ভুক্ত একটি পেইড পরিষেবা। বিনামূল্যের Atlas স্তরে প্রথম 500 MB ডেটা এবং প্রতি মাসে 1 মিলিয়ন অপারেশন অন্তর্ভুক্ত।
হ্যাঁ, মাইগ্রেশন SQLite থেকে JSON-এ ডেটা এক্সপোর্ট করে এবং প্রথম অ্যাপ্লিকেশন লোডে Realm-এ ইম্পোর্ট করার মাধ্যমে সম্ভব। বড় ভলিউমের জন্য, স্ট্রিমিং মাইগ্রেশন ব্যবহার করুন: ব্যবহারকারীরা নতুন অ্যাপ্লিকেশন সংস্করণে স্থানান্তর না হওয়া পর্যন্ত উভয় ডেটাবেসে সমান্তরালভাবে ডেটা লিখুন, তারপর SQLite ফাইল মুছে ফেলুন।
Realm Sync ডিফল্টরূপে "last write wins" কৌশল ব্যবহার করে — শেষ লেখাটি আগেরটি ওভাররাইট করে। জটিল দ্বন্দ্বের জন্য, MongoDB Atlas সার্ভারে কাস্টম Conflict Resolution Functions কনফিগার করুন যা অ্যাপ্লিকেশনের ব্যবসায়িক যুক্তি অনুসারে বিভিন্ন ডিভাইস থেকে পরিবর্তন একত্রিত করে (উদাহরণস্বরূপ, প্রতিস্থাপনের পরিবর্তে মান একত্রিত করা)।
Realm ডেটাবেস স্তরে SQL সমষ্টি (SUM, AVG, GROUP BY) সমর্থন করে না। বিশ্লেষণাত্মক ক্যোয়ারীর জন্য, Realm Sync-এর মাধ্যমে Realm থেকে MongoDB Atlas-এ ডেটা এক্সপোর্ট করে MongoDB Aggregation Pipeline-এর মাধ্যমে সমষ্টি চালানোর পরামর্শ দেওয়া হয়। সাধারণ গণনার জন্য, realm.query<T>().count() ব্যবহার করুন।
Realm ডিফল্টরূপে ডেটা এনক্রিপ্ট করে না। এনক্রিপশনের জন্য, কনফিগারেশনে একটি 64-বাইট কী প্রদান করুন: Realm.Configuration(encryptionKey: key)। এনক্রিপশন AES-256 + SHA-2 HMAC ব্যবহার করে এবং অপারেশনে ওভারহেড 10-20% বাড়ায়। এনক্রিপশন ছাড়া, .realm ফাইল ফাইল সিস্টেম অ্যাক্সেস সহ যেকোনো প্রক্রিয়া দ্বারা পড়া যেতে পারে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন