Hive: คืออะไร พื้นที่จัดเก็บ NoSQL และการพัฒนาโดยไม่ต้องใช้โค้ดเนทีฟ

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-03-13 เวลาอ่าน: 9 นาที

Hive คือพื้นที่จัดเก็บข้อมูล NoSQL น้ำหนักเบาสำหรับ Flutter ที่ทำงานโดยไม่ต้องใช้โค้ดเนทีฟ แตกต่างจาก SQLite หรือ Firebase ตรงที่ Hive ไม่ต้องใช้ไลบรารีเนทีฟและทำงานผ่าน Dart เท่านั้น ตามข้อมูลจาก Pub.dev, 2024 พบว่า Hive ถูกดาวน์โหลดมากกว่า 10 ล้านครั้ง และถูกใช้ในทุก ๆ หนึ่งในสามของโปรเจกต์ Flutter ที่ต้องการพื้นที่จัดเก็บข้อมูลในเครื่องโดยไม่มีโครงสร้างพื้นฐานเซิร์ฟเวอร์

ประเด็นสำคัญ

  • Hive — ฐานข้อมูล NoSQL บน Dart บริสุทธิ์ ไม่ต้องใช้โค้ดเนทีฟหรือการพึ่งพาแพลตฟอร์ม
  • ประสิทธิภาพ — อ่านได้สูงสุด 30,000 ครั้งต่อวินาทีบนอุปกรณ์มือถือ
  • การกำหนดชนิด — TypeAdapter สำหรับออบเจกต์ที่กำหนดเอง ไม่ต้องสร้างโค้ด
  • น้ำหนักเบา — ไม่ขึ้นกับ Android SDK หรือ iOS UIKit
  • รีแอคทีฟ — WatchBox สำหรับติดตามการเปลี่ยนแปลงแบบเรียลไทม์

Hive คืออะไร?

Hive คือฐานข้อมูล NoSQL ที่เขียนด้วยภาษา Dart ทั้งหมดและไม่ต้องใช้ไลบรารีเนทีฟ มันถูกสร้างโดย Simon Leiter ในปี 2019 เพื่อเป็นทางเลือกแทน SQLite สำหรับโปรเจกต์ Flutter Hive จัดเก็บข้อมูลในรูปแบบไบนารี .hive ที่ปรับให้เหมาะสมสำหรับการอ่านและเขียนที่รวดเร็วบนอุปกรณ์มือถือ รูปแบบ .hive ใช้สคีมาการทำให้เป็นอนุกรมแบบกำหนดเองซึ่งแต่ละชนิดข้อมูลมีคำนำหน้าไบต์ของตัวเอง ทำให้สามารถอ่านไฟล์ได้โดยไม่ต้องรู้สคีมาล่วงหน้า — ไม่เหมือน Protocol Buffers หรือ FlatBuffers

แนวคิดหลักของ Hive คือความเรียบง่ายสูงสุด ฐานข้อมูลไม่ต้องการการเริ่มต้นเอ็นจินเนทีฟ ไม่มีตัวแยกวิเคราะห์ SQL และไม่ใช้รีเฟลกชัน การดำเนินการทั้งหมดเป็นการเรียกฟังก์ชัน Dart โดยตรงด้วยการทำให้เป็นอนุกรมแบบไบนารีผ่าน WriteBuffer และ ReadBuffer

จากการสำรวจของ Flutter Community (2023) พบว่า Hive อยู่ใน 5 อันดับแพ็กเกจจัดเก็บข้อมูลที่ใช้มากที่สุดใน Flutter รองจาก shared_preferences ในด้านความนิยม แต่เหนือกว่าในด้านฟังก์ชันการทำงานและความเร็ว

สถาปัตยกรรมของ Hive

Hive ใช้แนวคิดของ Box — เปรียบเสมือนตารางในฐานข้อมูลเชิงสัมพันธ์ แต่ละ Box คือไฟล์บนดิสก์ที่มีชุดคู่คีย์-ค่า คีย์สามารถเป็น int หรือ String ค่าสามารถเป็นชนิดพื้นฐานใด ๆ รายการ Map หรือออบเจกต์ที่กำหนดเองผ่าน TypeAdapter Box ต่าง ๆ ถูกแยกออกจากกันและเปิดอย่างอิสระ

ข้อดีเหนือโซลูชันเนทีฟ

