ObjectBox: NoSQL DB và cách làm việc với dữ liệu

Tác giả: IT Sectr Đã đăng: 2026-03-13 Thời gian đọc: 9 phút

ObjectBox là cơ sở dữ liệu NoSQL hiệu suất cao được tối ưu hóa cho thiết bị di động và edge. Không giống SQLite, nó sử dụng định dạng lưu trữ tệp phẳng riêng mà không có lớp SQL. Theo ObjectBox Benchmarks, 2024, ObjectBox thực hiện các thao tác chèn và đọc nhanh hơn SQLite từ 10–100 lần trên thiết bị Android, khiến nó trở thành lựa chọn tốt nhất cho các ứng dụng di động có tải cao.

Những điểm chính

  • ObjectBox — NoSQL DB với tệp phẳng, không có SQL hay lớp ORM
  • Hiệu suất — nhanh hơn SQLite từ 10–100 lần trong thao tác ghi và đọc
  • Đa nền tảng — Android, iOS, Linux, macOS, Windows và WebAssembly
  • Tính phản ứng — Observable và Flow tích hợp để theo dõi thay đổi
  • Tích hợp dễ dàng — tạo mã qua chú thích, không cần truy vấn SQL

ObjectBox là gì?

ObjectBox là cơ sở dữ liệu NoSQL trong bộ nhớ được phát triển bởi công ty Đức ObjectBox.io. Không giống các cơ sở dữ liệu quan hệ truyền thống, ObjectBox lưu trữ đối tượng trực tiếp trong các tệp phẳng sử dụng định dạng SLOT (Super Lightweight Object Tree) riêng. Điều này loại bỏ chi phí của ORM và phân tích cú pháp SQL. Định dạng SLOT được tối ưu hóa cho thiết bị có bộ nhớ hạn chế: dữ liệu được chống phân mảnh tự động và kích thước cơ sở dữ liệu trung bình nhỏ hơn 4–6 lần so với cơ sở dữ liệu SQLite tương đương với cùng số lượng bản ghi.

ObjectBox hỗ trợ tất cả các nền tảng di động chính: Android, iOS và Flutter. Đối với Android, tính năng tạo mã có sẵn thông qua ObjectBox Gradle Plugin, plugin này xử lý các thực thể được chú thích và tạo các lớp Box để làm việc với dữ liệu. Đối với Flutter, một plugin gốc với trình bao bọc Dart được sử dụng. Ngoài các nền tảng di động, ObjectBox chạy trên Linux, macOS, Windows và WebAssembly, cho phép tái sử dụng mô hình dữ liệu giữa ứng dụng di động và đồng bộ hóa máy chủ.

Theo nghiên cứu của ObjectBox (2023), cơ sở dữ liệu được sử dụng trong hơn 5.000 ứng dụng trên Google Play, bao gồm các ứng dụng có hơn 10 triệu người dùng. Các trường hợp sử dụng chính: lưu đệm dữ liệu, hoạt động ngoại tuyến và lưu trữ chuỗi thời gian (IoT). ObjectBox đặc biệt phổ biến trong các ứng dụng theo dõi sức khỏe và thể dục, yêu cầu ghi nhanh chỉ số cảm biến trên thiết bị mà không cần kết nối Internet liên tục và thu thập phân tích từ nhiều thiết bị.

Lịch sử và định vị

ObjectBox ra đời như một giải pháp thay thế cho Realm và SQLite trên nền tảng Android. Phiên bản ổn định đầu tiên được phát hành vào năm 2018. Sự khác biệt chính so với Realm là ObjectBox không có hạn chế GPL (sử dụng Apache 2.0) và hỗ trợ nhiều nền tảng hơn: từ thiết bị di động đến máy chủ Linux.

Tính năng chính

ObjectBox cung cấp: tự động tạo lớp Box, chỉ mục tích hợp để tìm kiếm nhanh, giao dịch với hỗ trợ khôi phục, truy vấn phản ứng qua RxJava và Kotlin Flow, và đồng bộ hóa giữa các thiết bị qua ObjectBox Sync (giao thức độc quyền). Không giống Firebase Realtime Database, ObjectBox Sync hoạt động theo mô hình peer-to-peer không có máy chủ trung tâm, giảm độ trễ và chi phí hạ tầng.

ObjectBox hoạt động thế nào?

ObjectBox lưu trữ dữ liệu ở định dạng nhị phân riêng .mdb (ObjectBox Data File). Mỗi thực thể được ánh xạ vào một tệp, nơi các bản ghi được lưu trữ tuần tự với độ lệch cố định. Điều này cho phép đọc và ghi các đối tượng riêng lẻ mà không cần quét toàn bộ tệp.

