ObjectBox เป็นฐานข้อมูล NoSQL ประสิทธิภาพสูงที่ปรับให้เหมาะสมสำหรับอุปกรณ์มือถือและอุปกรณ์ขอบข่าย แตกต่างจาก SQLite ตรงที่ใช้รูปแบบจัดเก็บไฟล์แบบเรียบของตัวเองโดยไม่มีชั้น SQL ตาม ObjectBox Benchmarks, 2024 ObjectBox ดำเนินการแทรกและอ่านได้เร็วกว่า SQLite 10–100 เท่าบนอุปกรณ์ Android ทำให้เป็นตัวเลือกที่ดีที่สุดสำหรับแอปพลิเคชันมือถือที่มีโหลดสูง
ประเด็นสำคัญ
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) ฐานข้อมูลนี้ถูกใช้ในแอปพลิเคชันมากกว่า 5,000 รายการบน 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 จัดเก็บข้อมูลในรูปแบบไบนารีของตัวเอง .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 ด้อยกว่า SQLite ในสถานการณ์ที่ต้องการคำสั่ง JOIN ที่ซับซ้อน ฟังก์ชันรวม (SUM, COUNT แบบมีกลุ่ม) หรือการผสานรวมกับสคีมา SQL ที่มีอยู่ หากโปรเจกต์ใช้ SQLite กับ Room ORM อยู่แล้ว การย้ายไป ObjectBox จะต้องเขียนลอจิกการเข้าถึงข้อมูลทั้งหมดใหม่ ObjectBox ยังไม่รองรับคำสั่ง SQL แบบกำหนดเอง — มีเพียง API แบบลู่อิสระ อย่างไรก็ตาม สำหรับการดำเนินการ CRUD ทั่วไปและการแคช ObjectBox ให้การปรับปรุงประสิทธิภาพสูงถึง 100 เท่า ตามที่ยืนยันโดยเกณฑ์วัดอย่างเป็นทางการบนอุปกรณ์ Android ที่มีระบบปฏิบัติการเวอร์ชันต่างๆ
ObjectBox ใช้คำอธิบายประกอบเพื่อกำหนดเอนทิตี หลังจากการคอมไพล์ คลาส Box จะถูกสร้างขึ้นพร้อมเมธอด put, get, remove และ query ด้านล่างนี้เป็นการดำเนินการทั่วไปสำหรับโมเดล Task ในแอปรายการสิ่งที่ต้องทำ
แต่ละเอนทิตีจะมีคำอธิบายประกอบด้วย @Entity ฟิลด์ที่มี @Id จะกลายเป็นคีย์หลัก และ @Index จะเร่งการค้นหาในฟิลด์นั้น ObjectBox รองรับการสร้าง ID อัตโนมัติเมื่อค่าเป็น 0
@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 รองรับความสัมพันธ์ระหว่างเอนทิตี — แบบหนึ่งต่อหนึ่ง หนึ่งต่อหลาย และหลายต่อหลาย ความสัมพันธ์ถูกกำหนดผ่านคำอธิบายประกอบ @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 พร้อมการแก้ไขข้อขัดแย้งแบบ last-writer-wins 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 รองรับ Kotlin Multiplatform (KMP) ตั้งแต่เวอร์ชัน 3.0 เป้าหมายที่พร้อมใช้งาน: Android, iOS, JVM และ Native สำหรับ KMP จะใช้ปลั๊กอิน Gradle แยกต่างหาก objectbox-kotlin ที่รองรับ expect/actual
ObjectBox จัดเก็บข้อมูลในไฟล์ .mdb ในไดเรกทอรีของแอป สำหรับการสำรองข้อมูล ให้คัดลอกไดเรกทอรี ObjectBox ทั้งหมดผ่าน BoxStore.copy() หรือคัดลอกไฟล์ด้วยตนเองหลังจากเรียก boxStore.close() ไม่สามารถคัดลอกไฟล์ที่กำลังใช้งานอยู่ได้ — ซึ่งจะทำให้ข้อมูลเสียหาย
Room คือ ORM บน SQLite ต้องการคำสั่ง SQL และมีภาระการแมปวัตถุ ObjectBox เป็นฐานข้อมูล NoSQL ที่ไม่มี SQL เร็วกว่าหลายเท่า แต่ไม่รองรับ JOIN ที่ซับซ้อนและไม่ใช่ฐานข้อมูลเชิงสัมพันธ์ การเลือกขึ้นอยู่กับงาน: สำหรับข้อมูลเชิงสัมพันธ์ — Room สำหรับการจัดเก็บวัตถุที่รวดเร็ว — ObjectBox
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม