- Tệp cơ sở dữ liệu SQLite là một định dạng dựa trên một tệp duy nhất phù hợp để lưu trữ hoặc trao đổi trạng thái ứng dụng
- Có cấu trúc hơn so với định dạng tùy biến, kiểu nhiều tệp (pile-of-files), định dạng dựa trên ZIP, và có thể được định nghĩa rõ ràng bằng lược đồ SQL
- Đảm bảo khả năng truy cập dữ liệu và độ ổn định nhờ giao dịch, chỉ mục, ngôn ngữ truy vấn cấp cao, đồng thời hỗ trợ cập nhật gia tăng và truy cập đa tiến trình
- Tương thích đa nền tảng, khả năng mở rộng, hiệu năng, giao diện cho nhiều ngôn ngữ giúp nâng cao hiệu quả phát triển và khả năng bảo trì
- Với cấu trúc dữ liệu rõ ràng và thiết kế xoay quanh lược đồ, có thể đạt được chất lượng ứng dụng tốt hơn và khả năng lưu giữ dữ liệu dài hạn
Khái niệm về định dạng tệp ứng dụng
- Định dạng tệp ứng dụng là cấu trúc tệp dùng để lưu trạng thái chương trình xuống đĩa hoặc trao đổi thông tin giữa các chương trình
- Ví dụ: DOC, DWG, PDF, XLS, GIT, EPUB, ODT, PPT, ODP, v.v.
- Định dạng tệp (file format) lưu một đối tượng đơn lẻ (ví dụ: JPEG, GIF, XHTML), còn định dạng ứng dụng (application format) lưu nhiều đối tượng cùng với mối quan hệ giữa chúng
- Phần lớn định dạng ứng dụng được chia thành ba loại
- Định dạng tùy biến: như DOC, DWG, PDF, là cấu trúc nhị phân dành riêng cho một ứng dụng cụ thể, không thể truy cập bằng công cụ bên ngoài
- Kiểu nhiều tệp (pile-of-files): như Git, là cấu trúc gồm nhiều tệp; một số dễ đọc nhưng khó di chuyển và khó quản lý tính nhất quán
- Định dạng dựa trên ZIP (wrapped pile-of-files): như EPUB, ODT, ODP, là kiểu nhiều tệp được nén bằng ZIP; tuy là một tệp duy nhất nhưng khi sửa đổi thì cần ghi lại toàn bộ
SQLite như một định dạng tệp ứng dụng mới
- Cơ sở dữ liệu SQLite có thể thay thế cấu trúc kiểu nhiều tệp chỉ với một lược đồ khóa/giá trị đơn giản (
CREATE TABLE files(filename TEXT PRIMARY KEY, content BLOB);)
- Khi nén, chênh lệch kích thước nằm trong khoảng ±1% so với kho lưu trữ ZIP
- Có thể sửa ở cấp độ từng tệp riêng lẻ nên không cần ghi lại toàn bộ
- SQLite có thể chứa nhiều bảng, trường, kiểu dữ liệu, ràng buộc và chỉ mục, nên có thể biểu diễn hiệu quả các quan hệ dữ liệu phức tạp
- Vừa có sức biểu đạt ở mức định dạng tùy biến, vừa gọn hơn rất nhiều về đặc tả và lượng mã, đồng thời có thể truy cập mà không cần công cụ chuyên dụng
Những ưu điểm chính của định dạng SQLite
-
1. Đơn giản hóa phát triển
- Chỉ cần đưa vào thư viện SQLite hoặc một tệp mã nguồn duy nhất (
sqlite3.c) là có đầy đủ chức năng nhập/xuất tệp
- Giảm hàng nghìn dòng mã và giảm chi phí bảo trì
- Trên toàn thế giới hiện có hàng chục tỷ tệp SQLite đang được sử dụng, với độ ổn định đã được kiểm chứng rất kỹ lưỡng
-
2. Cấu trúc tài liệu một tệp duy nhất
- Mọi dữ liệu được lưu trong một tệp duy nhất, thuận tiện cho việc di chuyển, sao chép và đính kèm
- Có thể nhận diện loại tài liệu bằng Application ID trong phần đầu tệp
-
3. Ngôn ngữ truy vấn cấp cao
- Thông qua SQL, có thể đơn giản hóa logic truy cập dữ liệu, và lập trình viên chỉ cần định nghĩa muốn lấy “cái gì”
- So với tệp dựa trên khóa/giá trị, việc hỗ trợ giao dịch, chỉ mục, lược đồ giúp giảm khả năng phát sinh lỗi
-
4. Nội dung dễ truy cập
- Tệp SQLite là định dạng công khai có tài liệu rõ ràng, có thể truy cập trực tiếp bằng công cụ dòng lệnh
- Thư viện Quốc hội Hoa Kỳ khuyến nghị nó làm định dạng lưu trữ số dài hạn
- Nhờ duy trì tương thích ngược từ năm 2004, khả năng truy cập dài hạn được đảm bảo
-
5. Tương thích đa nền tảng
- Tương thích hoàn toàn giữa 32/64-bit, khác biệt endian, và giữa các hệ Windows/Unix
- Văn bản hỗ trợ tự động chuyển đổi giữa UTF-8, UTF-16LE/BE
-
6. Giao dịch nguyên tử
- Ngay cả khi lỗi hệ thống hoặc mất điện, vẫn đảm bảo ghi hoàn chỉnh mà không làm hỏng dữ liệu
- Có thể nhóm các thay đổi để rollback và kiểm chứng, Fossil DVCS tận dụng tính năng này
-
7. Cập nhật gia tăng và liên tục
- Chỉ ghi phần đã thay đổi xuống đĩa, giúp tăng tốc và giảm hao mòn SSD
- Có thể tự động lưu và duy trì ngăn xếp undo/redo giữa các phiên
-
8. Khả năng mở rộng dễ dàng
- Có thể mở rộng chức năng chỉ bằng cách thêm bảng hoặc cột mới, đồng thời giữ tương thích với các truy vấn hiện có
- Việc thay đổi cấu trúc dễ hơn nhiều so với định dạng tùy biến
-
9. Hiệu năng
- Có thể đọc/ghi nhanh hơn kiểu nhiều tệp, đặc biệt vượt trội khi xử lý BLOB dưới 100KB
- Chỉ cần thêm chỉ mục hoặc chạy
ANALYZE là có thể cải thiện hiệu năng
- Với định dạng tùy biến, muốn giải quyết cùng vấn đề thì phải sửa mã
-
10. Truy cập đồng thời từ nhiều tiến trình
- SQLite tự động điều phối truy cập đồng thời
- Nhiều tiến trình có thể đọc cùng lúc, còn ghi sẽ được xử lý tuần tự
- Tự động đảm bảo tránh hỏng định dạng
-
11. Hỗ trợ nhiều ngôn ngữ lập trình
- Cung cấp giao diện cho hầu hết các ngôn ngữ như C, C++, C#, Java, Python, Ruby, JavaScript
- Nhiều ngôn ngữ và nhiều nhóm có thể cộng tác trên cùng một lược đồ chung
-
12. Kiến trúc ứng dụng tốt hơn
- Bản thân lược đồ SQLite đóng vai trò như tài liệu hoàn chỉnh cho định dạng tệp
- Định dạng tùy biến cần đặc tả hàng trăm trang, còn lược đồ SQL thì ngắn gọn và rõ ràng
- Qua các trích dẫn của Fred Brooks, Rob Pike, Linus Torvalds, bài viết nhấn mạnh tầm quan trọng của thiết kế xoay quanh cấu trúc dữ liệu
Kết luận
- SQLite không hoàn hảo cho mọi tình huống, nhưng trong phần lớn ứng dụng, đây là lựa chọn tốt hơn định dạng tùy biến, kiểu nhiều tệp hay ZIP
- Là một định dạng tệp cấp cao hội tụ độ ổn định, khả năng mở rộng, hiệu năng, khả năng truy cập và tính tương thích,
nên đáng được cân nhắc như một ứng viên định dạng tệp tiêu chuẩn khi thiết kế thế hệ ứng dụng tiếp theo
1 bình luận
Ý kiến trên Hacker News
Khi đó họ đang nghiên cứu bản đồ ngoại tuyến cho iPad, và việc chuyển vô số tile PNG nhỏ (256px) qua USB hoặc mạng quá bất tiện
Vì vậy họ gói các tile vào SQLite để lưu trữ, nhờ đó việc di chuyển dễ hơn và quản lý checksum cũng đơn giản hơn
Các tile được lập chỉ mục theo X, Y, Z (mức zoom) nên rất dễ xử lý trong cơ sở dữ liệu quan hệ, và trên iPad còn có thể gắn cả biểu tượng ứng dụng bằng phần mở rộng tệp và metadata
Họ từng e ngại việc tự thiết kế định dạng tệp, nhưng vì đã quen với DB nên có thể tạo công cụ CLI để xử lý dễ dàng từ nhiều ngôn ngữ
Rất nhiều công cụ có thể đọc dữ liệu SQLite, và chỉ với CLI thôi cũng đã cực kỳ tiện cho việc thao tác dữ liệu
Nó đã tồn tại hơn 20 năm và là một trong những phần mềm được kiểm thử nhiều nhất trên thế giới
Đơn giản nhưng mạnh mẽ và có độ tin cậy cao, nên xét về khía cạnh lưu trữ dữ liệu dài hạn, tôi nghĩ dùng SQLite làm định dạng tệp là lựa chọn tốt nhất
Trong dự án Internet-Places-Database, tôi dùng HTML UI, và nhờ các thành phần bootstrap mà bất kỳ ai cũng có thể truy cập mà không cần cài đặt riêng
Mọi dữ liệu đều được đọc và trả về từ một tệp SQLite duy nhất
DB khá lớn nên việc duyệt hơi chậm, nhưng tôi đang nghĩ cách duyệt hiệu quả để giới hạn phạm vi tìm kiếm
Tôi tạo sẵn cấu trúc cơ bản của blog rồi gửi dưới dạng tệp cho gia đình, và họ chỉ cần viết bài và xuất bản
Nội dung liên quan được tổng hợp trong bài blog này
Nếu là cấu trúc cây thì cũng có thể lưu JSON dưới dạng blob, nhưng khi đó lợi ích sẽ giảm đi
Tuy vậy, nếu có cả ảnh hoặc dữ liệu nhị phân đi kèm thì SQLite có lợi thế lớn hơn nhiều — dễ xử lý hơn ZIP
SQLite còn hỗ trợ truy vấn đệ quy, nên ngay cả dữ liệu tự tham chiếu cũng có thể được biểu diễn gọn gàng
Việc đưa JSON blob vào trường TEXT thì đơn giản, nhưng sẽ làm mất các ưu điểm của SQL như migration và indexing
Phần lớn dữ liệu nhìn bề ngoài có tính phân cấp, nhưng nếu cắt nó theo nhiều lát khác nhau thì sẽ thành cấu trúc quan hệ
Chỉ tiếc là trong ngôn ngữ lập trình, kiểu dữ liệu quan hệ lại không được biểu đạt tốt
SQLite cũng hỗ trợ truy vấn trên các đối tượng kiểu JSON
Tuy vậy, CLI của nó quá tối giản, nên tôi cảm thấy lẽ ra nên dùng một công cụ tốt hơn
Thậm chí tham chiếu đệ quy cũng khả thi
Dùng DuckDB, tôi gom các tệp đầu ra của mô hình phân cấp thành một tệp duy nhất có thể truy vấn bằng SQL, nhờ đó pipeline lưu trữ và phân tích trở nên đơn giản hơn
Khi việc lưu trữ dữ liệu dài hạn là quan trọng, SQLite có lẽ đặc biệt lý tưởng
Vì cấu hình vốn đã được lưu trong các bảng Postgres, nên chỉ cần chuyển một phần cấu hình sang tệp SQLite là có thể triển khai đơn giản
Đây là định dạng nhị phân nên cũng giảm nguy cơ bị sửa nhầm
Ngược lại, khi xuất dữ liệu production sang phục vụ kiểm thử, cũng có thể mã hóa dễ dàng thành tệp SQLite
Tôi luôn tự hỏi làm sao mọi người có thể bán ý tưởng hay sản phẩm giỏi đến vậy