Làm việc với ObjectBox không cần SQL: các truy vấn được xây dựng thông qua API fluent trong mã. Trình biên dịch tạo các lớp trợ giúp MyObjectBox và Boxes bao bọc tất cả các thao tác CRUD. Mô hình dữ liệu được mô tả thông qua chú thích @Entity, @Id, @Index và @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 vs SQLite: so sánh hiệu suất

Theo các benchmark chính thức, ObjectBox vượt trội đáng kể so với SQLite về tốc độ, đặc biệt trong chèn hàng loạt và đọc khối lượng lớn. Tuy nhiên, SQLite vẫn là tiêu chuẩn thực tế cho các ứng dụng di động nhờ tính phổ biến và hỗ trợ SQL tích hợp.

Thao tácObjectBoxSQLiteKhác biệt
Chèn (1000 bản ghi)~5 ms~180 msnhanh hơn ×36
Đọc (1000 bản ghi)~3 ms~70 msnhanh hơn ×23
Cập nhật (1000 bản ghi)~6 ms~150 msnhanh hơn ×25
Tìm kiếm theo chỉ mục~0.1 ms~2 msnhanh hơn ×20
Kích thước DB (1000 đối tượng)~28 KB~112 KBnhỏ hơn 4 lần

Khi nào ObjectBox không tối ưu

ObjectBox kém hơn SQLite trong các tình huống cần truy vấn JOIN phức tạp, hàm tổng hợp (SUM, COUNT với nhóm) hoặc tích hợp với lược đồ SQL hiện có. Nếu dự án đã sử dụng SQLite với Room ORM, việc di chuyển sang ObjectBox sẽ yêu cầu viết lại toàn bộ logic truy cập dữ liệu. ObjectBox cũng không hỗ trợ truy vấn SQL tùy chỉnh — chỉ API fluent. Tuy nhiên, đối với các thao tác CRUD điển hình và lưu đệm, ObjectBox cải thiện hiệu suất lên đến 100 lần, được xác nhận bởi các benchmark chính thức trên thiết bị Android với các phiên bản hệ điều hành khác nhau.

Ví dụ mã với ObjectBox

ObjectBox sử dụng chú thích để định nghĩa các thực thể. Sau khi biên dịch, các lớp Box được tạo ra với các phương thức put, get, remove và query. Dưới đây là các thao tác điển hình cho mô hình Task trong ứng dụng danh sách việc cần làm.

Định nghĩa thực thể

Mỗi thực thể được chú thích với @Entity. Trường có @Id trở thành khóa chính và @Index tăng tốc tìm kiếm trên trường đó. ObjectBox hỗ trợ tạo ID tự động khi giá trị là 0.

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

Thao tác CRUD

Box là lớp chính để làm việc với thực thể. Phương thức put() lưu hoặc cập nhật đối tượng, get() đọc theo ID và remove() xóa. Tất cả thao tác cơ bản đều đồng bộ và thực thi trên luồng gọi.

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)

Truy vấn phản ứng

ObjectBox hỗ trợ truy vấn phản ứng qua .subscribe(). Người đăng ký nhận thông báo khi dữ liệu khớp với điều kiện truy vấn thay đổi. Điều này thuận tiện cho giao diện người dùng tự động cập nhật danh sách khi các mục được thêm hoặc xóa.

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

query.subscribe { tasks ->
    // tasks — List, tự động cập nhật
    updateUi(tasks)
}

Quan hệ và truy vấn trong ObjectBox

ObjectBox hỗ trợ quan hệ giữa các thực thể — Một-Một, Một-Nhiều và Nhiều-Nhiều. Quan hệ được định nghĩa qua chú thích @Relation. Không giống SQLite, ObjectBox không sử dụng khóa ngoại: quan hệ được triển khai qua danh sách ID trong tệp phẳng, tăng tốc điều hướng đồ thị đối tượng.

Một-Nhiều qua @Backlink

Quan hệ @Backlink cho phép đi từ thực thể con đến thực thể cha mà không cần trường tham chiếu riêng. ObjectBox tự động duy trì backlink, loại bỏ trùng lặp dữ liệu và đồng bộ hóa giữa hai bảng.

Truy vấn Fluent

