Khi tệp thực thi là một cơ sở dữ liệu: Cuộc cách mạng 'Executable truy vấn được'
Bài viết khám phá khái niệm SELF — định dạng tệp thực thi được xây dựng trên nền tảng SQLite, cho phép toàn bộ chương trình, trạng thái và dữ liệu vận hành cùng tồn tại trong một tệp duy nhất. Nhờ đó, mọi thao tác truyền thống như triển khai, ghi log, chỉnh sửa nội dung, thậm chí là deploy phiên bản mới đều trở thành các câu lệnh SQL quen thuộc, mở ra một hướng tiếp cận mới cho việc đóng gói và phân phối phần mềm.

Khi tệp thực thi là một cơ sở dữ liệu: Cuộc cách mạng 'Executable truy vấn được'
Khái niệm biến một tệp thực thi (executable) thành một cơ sở dữ liệu SQLite không chỉ là một ý tưởng kỹ thuật thú vị mà còn mở ra một hướng tiếp cận hoàn toàn mới trong việc đóng gói, triển khai và vận hành phần mềm. Bài viết của tác giả Farid Zakaria giới thiệu dự án SELF — một định dạng nơi chương trình, mã nguồn, nội dung trang web và cả log của khách truy cập đều nằm trong một tệp duy nhất có thể truy vấn bằng SQL, hứa hẹn thay thế nhiều công cụ phức tạp truyền thống.
Chương trình là database, database là chương trình
Ý tưởng ban đầu của dự án SELF khá đơn giản: sử dụng cơ chế binfmt_misc của Linux để biến một tệp SQLite thành một tệp thực thi. Kernel sẽ kích hoạt một trình thông dịch tùy chỉnh, đọc các segment từ bảng dữ liệu và nhảy vào điểm entry như một chương trình ELF thông thường.
Điều gây bất ngờ cho tác giả là sức mạnh của việc mọi thứ "sụp đổ" thành SQL. Nếu file thực thi là một database, thì tại sao chương trình đang chạy không dùng chính file đó để lưu trạng thái? Câu trả lời là có, và điều này loại bỏ nhu cầu về các thư mục /var/, /tmp/, hay /home/ trên hệ thống. Mọi thứ đều nằm trong một tệp duy nhất, và việc cập nhật trạng thái diễn ra một cách giao dịch (transactional) — một khái niệm mà SQLite đã hỗ trợ rất tốt.
self-httpd: Bằng chứng hoạt động sống động
Để minh chứng, tác giả đã xây dựng self-httpd, một máy chủ web bằng chứng. Toàn bộ chương trình, trang web, route và log khách truy cập được lưu trong một tệp SQLite duy nhất:
$ file server
server: SQLite 3.x database, application id 1397050438, ...
$ ./server --journal wal 8080
self-httpd: serving 3 routes out of /srv/self/server
Khi một khách truy cập nhấn nút trên trang, dữ liệu được ghi vào chính tệp database đó:
$ sqlite3 server 'SELECT count(*) FROM presses'
0
$ curl -s -X POST -d press localhost:8080/api/press
{"presses":1,"button":"press"}
$ sqlite3 server 'SELECT id, at, button FROM presses'
1|2026-08-25 03:11:28|press
Máy chủ này đang hoạt động tại https://selfdb.exe.xyz, cho thấy tính khả thi của ý tưởng trong môi trường thực tế.
Mọi thứ đều là SQL: Từ log đến chỉnh sửa trực tiếp
Một trong những điểm mạnh nhất của mô hình này là khả năng tận dụng toàn bộ hệ sinh thái công cụ SQLite. Việc chỉnh sửa một trang web đang chạy không cần khởi động lại, không cần reload, không cần deploy — chỉ là một câu lệnh UPDATE:
$ sqlite3 server "UPDATE routes SET body = readfile('new.html')
WHERE path = '/index.html'"
Việc so sánh hai phiên bản chương trình có thể dùng sqldiff, việc tìm kiếm toàn văn có thể dùng FTS5 — tất cả đều là các tính năng có sẵn của SQLite, mà chương trình "thừa hưởng" miễn phí chỉ vì nó là một database.
Nếu redbean là một 'Actually Portable Executable', thì đây là một 'Actually Queryable Executable'. Một cái chạy được ở mọi nơi, cái còn lại bạn có thể
SELECTtừ nó.
Triển khai chỉ là một câu lệnh scp
Với định dạng này, việc triển khai một phiên bản mới trở nên cực kỳ đơn giản. Thay vì quản lý các gói phức tạp, bạn chỉ cần sao chép một tệp duy nhất, và việc di chuyển dữ liệu từ phiên bản cũ sang mới chỉ là hai câu lệnh INSERT ... SELECT:
ATTACH '/srv/self/server' AS old;
INSERT INTO visits (at, ua, path) SELECT at, ua, path FROM old.visits;
INSERT INTO presses (at, button) SELECT at, button FROM old.presses;
Thay đổi tệp, khởi động lại, và log của khách truy cập vẫn được giữ nguyên vẹn.
Tương lai của phần mềm có thể nằm trong một tệp duy nhất
Dự án SELF vẫn còn ở giai đoạn thăm dò, nhưng tác giả tin rằng việc tái hình dung một định dạng byte đơn thuần thành một cơ sở dữ liệu có thể loại bỏ hàng loạt công cụ phức tạp mà chúng ta đã dùng trong nhiều thập kỷ. Khi chương trình là database và database là chương trình, một loạt vấn đề về đóng gói, đồng bộ, phiên bản và triển khai đều có thể được giải quyết bằng SQL.
"Không bao giờ, không bao giờ đánh giá thấp tầm quan trọng của việc vui chơi." – Randy Pausch
Mã nguồn của dự án có tại fzakaria/selfdb, và cộng đồng kỹ thuật được khuyến khích khám phá thêm những khả năng thú vị của khái niệm "executable truy vấn được" này.