SQL 9 — Các hệ quản trị CSDL phổ biến nhất
SQL 9 — Các hệ quản trị CSDL phổ biến nhất
Đến đây bạn đã biết viết câu lệnh SQL khá thành thạo. Nhưng SQL không tồn tại trong chân không — nó luôn chạy bên trong một hệ quản trị cơ sở dữ liệu (Database Management System — DBMS) cụ thể. Mỗi hệ có triết lý thiết kế, điểm mạnh, điểm yếu và cả phương ngữ (dialect) SQL hơi khác nhau.
Bài này là một bản đồ giúp bạn trả lời câu hỏi thực dụng nhất: "Dự án của tôi nên dùng cơ sở dữ liệu nào?" Chúng ta sẽ phân biệt SQL (quan hệ) với NoSQL, đi qua từng hệ phổ biến, so sánh phương ngữ, làm rõ OLTP vs OLAP, và kết bằng một cây quyết định.
SQL (quan hệ) vs NoSQL — sự khác biệt cốt lõi
Trước hết cần hiểu hai trường phái lớn.
Cơ sở dữ liệu quan hệ (Relational / SQL)
Dữ liệu được tổ chức thành bảng (table) gồm hàng và cột, với lược đồ (schema) cố định: bạn phải khai báo trước mỗi cột có kiểu gì. Các bảng liên kết với nhau qua khóa ngoại (foreign key). Ngôn ngữ truy vấn là SQL chuẩn hóa (ANSI SQL), và hầu hết tuân theo nguyên tắc ACID (Atomicity, Consistency, Isolation, Durability) để đảm bảo giao dịch an toàn.
Đặc trưng:
- Schema chặt chẽ → dữ liệu nhất quán, ít lỗi rác.
- Quan hệ rõ ràng → JOIN mạnh mẽ.
- Phù hợp dữ liệu có cấu trúc, quan hệ phức tạp, yêu cầu toàn vẹn cao (tài chính, ERP, đặt hàng).
Cơ sở dữ liệu NoSQL ("Not only SQL")
Là nhóm rộng các hệ không theo mô hình bảng quan hệ truyền thống. Thường có schema linh hoạt, mở rộng theo chiều ngang (scale-out, thêm máy chủ) dễ hơn, và đôi khi chấp nhận nhất quán cuối cùng (eventual consistency) để đổi lấy tốc độ và khả năng chịu tải.
NoSQL không phải "tốt hơn" hay "thay thế" SQL — nó giải quyết những bài toán khác. Trên thực tế, hệ thống lớn thường dùng cả hai (polyglot persistence): PostgreSQL cho dữ liệu giao dịch, Redis cho cache, Elasticsearch cho tìm kiếm.
Định lý CAP — vì sao có sự đánh đổi
Định lý CAP nói rằng một hệ phân tán chỉ có thể đảm bảo tối đa hai trong ba: Consistency (nhất quán), Availability (luôn sẵn sàng), Partition tolerance (chịu được phân vùng mạng). Vì phân vùng mạng là điều không tránh khỏi trong hệ phân tán, lựa chọn thực tế thường là CP hoặc AP. Đây là lý do nhiều hệ NoSQL "nới lỏng" tính nhất quán để đạt khả năng sẵn sàng và mở rộng cao hơn.
Các hệ cơ sở dữ liệu quan hệ phổ biến
PostgreSQL
PostgreSQL (thường gọi "Postgres") là hệ quản trị mã nguồn mở mạnh nhất hiện nay, được mệnh danh là "cơ sở dữ liệu quan hệ-đối tượng tiên tiến nhất thế giới".
Điểm mạnh:
- Tuân thủ chuẩn SQL rất tốt và nhất quán.
- MVCC (Multi-Version Concurrency Control): nhiều giao dịch đọc/ghi đồng thời mà ít khóa lẫn nhau.
- JSONB: lưu và truy vấn JSON nhị phân có chỉ mục — gần như một "NoSQL bên trong SQL".
- Khả năng mở rộng bằng extension: PostGIS (dữ liệu địa lý), pgvector (tìm kiếm vector cho AI), full-text search tích hợp.
- Hỗ trợ kiểu dữ liệu phong phú: mảng (array), range, enum, kiểu tự định nghĩa.
Điểm yếu / lưu ý:
- Cấu hình tinh chỉnh hiệu năng cần kinh nghiệm.
- Mở rộng theo chiều ngang (sharding) không "có sẵn" như một số hệ NoSQL (dù có Citus, partitioning).
Khi nào chọn: mặc định an toàn cho hầu hết ứng dụng web/backend hiện đại; đặc biệt khi cần dữ liệu phức tạp, JSON linh hoạt, hoặc tính năng nâng cao mà vẫn muốn ACID.
-- Tận dụng JSONB của PostgreSQL: lọc theo trường bên trong JSON
SELECT id, data ->> 'name' AS ten
FROM products
WHERE data @> '{"in_stock": true}';
-- (minh hoạ: cần bảng products với cột data kiểu JSONB)
MySQL / MariaDB
MySQL là cơ sở dữ liệu phổ biến nhất cho web, nền tảng của mô hình LAMP (Linux + Apache + MySQL + PHP). MariaDB là bản fork mã nguồn mở của MySQL, được tạo ra sau khi Oracle mua lại MySQL, và phần lớn tương thích.
Điểm mạnh:
- Đơn giản, dễ cài, dễ học, cộng đồng khổng lồ.
- Đọc nhanh, vận hành tốt cho ứng dụng web phổ thông.
- Engine lưu trữ InnoDB hỗ trợ giao dịch ACID và khóa ngoại (engine MyISAM cũ thì không).
- Nhân rộng (replication) trưởng thành.
Điểm yếu / lưu ý:
- Tuân thủ chuẩn SQL kém hơn PostgreSQL ở một số điểm (xử lý kiểu dữ liệu, một số tính năng nâng cao).
- Tính năng phân tích (window function, CTE) đến muộn hơn (có từ MySQL 8.0).
- Hệ sinh thái phân mảnh giữa MySQL (Oracle) và MariaDB.
Khi nào chọn: ứng dụng web truyền thống, WordPress và CMS, dự án cần một RDBMS quen thuộc với chi phí thấp, đội ngũ đã quen LAMP.
Microsoft SQL Server
SQL Server là hệ quản trị thương mại của Microsoft, dùng phương ngữ T-SQL (Transact-SQL). Là lựa chọn tự nhiên trong hệ sinh thái doanh nghiệp Microsoft.
Điểm mạnh:
- Tích hợp chặt với .NET, Windows Server, Azure.
- Bộ công cụ doanh nghiệp đầy đủ: SSMS (quản trị), SSIS (ETL), SSRS (báo cáo), SSAS (phân tích).
- Hiệu năng và tính năng doanh nghiệp tốt (in-memory OLTP, columnstore index).
Điểm yếu / lưu ý:
- Có phí bản quyền (dù có bản Express/Developer miễn phí giới hạn).
- Gắn nhiều vào hệ sinh thái Microsoft (dù nay đã chạy được trên Linux).
Khi nào chọn: doanh nghiệp dùng stack Microsoft/.NET, đã đầu tư vào hạ tầng và nhân sự Windows.
Oracle Database
Oracle là hệ quản trị doanh nghiệp lớn lâu đời nhất, thống trị các hệ thống quan trọng: ngân hàng, viễn thông, chính phủ.
Điểm mạnh:
- Cực kỳ ổn định và giàu tính năng cho khối lượng giao dịch khổng lồ.
- Ngôn ngữ thủ tục PL/SQL mạnh mẽ.
- RAC (Real Application Clusters): nhiều máy chủ truy cập cùng một cơ sở dữ liệu để có tính sẵn sàng cao.
- Công cụ sao lưu, phục hồi, bảo mật, kiểm toán hàng đầu.
Điểm yếu / lưu ý:
- Chi phí bản quyền rất cao và mô hình giấy phép phức tạp.
- Nặng nề, cần đội ngũ DBA chuyên nghiệp (vận hành tốn kém).
Khi nào chọn: hệ thống lõi của tổ chức lớn (core banking, ERP quy mô lớn) nơi độ tin cậy và hỗ trợ thương mại quan trọng hơn chi phí.
SQLite
SQLite không phải máy chủ — nó là một thư viện nhúng. Toàn bộ cơ sở dữ liệu nằm trong một file duy nhất trên đĩa, chạy ngay trong tiến trình ứng dụng, không cần dịch vụ riêng.
Điểm mạnh:
- Không cần cài đặt, không cấu hình, không máy chủ.
- Một file → dễ sao chép, dễ phân phối.
- Cực kỳ phổ biến: gần như mọi điện thoại, trình duyệt, ứng dụng desktop đều nhúng SQLite.
Điểm yếu / lưu ý:
- Không phù hợp ghi đồng thời từ nhiều tiến trình ở quy mô lớn.
- Không có quản lý người dùng / phân quyền mạng.
- Thiếu nhiều kiểu dữ liệu và tính năng của RDBMS lớn.
Khi nào chọn: ứng dụng mobile, ứng dụng desktop, thiết bị edge/IoT, lưu cấu hình, prototype, hoặc làm cơ sở dữ liệu kiểm thử.
Các hệ NoSQL phổ biến
NoSQL chia thành vài họ chính, mỗi họ giải quyết một dạng bài toán:
- MongoDB (document): lưu dữ liệu dưới dạng tài liệu giống JSON (BSON), schema linh hoạt. Tốt cho dữ liệu bán cấu trúc, mô hình hóa nhanh, nội dung thay đổi nhiều.
- Redis (key-value / in-memory): lưu dữ liệu trong RAM, cực nhanh. Dùng làm cache, hàng đợi, đếm thời gian thực, session store.
- Cassandra (wide-column): thiết kế cho ghi cực lớn và mở rộng ngang trên nhiều trung tâm dữ liệu, ưu tiên tính sẵn sàng. Hợp với dữ liệu chuỗi thời gian, log, IoT quy mô khổng lồ.
- Elasticsearch (search engine): lập chỉ mục đảo ngược cho tìm kiếm toàn văn và phân tích log nhanh. Thường dùng cho thanh tìm kiếm, quan sát hệ thống (cùng Logstash/Kibana — bộ ELK).
Lưu ý: ranh giới đang mờ dần. PostgreSQL có JSONB và full-text search; MongoDB nay hỗ trợ giao dịch ACID đa tài liệu. Hãy chọn theo bài toán, không theo nhãn dán.
Bảng so sánh các hệ cơ sở dữ liệu
| Hệ | Loại | Mã nguồn mở? | Thế mạnh chính | Khi nào dùng |
|---|---|---|---|---|
| PostgreSQL | Quan hệ | Có | Chuẩn SQL, JSONB, mở rộng, MVCC | Mặc định cho backend hiện đại; dữ liệu phức tạp |
| MySQL / MariaDB | Quan hệ | Có | Phổ biến web, đơn giản, InnoDB | Ứng dụng web, CMS, stack LAMP |
| SQL Server | Quan hệ | Không (có bản free giới hạn) | T-SQL, tích hợp .NET, công cụ BI | Doanh nghiệp dùng Microsoft/.NET |
| Oracle | Quan hệ | Không | Quy mô lớn, PL/SQL, RAC, độ tin cậy | Hệ thống lõi tổ chức lớn (ngân hàng) |
| SQLite | Quan hệ (nhúng) | Có | Một file, không cần máy chủ | Mobile, desktop, edge, prototype |
| MongoDB | NoSQL document | Có (SSPL) | Schema linh hoạt, JSON | Dữ liệu bán cấu trúc, phát triển nhanh |
| Redis | NoSQL key-value | Có | In-memory, cực nhanh | Cache, session, hàng đợi, real-time |
| Cassandra | NoSQL wide-column | Có | Ghi lớn, scale ngang, sẵn sàng cao | Time-series, log, IoT quy mô lớn |
| Elasticsearch | NoSQL search | Có (một phần) | Tìm kiếm toàn văn, phân tích log | Search, observability, log analytics |
Khác biệt phương ngữ SQL (dialect)
Chuẩn ANSI SQL là cái khung chung, nhưng mỗi hệ có "tiếng địa phương" riêng. Đây là những khác biệt hay gặp nhất khiến câu lệnh không chạy khi chuyển hệ.
Giới hạn số dòng kết quả
-- PostgreSQL / MySQL / SQLite
SELECT * FROM employees ORDER BY salary DESC LIMIT 10; -- (minh hoạ)
-- SQL Server
SELECT TOP 10 * FROM employees ORDER BY salary DESC; -- (minh hoạ)
-- Oracle (cũ) và chuẩn SQL hiện đại
SELECT * FROM employees ORDER BY salary DESC
FETCH FIRST 10 ROWS ONLY; -- (minh hoạ)
Cột tự tăng (auto-increment)
-- PostgreSQL
id SERIAL PRIMARY KEY -- hoặc GENERATED ALWAYS AS IDENTITY (minh hoạ)
-- MySQL / MariaDB
id INT AUTO_INCREMENT PRIMARY KEY -- (minh hoạ)
-- SQL Server
id INT IDENTITY(1,1) PRIMARY KEY -- (minh hoạ)
Bảng so sánh phương ngữ nhanh
| Tác vụ | PostgreSQL | MySQL | SQL Server | Oracle |
|---|---|---|---|---|
| Giới hạn dòng | LIMIT n | LIMIT n | TOP n | FETCH FIRST n ROWS ONLY |
| Tự tăng | SERIAL / IDENTITY | AUTO_INCREMENT | IDENTITY(1,1) | IDENTITY / sequence |
| Nối chuỗi | ` | hoặcconcat()` | concat() | |
| Ngày hiện tại | CURRENT_DATE | CURDATE() | GETDATE() | SYSDATE |
| Kiểu chuỗi | text, varchar | varchar, text | varchar, nvarchar | varchar2 |
| Kiểu boolean | boolean | tinyint(1) | bit | (không có; dùng number(1)) |
| Bảng tạm/dummy | (không cần FROM) | (không cần) | (không cần) | FROM dual |
| Trích chuỗi con | substring() | substring() | substring() | substr() |
Bài học: hãy bám sát chuẩn ANSI khi có thể, và dùng lớp trừu tượng (ORM, query builder) nếu cần độ di động giữa các hệ.
Một truy vấn chuẩn ANSI chạy được trên hầu hết hệ (gồm cả sandbox PostgreSQL):
-- ▶ Chạy được trong SQL Builder
SELECT d.name AS department, COUNT(*) AS so_nhan_vien
FROM employees AS e
JOIN departments AS d ON d.id = e.department_id
GROUP BY d.name
ORDER BY so_nhan_vien DESC;
OLTP vs OLAP và Data Warehouse
Một phân biệt quan trọng khi chọn hệ và thiết kế hệ thống là mục đích sử dụng.
OLTP — Online Transaction Processing
Xử lý giao dịch trực tuyến: nhiều thao tác nhỏ, nhanh, đọc-ghi liên tục (đặt hàng, chuyển khoản, đăng nhập). Đặc trưng:
- Nhiều giao dịch ngắn, đồng thời cao.
- Tối ưu cho ghi và đọc theo dòng (row-oriented).
- Cần ACID chặt chẽ.
- Đại diện: PostgreSQL, MySQL, SQL Server, Oracle.
OLAP — Online Analytical Processing
Xử lý phân tích: truy vấn lớn, quét hàng triệu/tỷ dòng để tổng hợp (báo cáo doanh thu theo quý, phân tích hành vi). Đặc trưng:
- Ít truy vấn nhưng mỗi truy vấn rất nặng.
- Tối ưu cho đọc/tổng hợp theo cột (columnar storage).
- Thường chạy trên data warehouse riêng, tách khỏi cơ sở dữ liệu giao dịch.
Data Warehouse
Là kho dữ liệu phân tích tập trung, gom dữ liệu từ nhiều nguồn qua quá trình ETL/ELT. Các nền tảng đám mây phổ biến:
- Google BigQuery — serverless, tính tiền theo dữ liệu quét.
- Snowflake — tách rời tính toán và lưu trữ, đa đám mây.
- Amazon Redshift — data warehouse trong hệ sinh thái AWS.
Quy tắc thực dụng: đừng chạy báo cáo phân tích nặng trực tiếp trên cơ sở dữ liệu OLTP đang phục vụ người dùng — nó sẽ làm chậm ứng dụng. Hãy sao chép dữ liệu sang warehouse để phân tích.
Cây quyết định: chọn cơ sở dữ liệu nào?
Không có hệ "tốt nhất tuyệt đối" — chỉ có hệ phù hợp với bài toán. Sơ đồ dưới đây là một hướng dẫn khởi điểm.
Gợi ý nhanh:
- Không chắc chọn gì? Bắt đầu với PostgreSQL — nó đủ tốt cho hầu hết trường hợp.
- Cần cache hoặc tốc độ thời gian thực? Thêm Redis bên cạnh, không thay thế.
- Dữ liệu rất linh hoạt, thay đổi schema liên tục? Cân nhắc MongoDB.
- Cần tìm kiếm văn bản mạnh? Thêm Elasticsearch.
- Phân tích báo cáo lớn? Đẩy dữ liệu sang data warehouse.
Tóm tắt
- Cơ sở dữ liệu chia làm hai trường phái lớn: quan hệ (SQL) với schema cố định, JOIN mạnh, ACID; và NoSQL với schema linh hoạt, mở rộng ngang, đôi khi nới lỏng nhất quán (định lý CAP).
- PostgreSQL là lựa chọn mặc định mạnh mẽ và mã nguồn mở; MySQL/MariaDB phổ biến cho web; SQL Server cho hệ sinh thái Microsoft; Oracle cho doanh nghiệp lớn; SQLite cho ứng dụng nhúng một file.
- NoSQL có nhiều họ: MongoDB (document), Redis (key-value/cache), Cassandra (wide-column), Elasticsearch (search) — mỗi loại cho một mục đích khác nhau.
- Phương ngữ SQL khác nhau ở những chi tiết như
LIMITvsTOPvsFETCH,AUTO_INCREMENTvsSERIALvsIDENTITY, và kiểu dữ liệu. - Phân biệt OLTP (giao dịch) và OLAP (phân tích); báo cáo nặng nên chạy trên data warehouse (BigQuery, Snowflake, Redshift), không chạy trên DB giao dịch.
- Hệ thống thực tế thường dùng nhiều cơ sở dữ liệu cùng lúc theo từng nhu cầu.
Tự kiểm tra
- Nêu ít nhất ba khác biệt cốt lõi giữa cơ sở dữ liệu quan hệ và NoSQL.
- Định lý CAP nói gì, và vì sao nhiều hệ NoSQL chọn "nới lỏng" tính nhất quán?
- Bạn cần lưu cấu hình cho một ứng dụng desktop offline, không có máy chủ. Hệ nào phù hợp nhất và vì sao?
- Viết câu lấy 5 dòng đầu cho PostgreSQL, SQL Server và Oracle — chỉ ra phần khác nhau.
- Phân biệt OLTP và OLAP. Vì sao không nên chạy báo cáo phân tích nặng trực tiếp trên cơ sở dữ liệu giao dịch?
- Một ứng dụng cần: lưu đơn hàng (toàn vẹn cao), cache phiên đăng nhập, và tìm kiếm sản phẩm theo từ khóa. Bạn sẽ ghép những hệ nào?
Đọc tiếp
- Quay lại SQL 1 — Giới thiệu cơ sở dữ liệu quan hệ để ôn lại nền tảng mô hình quan hệ.
- Thử ngay các truy vấn chuẩn ANSI (như câu
GROUP BYở trên) trong mục SQL Builder trên cơ sở dữ liệu PostgreSQL sandbox để thấy cách chúng chạy thực tế.
Bài viết liên quan
Khoá, ràng buộc, quan hệ và chuẩn hoá 1NF/2NF/3NF — thiết kế lược đồ đúng từ đầu.
date_trunc/extract/age, cộng trừ khoảng thời gian, hàm chuỗi, ép kiểu CAST, COALESCE/NULLIF và làm tròn.
Cách index hoạt động (B-Tree), đọc EXPLAIN, seq scan vs index scan và mẫu tối ưu truy vấn.
Kiểu JSON/JSONB của PostgreSQL, toán tử truy cập, hàm json, index GIN và khi nào dùng JSON vs cột quan hệ.