Hive ไม่ต้องใช้ช่องสัญญาณแพลตฟอร์ม ซึ่งหมายความว่ามันทำงานเหมือนกันบน Android, iOS, Web, macOS, Windows และ Linux โดยไม่ต้องตั้งค่าเพิ่มเติม สำหรับโปรเจกต์ที่มุ่งเป้าไปที่การ build เว็บ Hive ยังคงเป็นโซลูชัน NoSQL น้ำหนักเบาเพียงหนึ่งเดียว — SQLite ไม่ทำงานในเบราว์เซอร์ Hive ใช้ IndexedDB เป็นแบ็กเอนด์สำหรับเว็บ ซึ่งรับประกันความคงทนของข้อมูลแม้ในสภาพแวดล้อมเบราว์เซอร์

Hive ทำงานอย่างไร?

Hive ทำให้ข้อมูลเป็นอนุกรมในรูปแบบไบนารีเมื่อเขียนและดีซีเรียลไลซ์เมื่ออ่าน กลไกภายในขึ้นอยู่กับ BinaryWriter และ BinaryReader ซึ่งบรรจุข้อมูลลงในอาร์เรย์ไบต์ขนาดกะทัดรัด ขนาดพื้นที่จัดเก็บในดิสก์โดยเฉลี่ยเล็กกว่าการแสดง JSON ของข้อมูลเดียวกัน 2–3 เท่า

เมื่อเปิด Box Hive จะโหลดไฟล์ทั้งหมดลงใน RAM ซึ่งให้ความเร็วในการอ่านสูง (ไมโครวินาที) แต่กำหนดข้อจำกัดด้านขนาด: แนะนำให้จัดเก็บไม่เกิน 50–100 MB ต่อ Box สำหรับปริมาณที่มากขึ้น ให้ใช้ LazyBox — การโหลดเรกคอร์ดจากดิสก์แบบขี้เกียจ

ธุรกรรมและการทำงานพร้อมกัน

Hive ทำงานแบบเธรดเดียวภายในไอโซเลต Dart การดำเนินการเขียนจะดำเนินการแบบซิงโครนัสพร้อมการล็อกไฟล์ สำหรับการเข้าถึงแบบอะซิงโครนัส ให้ใช้ Hive.openBox() พร้อม await การเข้าถึงพร้อมกันจากหลายไอโซเลตไม่ได้รับการสนับสนุนโดยตรง — จำเป็นต้องมีกลไกการซิงโครไนซ์แยกต่างหาก

Hive เทียบกับ SharedPreferences และ SQLite

Hive อยู่ในตำแหน่งระหว่าง SharedPreferences และ SQLite มันซับซ้อนกว่า SharedPreferences (รองรับออบเจกต์ที่กำหนดเอง) แต่เรียบง่ายกว่า SQLite (ไม่ต้องใช้คำสั่ง SQL) มาเปรียบเทียบคุณลักษณะสำคัญกัน

คุณลักษณะHiveSharedPreferencesSQLite
ชนิดข้อมูลใดก็ได้ (ผ่าน TypeAdapter)เฉพาะชนิดพื้นฐานชนิด SQL
ความเร็วในการอ่าน~30,000 ops/s~5,000 ops/s~2,000 ops/s
โค้ดเนทีฟไม่จำเป็นจำเป็น (Android)จำเป็น
รองรับเว็บใช่ไม่ไม่
ความซับซ้อนต่ำน้อยที่สุดปานกลาง
การตอบสนองWatchBoxไม่ผ่าน ORM

เมื่อใดควรเลือก Hive

Hive เหมาะสมที่สุดสำหรับข้อมูลปริมาณน้อย: การตั้งค่าแอป, แคชการตอบสนอง API, คิวซิงค์ในเครื่อง, รายการโปรด และประวัติการเรียกดู หากข้อมูลไม่เกิน 50 MB และไม่ต้องการคำสั่งเชิงสัมพันธ์ — Hive เร็วกว่าและง่ายกว่า SQLite

เมื่อใด Hive ไม่เหมาะสม

Hive ไม่รองรับคำสั่งที่มีการกรองหลายฟิลด์ JOIN หรือฟังก์ชันรวม หากคุณต้องการคำสั่งที่ซับซ้อนเช่น “เลือกงานทั้งหมดของวันนี้ที่มีลำดับความสำคัญสูงกว่า 3” — ให้ใช้ SQLite กับ drift หรือ floor Hive ยังไม่เหมาะสำหรับการจัดเก็บข้อมูลมากกว่า 100 MB เนื่องจากการโหลดเข้าสู่หน่วยความจำ

ตัวอย่างโค้ดกับ Hive

Hive เริ่มต้นด้วยการเริ่มต้นและการเปิด Box ด้านล่างนี้คือการดำเนินการพื้นฐานสำหรับสถานการณ์ทั่วไป — การจัดเก็บรายการงานในแอปพลิเคชัน Flutter ตัวอย่างทั้งหมดทำงานโดยไม่ต้องเรียกแพลตฟอร์มเนทีฟ

การเริ่มต้นและการเปิด Box