ObjectBox Query Builder cho phép xây dựng chuỗi điều kiện: equal, notEqual, greater, less, in, contains, startsWith. Tất cả điều kiện có thể kết hợp qua and/or. Kết quả có thể được sắp xếp, giới hạn và lấy dưới dạng List hoặc LazyList (cho tập dữ liệu lớn).

Thiết lập chỉ mục để tìm kiếm nhanh hơn

ObjectBox tự động đánh chỉ mục trường @Id. Đối với chỉ mục tùy chỉnh, sử dụng chú thích @Index trên các trường thường xuyên được truy vấn. Chỉ mục tăng tốc truy vấn equal và in nhưng làm chậm chèn — không đánh chỉ mục các trường không được tìm kiếm. ObjectBox hỗ trợ chỉ mục tổng hợp để lọc theo nhiều trường cùng lúc. Chỉ mục tổng hợp đặc biệt hữu ích cho bộ lọc danh sách: ví dụ, tìm kiếm tác vụ chưa hoàn thành có mức ưu tiên cao nhanh hơn hàng chục lần với chỉ mục tổng hợp trên các trường isCompleted và priority.

ObjectBox Sync — đồng bộ hóa giữa các thiết bị

ObjectBox Sync là công nghệ độc quyền để đồng bộ hóa dữ liệu thời gian thực giữa các thiết bị. Nó sử dụng giao thức dựa trên WebSocket với giải quyết xung đột theo last-writer-wins. Sync phù hợp cho các ứng dụng cần đồng bộ hóa ngoại tuyến: ghi chú, danh sách tác vụ, dữ liệu IoT từ nhiều cảm biến. Tuy nhiên, cần mua giấy phép cho môi trường sản xuất.

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()

Câu hỏi thường gặp

ObjectBox có miễn phí cho mục đích thương mại không?

ObjectBox được phân phối theo giấy phép Apache 2.0, cho phép sử dụng thương mại mà không bị hạn chế. Tính năng ObjectBox Sync (đồng bộ hóa đa nền tảng) là độc quyền và yêu cầu mua giấy phép cho môi trường sản xuất.

ObjectBox có hỗ trợ đa luồng không?

BoxStore an toàn cho luồng: nhiều luồng có thể đọc dữ liệu đồng thời. Ghi bị khóa ở cấp Box. Đối với giao dịch phức tạp, sử dụng boxStore.runInTx(), đảm bảo tính nguyên tử của một nhóm thao tác.

Có thể sử dụng ObjectBox với Kotlin Multiplatform không?

Có, ObjectBox hỗ trợ Kotlin Multiplatform (KMP) từ phiên bản 3.0. Các nền tảng đích có sẵn: Android, iOS, JVM và Native. Đối với KMP, một plugin Gradle riêng objectbox-kotlin với hỗ trợ expect/actual được sử dụng.

Cách sao lưu cơ sở dữ liệu ObjectBox?

ObjectBox lưu trữ dữ liệu trong các tệp .mdb trong thư mục ứng dụng. Để sao lưu, hãy sao chép toàn bộ thư mục ObjectBox qua BoxStore.copy() hoặc sao chép thủ công các tệp sau khi gọi boxStore.close(). Không thể sao chép tệp đang hoạt động — điều này sẽ làm hỏng dữ liệu.

ObjectBox khác Room thế nào?

Room là ORM trên nền SQLite, yêu cầu truy vấn SQL và có chi phí ánh xạ đối tượng. ObjectBox là cơ sở dữ liệu NoSQL không cần SQL, nhanh hơn một bậc độ lớn, nhưng không hỗ trợ JOIN phức tạp và không phải là cơ sở dữ liệu quan hệ. Lựa chọn phụ thuộc vào nhiệm vụ: cho dữ liệu quan hệ — Room, cho lưu trữ đối tượng nhanh — ObjectBox.

Tổng kết

  • ObjectBox — NoSQL DB với hiệu suất gấp 10–100 lần SQLite trên thiết bị di động
  • Tệp phẳng — định dạng SLOT độc quyền không có lớp SQL và chi phí ORM
  • Chú thích — @Entity, @Id, @Index, @Relation để mô tả mô hình dữ liệu
  • Tính phản ứng — Observable và Flow tích hợp để cập nhật giao diện tự động
  • Đa nền tảng — Android, iOS, Linux, macOS, Windows, WebAssembly
  • Lưu đệm và ngoại tuyến — trường hợp sử dụng chính của ObjectBox trong ứng dụng di động
  • Khuyến nghị — chọn ObjectBox cho các tác vụ mà tốc độ truy cập dữ liệu quan trọng hơn tính toàn vẹn quan hệ

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm