🗄️ Database là gì, SQL là gì
Từ file Excel tới database — và vì sao lập trình web bắt buộc phải đổi
Học xong chương này bạn LÀM được
- Giải thích được database khác file Excel/JSON ở chỗ nào, bằng lời của mình
- Gọi đúng tên: bảng, dòng, cột, khoá chính, kiểu dữ liệu
- Hiểu quan hệ client–server: câu SQL bạn gõ chạy ở đâu
- Viết và đọc hiểu câu SELECT đầu tiên
- Biết vì sao PostgreSQL tìm 1 dòng trong 1 triệu dòng chỉ mất vài mili-giây
Giả sử bạn quản lý một cửa hàng nhỏ. Ban đầu bạn ghi hàng hoá vào một file Excel: mỗi hàng là một sản phẩm, mỗi cột là một thông tin (tên, giá, số lượng còn). Cách này chạy tốt. Cho tới lúc nó không chạy nữa.
Vì sao file Excel không đủ cho một website
Không phải vì Excel dở. Mà vì một website đặt ra bốn yêu cầu mà file thường không đáp ứng nổi:
- 1Nhiều người dùng cùng lúc. Hai khách bấm mua món hàng cuối cùng trong cùng một giây. File Excel mở bằng hai cửa sổ sẽ ghi đè lẫn nhau, một trong hai đơn hàng biến mất không dấu vết.
- 2Tìm nhanh trong lượng dữ liệu lớn. Tìm một email trong 20 dòng thì mắt người còn làm được. Tìm trong 2 triệu dòng, mỗi lần có người mở trang, thì cần một cấu trúc dữ liệu chuyên dụng.
- 3Không được sai nửa chừng. Chuyển tiền là trừ ví A rồi cộng ví B. Nếu mất điện đúng giữa hai bước, tiền bốc hơi. Database có cơ chế bảo đảm "làm cả hai hoặc không làm gì cả".
- 4Ràng buộc phải được canh tự động. Không cho phép hai tài khoản trùng email, không cho phép đơn hàng trỏ tới khách đã bị xoá. Nếu để tầng ứng dụng tự nhớ kiểm tra thì sớm muộn cũng quên một chỗ.
Định nghĩa gọn nhất
Database (cơ sở dữ liệu) là một chương trình chạy nền, giữ dữ liệu của bạn trên đĩa, và trả lời các câu hỏi về dữ liệu đó. Bạn không mở file ra đọc; bạn hỏi nó, và nó trả lời.
Bảng, dòng, cột — ba từ phải nhớ
Tin tốt cho người đến từ Excel: cấu trúc gần như y hệt. Một bảng (table) trông đúng như một sheet:
Bảng products — 4 cột, 5 dòng
| id | name | price | stock |
|---|---|---|---|
| 1 | Bàn phím cơ | 1200000 | 14 |
| 2 | Chuột không dây | 350000 | 0 |
| 3 | Màn hình 27" | 5900000 | 3 |
| 4 | Tai nghe | 890000 | 27 |
| 5 | Webcam | 1450000 | 8 |
Ba từ này sẽ theo bạn suốt khoá học — bảng, dòng, cột. Cộng thêm khoá chính và kiểu dữ liệu.
- Cột (column) — một loại thông tin. Cột có kiểu dữ liệu cố định:
pricechỉ chứa số, không chứa chữ. Đây là khác biệt đầu tiên với Excel, nơi bạn gõ gì vào ô cũng được. - Dòng (row) — một sản phẩm cụ thể. Còn gọi là bản ghi (record).
- Khoá chính (primary key) — cột dùng để chỉ đích danh một dòng, ở đây là
id. Không bao giờ trùng, không bao giờ rỗng.
Đừng dùng tên làm khoá chính
Cám dỗ đầu tiên của người mới là lấy name hoặc email làm khoá chính vì "nó đã là duy nhất rồi". Đừng. Tên đổi được, email đổi được, và mọi bảng khác đang trỏ tới nó sẽ hỏng theo. Khoá chính nên là một con số vô nghĩa, sinh tự động, không bao giờ đổi.
SQL — ngôn ngữ để hỏi
SQL (đọc là "ét-cu-eo" hoặc "xi-cùn") là ngôn ngữ bạn dùng để nói chuyện với database. Nó được thiết kế để đọc gần như tiếng Anh. Câu đầu tiên trong đời bạn sẽ viết là thế này:
SELECT * FROM products;Đọc ngược từ phải sang trái sẽ dễ hiểu hơn: FROM products — lấy từ bảng products; SELECT \* — lấy tất cả các cột (dấu * nghĩa là "mọi cột"); dấu chấm phẩy ; kết thúc câu lệnh.
Thường thì bạn không cần mọi cột. Liệt kê đúng cột cần:
SELECT name, price
FROM products;Thói quen xấu số một: SELECT *
Trong bài tập thì SELECT * tiện. Trong code chạy thật thì nó là nguồn lỗi lâu dài: kéo về cả những cột bạn không dùng (tốn băng thông), và khi ai đó thêm cột mới vào bảng, code của bạn tự nhiên nhận thêm dữ liệu lạ. Hãy liệt kê cột ngay từ đầu.
Hai câu trên chạy Y HỆT trên SQL Server, MySQL, Oracle, SQLite. SQL là một chuẩn (ANSI SQL), và phần lõi — SELECT, FROM, WHERE, JOIN, GROUP BY — giống nhau tới 90% giữa các hệ. Cái khác nhau nằm ở phần rìa: kiểu dữ liệu, hàm xử lý chuỗi, cách phân trang, cách sinh số tự tăng. Chương "SQL Server ↔ Postgres" ở tab riêng liệt kê đủ.
Câu SQL của bạn thực sự chạy ở đâu
Đây là chỗ người mới hay mơ hồ nhất. PostgreSQL là một server — một tiến trình chạy nền, thường nghe ở cổng 5432. Nó giữ dữ liệu, và chờ ai đó gửi câu SQL tới.
Cái gửi câu SQL tới gọi là client. Trong đời một dev web, bạn sẽ gặp ba loại client:
| Client | Là gì | Dùng khi nào |
|---|---|---|
psql | Công cụ dòng lệnh đi kèm PostgreSQL | Gõ nhanh một câu để kiểm tra dữ liệu |
| pgAdmin / DBeaver / TablePlus | Ứng dụng có giao diện | Xem bảng, sửa tay vài dòng, vẽ sơ đồ |
| Backend của bạn (Node.js, Prisma…) | Thư viện trong code | Chạy thật, mỗi khi người dùng mở trang |
Trình duyệt không bao giờ nói chuyện thẳng với database. Luôn có backend đứng giữa — đó cũng là lớp bảo vệ.
Đó là lý do khoá này gắn với Code Lab
Bạn sẽ không phải cài PostgreSQL để bắt đầu. Phần bài tập chạy trên một PostgreSQL thật ngay trong trình duyệt — bạn gõ câu SQL, nó chạy, và báo đúng/sai. Cài máy để sau cũng được.
Vì sao nó nhanh đến vậy
Câu hỏi tự nhiên nảy ra khi hiểu bảng là gì: nếu bảng có 1 triệu dòng, muốn tìm một email cụ thể, chẳng phải database phải đọc hết 1 triệu dòng sao? Đúng — nếu bạn không nói gì thêm. Cách đọc lần lượt từ đầu tới cuối gọi là Sequential Scan (quét tuần tự).
Nhưng nếu bạn tạo một index trên cột đó, câu chuyện đổi hoàn toàn. Index là một cấu trúc RIÊNG nằm cạnh bảng, chỉ chứa cột cần tìm đã sắp xếp, kèm con trỏ về dòng thật:
Index không thay thế bảng. Nó là bản chỉ mục phụ, có cái giá riêng: tốn đĩa và làm chậm mỗi lần ghi.
Bấm chạy thử để đếm số lần đọc của hai cách:
Quét tuần tự vs dùng index
bấm đượcBấm "Chạy tìm kiếm" để xem hai cách tìm cùng một dòng trong 100 dòng dữ liệu.
Bên phải nhảy thẳng tới nơi cần vì index không phải một bản sao được sắp xếp phẳng, mà là một cây B+Tree. Mỗi lần so sánh loại bỏ được phần lớn dữ liệu còn lại. Thử tự tìm một số trong cây dưới đây:
Bên trong một index: cây B+Tree
bấm đượcChọn một số rồi bấm Tìm — cây sẽ tô đường đi từ gốc xuống lá.
Con số khiến việc này đáng kinh ngạc
Mỗi node của cây chiếm đúng một trang 8KB trên đĩa và chứa được vài trăm khoá. Một cây chỉ 3 tầng, mỗi node 500 khoá, đã trỏ được tới 500 × 500 × 500 = 125 triệu dòng. Nghĩa là ba lần đọc đĩa là đủ tìm ra một dòng trong 125 triệu. Chương 9 sẽ mổ kỹ chuyện này — bây giờ chỉ cần biết nó tồn tại.
Bạn chạy SELECT * FROM users WHERE email = 'an@gmail.com' trên bảng 2 triệu dòng CHƯA có index trên cột email. Database làm gì?
Câu nào SAI về khoá chính (primary key)?
Tự làm thử
Sang Code Lab làm 3 bài đầu của module "Getting Started". Bạn sẽ gõ câu SELECT thật trên PostgreSQL thật và thấy kết quả trả về ngay. Xong thì quay lại đây học chương 1.
Giờ làm bài tập trên PostgreSQL thật
Module Getting Started with PostgreSQL · 10 bài
Đọc hiểu chưa đủ — SQL chỉ vào đầu khi tay bạn gõ. Bài tập chạy trên PostgreSQL 16 thật trong trình duyệt, chấm đúng/sai ngay, và có nút quay lại đúng chương này khi làm xong.