Featured image of post Đừng Dùng PostgreSQL Cho Mọi Thứ! Kiến Trúc Nhúng Và Ưu Điểm Không Cần Cấu Hình Của SQLite Là Gì? Giới Hạn Của SQLite Nằm Ở Đâu? Khi Nào Nên Chọn SQLite, Khi Nào Chọn PostgreSQL?

Đừng Dùng PostgreSQL Cho Mọi Thứ! Kiến Trúc Nhúng Và Ưu Điểm Không Cần Cấu Hình Của SQLite Là Gì? Giới Hạn Của SQLite Nằm Ở Đâu? Khi Nào Nên Chọn SQLite, Khi Nào Chọn PostgreSQL?

SQLite là công cụ cơ sở dữ liệu nhúng được triển khai rộng rãi nhất thế giới, với đặc trưng là một tệp duy nhất, không cần cấu hình và không cần cài đặt máy chủ. Tìm hiểu sự khác biệt về kiến trúc cốt lõi giữa SQLite và PostgreSQL, các kịch bản sử dụng tương ứng và các giới hạn của SQLite (khóa ghi đồng thời, không có khả năng liên máy chủ, thiếu quản lý quyền hạn).

Bạn đã bao giờ nghĩ về thực tế là trình duyệt bạn mở hàng ngày, phần mềm liên lạc trên điện thoại, và thậm chí cả công cụ ghi chú trên máy tính để bàn của bạn đều ẩn chứa cùng một cơ sở dữ liệu nhẹ này không?

Nó không yêu cầu bạn cài đặt bất kỳ phần mềm máy chủ nào, không yêu cầu thiết lập tài khoản hoặc mật khẩu, và thậm chí không cần kết nối internet. Nó chỉ đơn giản là một tệp, nằm lặng lẽ trên ổ cứng của bạn, sẵn sàng phục vụ bạn bất cứ lúc nào.

Sự tồn tại thầm lặng này chính là SQLite.

SQLite là gì? Cơ sở dữ liệu được triển khai rộng rãi nhất thế giới

SQLite là một công cụ cơ sở dữ liệu quan hệ nhúng được viết bằng C.

không có quy trình máy chủ độc lập, mà được nhúng trực tiếp vào ứng dụng của bạn để chạy.

Điều này hoàn toàn khác với PostgreSQL hoặc MySQL mà bạn đã quen thuộc. Các cơ sở dữ liệu truyền thống là các máy chủ độc lập chạy riêng biệt, và chương trình của bạn phải “giao tiếp” với chúng qua một giao thức mạng (TCP/IP).

But SQLite thì khác; nó chỉ đơn giản là một khối mã, chạy trực tiếp bên trong ứng dụng của bạn, đọc và viết tệp .db đó trên ổ cứng của bạn.

Kích thước so sánh SQLite (Nhúng) PostgreSQL (Client-Server)
Chế độ hoạt động Nhúng trực tiếp trong ứng dụng, không máy chủ độc lập Quy trình máy chủ độc lập, qua kết nối mạng
Cấu hình Không cần cấu hình, không cài đặt, không thông tin đăng nhập Yêu cầu cài đặt, thiết lập tài khoản/mật khẩu & tường lửa
Lưu trữ dữ liệu Tệp đa nền tảng duy nhất Nhiều tệp dưới thư mục máy chủ
Phương pháp sao lưu Sao chép trực tiếp tệp đó Yêu cầu các công cụ chuyên dụng như pg_dump

Chính vì đặc tính “cắm và chạy” này mà SQLite đã trở thành công cụ cơ sở dữ liệu được triển khai rộng rãi nhất thế giới.

Từ các hệ điều hành Android và iOS, trình duyệt Chrome và Firefox, đến Adobe Lightroom, WhatsApp, và thậm chí cả hệ thống bay của Airbus A350, nó có mặt ở khắp mọi nơi.

Sử dụng SQLite trong Node.js

Nếu bạn là một nhà phát triển Node.js, việc sử dụng SQLite cực kỳ đơn giản. Bạn không cần cài đặt bất kỳ phần mềm máy chủ cơ sở dữ liệu nào trên máy tính của mình, bạn chỉ cần cài đặt một gói npm để bắt đầu.

Các lựa chọn được sử dụng phổ biến nhất trong ngành hiện nay:

Tên gói Đặc điểm Kịch bản đề xuất
sqlite3 Lâu đời nhất, hỗ trợ các API không đồng bộ Khi cần xử lý nhiều tác vụ không đồng bộ đồng thời
better-sqlite3 Hiệu suất tuyệt vời, thiết kế API trực quan, cực kỳ nhanh Khuyến nghị hàng đầu, vì hiệu quả phát triển và tốc độ thực thi

Tạo cơ sở dữ liệu và truy vấn với better-sqlite3 mất chưa đầy năm phút:

const Database = require('better-sqlite3');
const db = new Database('my_project.db');

db.prepare('CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)').run();

const insert = db.prepare('INSERT INTO users (name, age) VALUES (?, ?)');
insert.run('John', 25);

const user = db.prepare('SELECT * FROM users WHERE name = ?').get('John');
console.log(user); // { name: 'John', age: 25 }

Nếu tệp không tồn tại, better-sqlite3 sẽ tự động tạo nó cho bạn.

SQLite hỗ trợ cú pháp SQL mạnh mẽ hơn bạn nghĩ

Nhiều người nghĩ SQLite rất cơ bản, nhưng nó hỗ trợ phần lớn cú pháp SQL tiêu chuẩn, bao gồm nhiều tính năng nâng cao:

Danh mục cú pháp Các mục được hỗ trợ
Thao tác cơ bản SELECT, INSERT, UPDATE, DELETE
Định nghĩa dữ liệu CREATE TABLE, CREATE INDEX, CREATE VIEW
Truy vấn nâng cao WITH (CTE đệ quy), Các hàm cửa sổ (Window Functions)
Xử lý xung đột UPSERT (INSERT ... ON CONFLICT DO UPDATE)
Xử lý JSON Các hàm tích hợp như json_extract, json_array, json_object, v.v.
Kiểm soát giao dịch BEGIN, COMMIT, ROLLBACK, SAVEPOINT
Truy vấn kết hợp INNER JOIN, LEFT JOIN, RIGHT JOIN, và FULL OUTER JOIN

SQLite của triết lý cốt lõi của “nhỏ và đẹp”, hỗ trợ hầu hết các khả năng SQL bạn cần hàng ngày trong khi vẫn cực kỳ nhẹ.

Giới hạn của SQLite nằm ở đâu?

Sự gọn nhẹ luôn có giá của nó. Nếu so sánh SQLite với một cửa hàng tạp hóa hipster chỉ có một quầy thanh toán, thì PostgreSQL là một Costco được trang bị 50 quầy thu ngân.

1. Tắc nghẽn ghi dữ liệu

Khi SQLite ghi dữ liệu, nó sẽ khóa toàn bộ tệp cơ sở dữ liệu.

Hãy tưởng tượng một nhà hàng chỉ có một nhà vệ sinh: 100 người có thể nhìn vào thực đơn bên ngoài (đọc) cùng một lúc, nhưng chỉ cần 1 người đi vào và khóa cửa (ghi), tất cả những người khác chỉ có thể xếp hàng và chờ đợi.

Mặc dù việc bật chế độ WAL (Write-Ahead Logging) có thể cải thiện hiệu suất đọc/ghi đồng thời, nhưng về cơ bản nó vẫn không thể đạt được việc ghi đồng thời nhiều luồng vào các hàng dữ liệu khác nhau.

2. Không thể mở rộng trên nhiều máy chủ

Bản chất của SQLite là một tệp vật lý. Nếu hệ thống của bạn được triển khai trên nhiều máy chủ (mở rộng theo chiều ngang), các máy chủ này không thể chia sẻ cùng một tệp một cách an toàn.

3. Thiếu quản lý quyền hạn chi tiết

SQLite không có khái niệm về “tài khoản người dùng”. Bất kỳ ai có thể đọc tệp .db đó ở cấp hệ điều hành đều có thể xem và sửa đổi tất cả dữ liệu.

Đối với các hệ thống kinh doanh yêu cầu kiểm toán dữ liệu cá nhân nghiêm ngặt, điều này là không thể chấp nhận được.

SQLite vs. PostgreSQL: Quyết định lựa chọn công nghệ

Công cụ không có tốt hay xấu, chỉ có phù hợp hay không. Dưới đây là một bảng kiểm tra tối thượng giúp bạn đưa ra quyết định:

Câu hỏi Câu trả lời “Có” → Chọn SQLite Câu trả lời “Không” → Chọn PostgreSQL
Chỉ có một máy chủ backend, hoặc chạy hoàn toàn trên máy cục bộ? Không (yêu cầu mở rộng theo chiều ngang, nhiều máy)
Hành vi hệ thống chủ yếu là đọc, không có ghi đồng thời tần suất cao? Không (người dùng sẽ cạnh tranh để ghi đồng thời)
Không cần quyền tài khoản cơ sở dữ liệu chi tiết hoặc chỉ mục nâng cao? Không (phụ thuộc nhiều vào các tính năng nâng cao)

So sánh các kịch bản cụ thể hơn:

Kịch bản Lựa chọn đề xuất Lý do
Phần mềm máy tính để bàn, Ứng dụng di động, Thiết bị IoT SQLite Dữ liệu đi cùng thiết bị, không cần cài đặt
Blog cá nhân, Trang web giới thiệu SQLite Đọc nhiều ghi ít, tiết kiệm chi phí bảo trì máy chủ
Phát triển nguyên mẫu nhanh, Demo SQLite Chỉ cần tạo một tệp để bắt đầu
Diễn đàn cộng đồng, Nền tảng thương mại điện tử PostgreSQL Ghi đồng thời cao, yêu cầu khóa cấp hàng
Triển khai phân tán trên nhiều máy chủ PostgreSQL Cần chia sẻ nguồn dữ liệu giữa các máy khác nhau
Hệ thống nhạy cảm như Y tế, Tài chính PostgreSQL Yêu cầu kiểm soát quyền dựa trên vai trò nghiêm ngặt

Cơ sở dữ liệu của bạn là một sổ tay bỏ túi hay một tổng đài trung tâm?

Nếu dữ liệu là “máy đơn, tĩnh, một người sở hữu”, hãy chọn SQLite để tận hưởng sự gọn nhẹ và tự do tối đa;

Nếu dữ liệu là “đám mây, động, tính tương tác cao”, hãy để PostgreSQL tiếp quản.

Triết lý cốt lõi của SQLite“một thành phần nội bộ của ứng dụng”, trong khi PostgreSQL được định vị là “một trung tâm độc lập của kiến trúc hệ thống”.

Lần tới khi bạn đưa ra quyết định kiến trúc, đừng vội vàng đưa ra PostgreSQL. Hãy tự hỏi bản thân trước:

“Cơ sở dữ liệu của tôi là một sổ tay bỏ túi, hay một tổng đài trung tâm?”

Khi câu trả lời đã rõ ràng, sự lựa chọn tự nhiên sẽ trở nên hiển nhiên.

Reference

All rights reserved,未經允許不得隨意轉載
Built with Hugo
Theme Stack thiết kế bởi Jimmy