ก่อนใช้ Hive คุณต้องเรียก Hive.initFlutter() ในฟังก์ชัน main จากนั้นเปิด Box ผ่าน Hive.openBox() — ผลลัพธ์จะเป็นอินสแตนซ์ Box ที่พร้อมสำหรับการอ่านและเขียน

dart
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

void async main() {
    await Hive.initFlutter();
    final settingsBox = await Hive.openBox('settings');
    runApp(MyApp());
}

การดำเนินการ CRUD

Box มีเมธอด put, get, delete และตัววนซ้ำเพื่อสำรวจรายการทั้งหมด คีย์และค่าจะถูกกำหนดชนิดผ่านเจเนอริก — โดยค่าเริ่มต้น Box<dynamic> ยอมรับทุกชนิด แต่แนะนำให้ระบุชนิดที่เฉพาะเจาะจง

dart
// เขียนข้อมูล
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'ซื้อของชำ');

// อ่าน
final task = box.get('task_1');

// คีย์ทั้งหมด
final allTasks = box.values.toList();

// ลบ
await box.delete('task_1');

// ล้าง Box
await box.clear();

การสังเกตแบบรีแอคทีฟผ่าน WatchBox

WatchBox เป็นส่วนขยายของ Box ที่แจ้งให้ผู้ติดตามทราบเกี่ยวกับการเปลี่ยนแปลง ใน Flutter สิ่งนี้ทำงานร่วมกับ ValueListenableBuilder: เมื่อค่าใด ๆ ใน Box เปลี่ยนแปลง วิดเจ็ตจะถูกสร้างใหม่โดยอัตโนมัติโดยไม่ต้องเรียก setState

dart
final watchBox = await Hive.openBox('settings');

// ในวิดเจ็ต
ValueListenableBuilder(
    valueListenable: watchBox.listenable(),
    builder: (context, box, _) {
        final counter = box.get('counter') ?? 0;
        return Text('ตัวนับ: $counter');
    },
)

TypeAdapter และออบเจกต์ที่กำหนดเอง

TypeAdapter เป็นกลไกของ Hive สำหรับทำให้ออบเจกต์ Dart ที่กำหนดเองเป็นอนุกรม ตัวปรับเปลี่ยนอธิบายวิธีแปลงออบเจกต์เป็นรูปแบบไบนารี (write) และกลับ (read) แตกต่างจาก json_serializable ตรงที่ TypeAdapter ไม่ต้องใช้รีเฟลกชันและเร็วกว่า

การสร้าง TypeAdapter

ตัวปรับเปลี่ยนใช้อินเทอร์เฟส TypeAdapter ด้วยสองเมธอด: read และ write คลาสจะถูกลงทะเบียนผ่าน Hive.registerAdapter() ก่อนเปิด Box ตัวปรับเปลี่ยนแต่ละตัวจะได้รับ ID ตัวเลข — มันถูกบันทึกในไฟล์เพื่อระบุชนิด

dart
// โมเดลข้อมูล
class Task {
    final String title;
    final bool isCompleted;
    Task({required this.title, this.isCompleted = false});
}

// TypeAdapter
class TaskAdapter extends TypeAdapter<Task> {
    @override
    final int typeId = 0;

    @override
    Task read(BinaryReader reader) {
        return Task(
            title: reader.readString(),
            isCompleted: reader.readBool(),
        );
    }

    @override
    void write(BinaryWriter writer, Task obj) {
        writer.writeString(obj.title);
        writer.writeBool(obj.isCompleted);
    }
}

การสร้างตัวปรับเปลี่ยนผ่านการสร้างโค้ด

สำหรับโปรเจกต์ที่มีโมเดลจำนวนมาก Hive มี hive_generator และ build_runner คำอธิบายประกอบ @HiveType บนคลาสและ @HiveField บนฟิลด์จะสร้างตัวปรับเปลี่ยนโดยอัตโนมัติ สะดวกเมื่อโมเดลมี 10+ ฟิลด์ — การเขียน read/write ด้วยตนเองกลายเป็นเรื่องน่าเบื่อ

การปรับประสิทธิภาพของ Hive

Hive อ่านจากหน่วยความจำแทนดิสก์ ให้ความเร็วสูงสุดถึง 30,000 การดำเนินการต่อวินาที เพื่อการปรับแต่ง: เปิด Box ครั้งเดียวและนำมาใช้ซ้ำทั่วทั้งแอป อย่าเรียก openBox ซ้ำ ๆ ใช้ Hive.box() (getter แบบซิงโครนัส) หลังจากการเริ่มต้น — มันคืนค่า Box ที่เปิดอยู่แล้วโดยไม่สร้างอินสแตนซ์ใหม่

