- ไฟล์ฐานข้อมูล SQLite เป็นฟอร์แมตแบบ ไฟล์เดียว ที่เหมาะสำหรับการเก็บสถานะของแอปพลิเคชันหรือใช้แลกเปลี่ยนข้อมูล
- มีโครงสร้างมากกว่า ฟอร์แมตแบบกำหนดเอง, ชุดไฟล์ (pile-of-files), ฟอร์แมตที่อิง ZIP และสามารถกำหนดได้อย่างชัดเจนด้วย สคีมา SQL
- ช่วยให้เข้าถึงข้อมูลและมีความเสถียรด้วย ทรานแซกชัน, ดัชนี, ภาษาคิวรีระดับสูง พร้อมรองรับ การอัปเดตแบบเพิ่มทีละส่วน และ การเข้าถึงจากหลายโปรเซส
- ด้วย ความเข้ากันได้ข้ามแพลตฟอร์ม, ความสามารถในการขยาย, ประสิทธิภาพ, และ อินเทอร์เฟซสำหรับหลายภาษา จึงช่วยเพิ่มประสิทธิภาพการพัฒนาและการบำรุงรักษา
- ด้วยโครงสร้างข้อมูลที่ชัดเจนและการออกแบบที่ยึดสคีมาเป็นศูนย์กลาง ทำให้ได้ คุณภาพแอปพลิเคชันที่ดีกว่าและการเก็บรักษาข้อมูลระยะยาวที่มั่นคงกว่า
แนวคิดของฟอร์แมตไฟล์แอปพลิเคชัน
- ฟอร์แมตไฟล์แอปพลิเคชันคือ โครงสร้างไฟล์ สำหรับบันทึกสถานะของโปรแกรมลงดิสก์ หรือใช้แลกเปลี่ยนข้อมูลระหว่างโปรแกรม
- ตัวอย่าง: DOC, DWG, PDF, XLS, GIT, EPUB, ODT, PPT, ODP เป็นต้น
- ไฟล์ฟอร์แมต (file format) ใช้เก็บอ็อบเจ็กต์เดี่ยว ๆ (เช่น JPEG, GIF, XHTML) แต่ ฟอร์แมตแอปพลิเคชัน (application format) จะเก็บหลายอ็อบเจ็กต์พร้อมความสัมพันธ์ระหว่างกัน
- ฟอร์แมตแอปพลิเคชันส่วนใหญ่แบ่งได้เป็น 3 ประเภท
- ฟอร์แมตแบบกำหนดเอง: เช่น DOC, DWG, PDF เป็นโครงสร้างไบนารีเฉพาะของแอป จึงเข้าถึงจากเครื่องมือภายนอกไม่ได้
- ชุดไฟล์ (pile-of-files) : เป็นโครงสร้างที่ประกอบด้วยหลายไฟล์แบบ Git บางส่วนอ่านง่าย แต่จัดการเรื่องการพกพาและความสอดคล้องได้ยาก
- ฟอร์แมตที่อิง ZIP (wrapped pile-of-files) : เช่น EPUB, ODT, ODP เป็นการบีบอัดชุดไฟล์ด้วย ZIP แม้จะเป็นไฟล์เดียว แต่เมื่อแก้ไขต้องเขียนใหม่ทั้งก้อน
SQLite ในฐานะฟอร์แมตไฟล์แอปพลิเคชันแบบใหม่
- ฐานข้อมูล SQLite สามารถ แทนโครงสร้างแบบชุดไฟล์ได้ แม้ใช้เพียงสคีมา key/value แบบง่าย (
CREATE TABLE files(filename TEXT PRIMARY KEY, content BLOB);)
- เมื่อบีบอัดแล้ว ขนาดต่างจาก ZIP archive ไม่เกิน ±1%
- สามารถแก้ไขเป็นรายไฟล์ได้ จึงไม่จำเป็นต้องเขียนใหม่ทั้งหมด
- SQLite รองรับหลายตาราง หลายฟิลด์ ชนิดข้อมูล ข้อจำกัด และดัชนี จึง แสดงความสัมพันธ์ของข้อมูลที่ซับซ้อนได้อย่างมีประสิทธิภาพ
- มีพลังในการแสดงออกระดับเดียวกับฟอร์แมตแบบกำหนดเอง แต่ สเปกและปริมาณโค้ดกระชับกว่ามาก และ เข้าถึงได้โดยไม่ต้องใช้เครื่องมือเฉพาะทาง
ข้อดีหลักของฟอร์แมต SQLite
-
1. ทำให้การพัฒนาง่ายขึ้น
- เพียงรวมไลบรารี SQLite หรือไฟล์ซอร์สเดี่ยว (
sqlite3.c) ก็มีความสามารถด้าน I/O ของไฟล์ครบถ้วน
- ลดโค้ดได้หลายพันบรรทัดและลดค่าใช้จ่ายในการบำรุงรักษา
- ปัจจุบันมีการใช้งาน ไฟล์ SQLite หลายพันล้านไฟล์ ทั่วโลก และมี ความเสถียรที่ผ่านการทดสอบอย่างเข้มงวด
-
2. โครงสร้างเอกสารแบบไฟล์เดียว
- ข้อมูลทั้งหมดถูกเก็บใน ไฟล์เดียว ทำให้ง่ายต่อการย้าย คัดลอก และแนบส่ง
- สามารถระบุประเภทเอกสารได้ด้วย Application ID ในส่วนหัวของไฟล์
-
3. ภาษาคิวรีระดับสูง
- ใช้ SQL เพื่อ ทำให้ตรรกะการเข้าถึงข้อมูลเรียบง่ายขึ้น โดยนักพัฒนาระบุเพียงว่าต้องการ “อะไร”
- เมื่อเทียบกับไฟล์แบบ key/value ก็มี ทรานแซกชัน, ดัชนี, สคีมา ช่วยลดโอกาสเกิดข้อผิดพลาด
-
4. เนื้อหาที่เข้าถึงได้
- ไฟล์ SQLite เป็น ฟอร์แมตสาธารณะที่มีเอกสารชัดเจน และเข้าถึงได้โดยตรงจากเครื่องมือบรรทัดคำสั่ง
- หอสมุดรัฐสภาสหรัฐฯ แนะนำให้ใช้เป็นฟอร์แมตสำหรับการเก็บรักษาดิจิทัลระยะยาว
- มี ความเข้ากันได้ย้อนหลัง ต่อเนื่องตั้งแต่ปี 2004 จึงรับประกันการเข้าถึงในระยะยาว
-
5. ความเข้ากันได้ข้ามแพลตฟอร์ม
- ใช้งานร่วมกันได้อย่างสมบูรณ์ระหว่าง 32/64 บิต, ความต่างของ endian, และระบบตระกูล Windows/Unix
- ข้อความรองรับการแปลงอัตโนมัติระหว่าง UTF-8 และ UTF-16LE/BE
-
6. ทรานแซกชันแบบอะตอมมิก
- แม้เกิดข้อผิดพลาดของระบบหรือไฟดับ ก็ยัง รับประกันการเขียนข้อมูลอย่างสมบูรณ์โดยไม่ทำให้ข้อมูลเสียหาย
- สามารถจัดกลุ่มการเปลี่ยนแปลงเพื่อ rollback และตรวจสอบความถูกต้องได้ โดย Fossil DVCS ใช้ความสามารถนี้
-
7. การอัปเดตแบบเพิ่มทีละส่วนและต่อเนื่อง
- เขียนลงดิสก์เฉพาะส่วนที่เปลี่ยนแปลง จึง เพิ่มความเร็วและลดการสึกหรอของ SSD
- รองรับ การบันทึกอัตโนมัติและการคงอยู่ของสแตก undo/redo ข้ามเซสชัน
-
8. ขยายได้ง่าย
- เพิ่มความสามารถได้เพียงแค่เพิ่มตารางหรือคอลัมน์ใหม่ โดย ยังคงความเข้ากันได้กับคิวรีเดิม
- ปรับเปลี่ยนโครงสร้างได้ง่ายกว่าฟอร์แมตแบบกำหนดเองมาก
-
9. ประสิทธิภาพ
- อ่าน/เขียนได้เร็วกว่าชุดไฟล์ โดยเฉพาะเมื่อจัดการ BLOB ขนาดไม่เกิน 100KB
- สามารถ ปรับปรุงประสิทธิภาพ ได้เพียงเพิ่มดัชนีหรือรัน
ANALYZE
- ส่วนฟอร์แมตแบบกำหนดเองมักต้องแก้โค้ดเพื่อแก้ปัญหาเดียวกัน
-
10. การเข้าถึงพร้อมกันจากหลายโปรเซส
- SQLite จะ จัดการการเข้าถึงพร้อมกันให้อัตโนมัติ
- หลายโปรเซสสามารถอ่านพร้อมกันได้ และการเขียนจะถูกจัดลำดับทีละรายการ
- ช่วยรับประกันอัตโนมัติว่าฟอร์แมตจะไม่เสียหาย
-
11. รองรับหลายภาษาโปรแกรม
- มี อินเทอร์เฟซสำหรับภาษาส่วนใหญ่ เช่น C, C++, C#, Java, Python, Ruby, JavaScript
- หลายภาษาและหลายทีมสามารถทำงานร่วมกันบนสคีมาร่วมเดียวกันได้
-
12. โครงสร้างแอปพลิเคชันที่ดีกว่า
- สคีมาของ SQLite เองทำหน้าที่เป็น เอกสารที่สมบูรณ์ของฟอร์แมตไฟล์
- ฟอร์แมตแบบกำหนดเองอาจต้องใช้สเปกยาวหลายร้อยหน้า แต่สคีมา SQL นั้นกระชับและชัดเจน
- มีการยกคำพูดของ Fred Brooks, Rob Pike และ Linus Torvalds เพื่อเน้น ความสำคัญของการออกแบบที่ยึดโครงสร้างข้อมูลเป็นศูนย์กลาง
บทสรุป
- SQLite อาจไม่ได้สมบูรณ์แบบสำหรับทุกสถานการณ์ แต่สำหรับ แอปพลิเคชันส่วนใหญ่แล้ว เป็นตัวเลือกที่ดีกว่าฟอร์แมตแบบกำหนดเอง ชุดไฟล์ หรือฟอร์แมต ZIP
- ในฐานะฟอร์แมตไฟล์ระดับสูงที่มีทั้ง ความเสถียร ความสามารถในการขยาย ประสิทธิภาพ การเข้าถึง และความเข้ากันได้
จึง มีคุณค่าพอที่จะพิจารณาเป็นผู้สมัครฟอร์แมตมาตรฐาน สำหรับการออกแบบแอปพลิเคชันยุคถัดไป
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ตอนนั้นกำลังทดลองทำแผนที่ออฟไลน์สำหรับ iPad และการย้ายไฟล์ PNG tile เล็กๆ จำนวนมหาศาล (256px) ผ่าน USB หรือเครือข่ายนั้นยุ่งยากมาก
เลยรวม tile เก็บไว้ใน SQLite ทำให้ย้ายง่ายขึ้นและจัดการ checksum ได้สะดวกขึ้นมาก
tile ถูกทำดัชนีด้วย X, Y, Z (ระดับซูม) จึงจัดการใน relational DB ได้ง่าย และบน iPad ยังสามารถใช้นามสกุลไฟล์กับเมทาดาทาเพื่อติดไอคอนแอปให้ได้ด้วย
แม้จะรู้สึกกังวลกับการออกแบบฟอร์แมตไฟล์เอง แต่เพราะคุ้นเคยกับ DB อยู่แล้ว จึงทำเครื่องมือ CLI ขึ้นมาให้ใช้งานได้ง่ายจากหลายภาษา
มีเครื่องมือมากมายที่อ่านข้อมูล SQLite ได้ และแค่ใช้ CLI ก็จัดการข้อมูลได้สะดวกมาก
มันมีอยู่มานานกว่า 20 ปี และเป็นหนึ่งในซอฟต์แวร์ที่ ผ่านการทดสอบมากที่สุดในโลก
ทั้งเรียบง่าย ทรงพลัง และเชื่อถือได้สูง ดังนั้นในมุมของการเก็บรักษาข้อมูลระยะยาว จึงคิดว่าการใช้ SQLite เป็นฟอร์แมตไฟล์คือทางเลือกที่ดีที่สุด
ในโปรเจกต์ Internet-Places-Database ใช้ HTML UI ซึ่งด้วยคอมโพเนนต์ของ Bootstrap ทำให้ใครก็เข้าถึงได้โดยไม่ต้องติดตั้งอะไรเพิ่ม
ข้อมูลทั้งหมดถูกอ่านและส่งกลับจากไฟล์ SQLite เพียงไฟล์เดียว
DB มีขนาดใหญ่จนการสำรวจค่อนข้างช้า แต่กำลังคิดหาวิธีสำรวจที่ มีประสิทธิภาพ โดยจำกัดขอบเขตการค้นหา
แค่สร้างโครงสร้างพื้นฐานของบล็อกไว้แล้วส่งเป็นไฟล์ให้ครอบครัว พวกเขาก็เพียงเขียนโพสต์และเผยแพร่ได้เลย
รายละเอียดเกี่ยวกับเรื่องนี้สรุปไว้ในบล็อกโพสต์นี้
ถ้าเป็นโครงสร้างแบบต้นไม้ก็อาจเก็บ JSON เป็น blob ได้ แต่แบบนั้นข้อดีก็จะลดลง
แต่ถ้ามีรูปภาพหรือข้อมูลไบนารีรวมอยู่ด้วย SQLite จะได้เปรียบกว่ามาก — จัดการง่ายกว่า ZIP
SQLite รองรับ recursive query ด้วย จึงสามารถแสดงข้อมูลแบบอ้างอิงตัวเองได้อย่างเรียบร้อย
การใส่ JSON blob ลงในฟิลด์ TEXT นั้นง่ายก็จริง แต่จะเสียข้อดีของ SQL อย่าง migration และ indexing ไป
ข้อมูลส่วนใหญ่ภายนอกดูเป็นลำดับชั้น แต่พอตัดดูหลายหน้าตัดก็จะกลายเป็นโครงสร้างแบบ relational
เพียงแต่น่าเสียดายที่ในภาษาโปรแกรมมิง ชนิดข้อมูลแบบ relational ยังถูกแสดงออกมาได้ไม่ดีนัก
SQLite ยังรองรับการ query กับอ็อบเจ็กต์ลักษณะคล้าย JSON ด้วย
เพียงแต่รู้สึกว่า CLI มินิมอล เกินไป เลยน่าจะใช้เครื่องมือที่ดีกว่านี้
แม้แต่การอ้างอิงแบบ recursive ก็ทำได้
โดยใช้ DuckDB รวบรวมไฟล์เอาต์พุตของโมเดลแบบลำดับชั้นให้กลายเป็นไฟล์เดียวที่ query ด้วย SQL ได้ ทำให้ทั้งกระบวนการจัดเก็บและวิเคราะห์ง่ายขึ้น
ถ้าความสำคัญอยู่ที่การเก็บรักษาข้อมูลระยะยาว SQLite ก็น่าจะเหมาะเป็นพิเศษ
เพราะการตั้งค่าถูกเก็บไว้ในตาราง Postgres อยู่แล้ว แค่ย้ายบางส่วนออกมาเป็นไฟล์ SQLite ก็ deploy ได้ง่าย
เป็น ฟอร์แมตไบนารี จึงช่วยลดความเสี่ยงที่จะถูกแก้ไขพลาดโดยไม่ตั้งใจ
และในทางกลับกัน เวลาจะ export ข้อมูล production ออกมาใช้ทดสอบ ก็เข้ารหัสเป็นไฟล์ SQLite ได้ง่ายเช่นกัน
สงสัยมาตลอดว่าคนเราทำไมถึง ขายไอเดียหรือผลิตภัณฑ์ได้เก่งขนาดนี้