Hive กับ Provider และ Riverpod

Hive ผสานรวมกับตัวจัดการสถานะ Flutter ยอดนิยมได้อย่างง่ายดาย สำหรับ Provider ให้ใช้ ChangeNotifierProvider ที่อ่านข้อมูลจาก Box เมื่อเริ่มต้นและอัปเดตผ่าน listenable สำหรับ Riverpod StreamProvider ที่สมัครรับ WatchBox ทำงานได้ดี การรวมกันนี้ให้การอัปเดต UI แบบรีแอคทีฟทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลใน Hive โดยไม่ต้องเรียก setState ด้วยตนเอง ในโปรเจกต์ Flutter ทั่วไป สถาปัตยกรรมนี้ช่วยให้ซิงค์สถานะระหว่างหน้าจอโดยไม่ต้องใช้ซิงเกิลตันส่วนกลาง

คำถามที่พบบ่อย

สามารถใช้ Hive โดยไม่มี Flutter ได้หรือไม่?

Hive ทำงานบน Dart บริสุทธิ์ ดังนั้นจึงสามารถใช้ในโปรเจกต์ Dart ใดก็ได้: ฝั่งเซิร์ฟเวอร์ (Dart VM), คอนโซล หรือ AngularDart สำหรับ Flutter จำเป็นต้องใช้ hive_flutter เพิ่มเติมสำหรับการเริ่มต้นเส้นทางจัดเก็บข้อมูล

วิธีเข้ารหัสข้อมูลใน Hive?

Hive รองรับการเข้ารหัส AES-256 ผ่านพารามิเตอร์ encryptionKey เมื่อเปิด Box คีย์ต้องเป็นสตริง 32 ไบต์ Box ที่เข้ารหัสแล้วไม่สามารถอ่านได้โดยไม่มีคีย์ — ข้อมูลได้รับการปกป้องในระดับไฟล์

Hive แตกต่างจาก Isar อย่างไร?

Isar คือผู้สืบทอดของ Hive จากผู้เขียนเดียวกัน (Simon Leiter) Isar เร็วกว่า รองรับดัชนี ความสัมพันธ์ และคำสั่งที่ซับซ้อน อย่างไรก็ตาม Hive ยังคงมีความเกี่ยวข้องสำหรับสถานการณ์ง่าย ๆ ที่ไม่ต้องการความสามารถเชิงสัมพันธ์ของ Isar และสำหรับโปรเจกต์ที่การพึ่งพาน้อยที่สุดเป็นสิ่งสำคัญ

Hive รองรับการย้ายสคีมาหรือไม่?

Hive ไม่มีการย้ายสคีมาในตัว หากโครงสร้าง TypeAdapter เปลี่ยนแปลง ข้อมูลเก่าจะไม่ถูกดีซีเรียลไลซ์ วิธีแก้ไข: เพิ่ม typeId ของตัวปรับเปลี่ยนและเขียนการย้ายสคีมาด้วยตนเองในโค้ด หรือใช้ delete สำหรับคีย์เก่าก่อนเขียนคีย์ใหม่

ขนาดสูงสุดของ Hive Box คือเท่าใด?

Hive โหลด Box ทั้งหมดลงในหน่วยความจำ ขีดจำกัดที่แนะนำคือ 50–100 MB ต่อ Box การเกินกว่านี้อาจทำให้เกิดความล่าช้าเมื่อเปิด Box และการใช้ RAM เพิ่มขึ้น สำหรับปริมาณที่มากขึ้น ให้ใช้หลาย Box หรือ LazyBox พร้อมการโหลดแบบขี้เกียจ

สรุป

  • Hive — ฐานข้อมูล NoSQL บน Dart บริสุทธิ์ ไม่ต้องใช้โค้ดเนทีฟหรือการพึ่งพาแพลตฟอร์ม
  • ประสิทธิภาพ — สูงถึง 30,000 การดำเนินการอ่านต่อวินาทีบนอุปกรณ์มือถือ
  • TypeAdapter — การทำให้เป็นอนุกรมแบบไบนารีของออบเจกต์ที่กำหนดเองโดยไม่ต้องรีเฟลกชัน
  • WatchBox — การติดตามการเปลี่ยนแปลงแบบรีแอคทีฟสำหรับการอัปเดต UI อัตโนมัติ
  • ข้ามแพลตฟอร์ม — Android, iOS, Web, macOS, Windows, Linux พร้อมใช้งานทันที
  • การเข้ารหัส — การป้องกันข้อมูล AES-256 ในระดับไฟล์ Box
  • คำแนะนำ — ใช้ Hive สำหรับแคช การตั้งค่า และข้อมูลปริมาณน้อยในโปรเจกต์ Flutter และ Dart

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม