1. PostgreSQL và MySQL là gì?

PostgreSQL và MySQL là hai hệ quản trị cơ sở dữ liệu quan hệ (Relational Database Management System – RDBMS), được sử dụng để lưu trữ, truy vấn và quản lý dữ liệu cho các ứng dụng.

Tuy cùng thuộc nhóm relational database, PostgreSQL và MySQL có sự khác biệt về hệ sinh thái, kiểu dữ liệu, cách triển khai một số tính năng, hành vi transaction và các lựa chọn tối ưu hóa.

PostgreSQL thường được chú ý khi ứng dụng cần các tính năng SQL phong phú, kiểu dữ liệu đa dạng, JSONB, truy vấn phức tạp hoặc khả năng mở rộng thông qua extension.

MySQL là lựa chọn phổ biến trong hệ sinh thái web, cung cấp mô hình relational database quen thuộc và hiệu năng tốt cho nhiều workload ứng dụng. Với MySQL, InnoDB là storage engine mặc định trong các phiên bản hiện đại như MySQL 8.4; InnoDB hỗ trợ transaction, foreign key, MVCC và row-level locking.

2. Database, Table, Row và Column

Database là nơi chứa các đối tượng dữ liệu của một ứng dụng hoặc một phần hệ thống. Bên trong database có thể có nhiều table, index, view, constraint và các đối tượng khác.

Table dùng để tổ chức dữ liệu theo hàng và cột. Mỗi table thường đại diện cho một thực thể hoặc một nhóm dữ liệu có cấu trúc xác định, chẳng hạn users, products hoặc orders.

Column mô tả một thuộc tính của dữ liệu. Trong table users, những column thường gặp là id, name, email và created_at.

Row là một bản ghi cụ thể. Ví dụ, một row trong users có thể lưu thông tin của một người dùng.

Một table được thiết kế tốt cần xác định rõ dữ liệu nào thuộc về nó, kiểu dữ liệu của từng column và những điều kiện mà dữ liệu phải tuân theo. Đây là nền tảng để xây dựng các truy vấn chính xác và duy trì tính toàn vẹn của database.

Database không chỉ là nơi lưu dữ liệu. Nó còn là nơi thực thi nhiều quy tắc quan trọng nhằm bảo đảm dữ liệu được lưu trữ nhất quán, kể cả khi nhiều request thao tác cùng lúc.

3. CRUD – Các thao tác dữ liệu cơ bản

CRUD là viết tắt của Create, Read, Update và Delete, gồm bốn thao tác cơ bản trên dữ liệu.

Giả sử có table users với các column id, name và email.

Create – Thêm dữ liệu

INSERT INTO users (name, email)
VALUES ('John', '[email protected]');

Read – Đọc dữ liệu

SELECT id, name, email
FROM users;

SELECT lấy dữ liệu từ table. Trong application thực tế, nên chỉ truy vấn những column cần thiết thay vì lấy tất cả dữ liệu một cách mặc định.

Có thể lọc bằng WHERE:

SELECT id, name, email
FROM users
WHERE id = 1;

Điều kiện WHERE quyết định bản ghi nào được chọn. Nếu thiếu điều kiện trong một câu lệnh cập nhật hoặc xóa, developer có thể vô tình thay đổi nhiều bản ghi hơn dự kiến.

Update – Cập nhật dữ liệu

UPDATE users
SET name = 'John Smith'
WHERE id = 1;

Câu lệnh cập nhật tên user có id = 1. Trong application thật, nên kiểm tra số bản ghi bị thay đổi hoặc xử lý trường hợp resource không tồn tại theo quy ước API.

Delete – Xóa dữ liệu

DELETE FROM users
WHERE id = 1;

Lệnh này xóa bản ghi thỏa điều kiện. Với dữ liệu quan trọng, application cần cân nhắc việc xóa vật lý, soft delete, quan hệ foreign key và khả năng khôi phục.

4. Relationship – Quan hệ giữa các bảng

Trong relational database, dữ liệu thường được phân chia thành nhiều table có liên kết với nhau thay vì lưu mọi thứ trong một table lớn.

One-to-One

Một bản ghi ở table A liên hệ với tối đa một bản ghi ở table B, và ngược lại theo mô hình được thiết kế.

One-to-Many

Một bản ghi ở table cha có thể liên hệ với nhiều bản ghi ở table con.

Ví dụ, một user có nhiều order. Table orders chứa user_id làm foreign key.

SELECT orders.id, orders.total_amount
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.id = 1;

Câu lệnh này lấy các order thuộc về user có ID bằng 1. JOIN kết hợp dữ liệu từ các table theo điều kiện quan hệ.

Many-to-Many

Nhiều bản ghi của table A có thể liên hệ với nhiều bản ghi của table B. Ví dụ, một order có nhiều sản phẩm, và một sản phẩm có thể xuất hiện trong nhiều order.

Mô hình này thường được biểu diễn bằng table trung gian, chẳng hạn order_items, có các khóa tham chiếu đến orders và products. Table trung gian cũng có thể lưu những thuộc tính riêng của quan hệ như số lượng và giá tại thời điểm đặt hàng.

5. Index – Tối ưu tốc độ truy vấn

Index là cấu trúc dữ liệu giúp database tìm bản ghi nhanh hơn mà không phải quét toàn bộ table trong nhiều trường hợp. Khi table có ít row, việc quét toàn bộ có thể vẫn đủ nhanh. Nhưng khi dữ liệu tăng lên, những truy vấn lọc theo cột chưa có index có thể trở nên chậm đáng kể.

Ví dụ, application thường tìm user theo email:

SELECT id, name
FROM users
WHERE email = '[email protected]';

Nếu email được sử dụng thường xuyên và cần duy nhất, một unique index có thể giúp truy vấn phù hợp và đồng thời bảo vệ tính duy nhất của dữ liệu.

CREATE UNIQUE INDEX idx_users_email
ON users(email);

Index hoạt động ra sao?

Index lưu cấu trúc giúp database xác định vị trí những row có khả năng đáp ứng điều kiện truy vấn. Với B-tree index, database có thể tìm kiếm theo các phép so sánh bằng, lớn hơn, nhỏ hơn hoặc khoảng giá trị. Cả PostgreSQL và MySQL đều hỗ trợ các loại index được sử dụng phổ biến cho những truy vấn như vậy.

6. Query Optimization – Tối ưu truy vấn SQL

Một backend chậm không nhất thiết do ngôn ngữ Go, Gin hoặc framework. Nguyên nhân có thể nằm ở truy vấn database, index không phù hợp, lượng dữ liệu trả về lớn hoặc cách application sử dụng connection.

Một kỹ năng quan trọng là đọc query plan để biết database dự định thực hiện truy vấn như thế nào.

Trong PostgreSQL và MySQL, có thể sử dụng EXPLAIN để xem kế hoạch thực thi. Công cụ này giúp quan sát cách optimizer lựa chọn access path, index và những bước join. PostgreSQL cũng cung cấp EXPLAIN ANALYZE để thực thi truy vấn và báo cáo thông tin thời gian cùng số dòng thực tế trong quá trình thực hiện

Ví dụ:

EXPLAIN
SELECT id, name
FROM users
WHERE email = '[email protected]';

Khi đọc query plan, cần chú ý database sử dụng index hay sequential/table scan, ước lượng số row và các phép join. Không phải mọi full scan đều xấu: với table nhỏ hoặc truy vấn trả về phần lớn dữ liệu, scan toàn bộ có thể hợp lý hơn dùng index.

7. Transaction và ACID

Transaction cho phép gom nhiều thao tác database thành một đơn vị logic. Điều này quan trọng khi một nghiệp vụ cần nhiều thay đổi phải cùng thành công hoặc cùng bị hủy.

Ví dụ, chuyển tiền giữa hai tài khoản cần trừ tiền ở tài khoản A và cộng tiền vào tài khoản B. Nếu thao tác trừ tiền thành công nhưng cộng tiền thất bại, dữ liệu sẽ sai nếu hệ thống không xử lý transaction đúng cách.

Transaction thường gồm ba thao tác chính:

  • BEGIN hoặc cú pháp mở transaction tương ứng: bắt đầu transaction.
  • COMMIT: xác nhận các thay đổi.
  • ROLLBACK: hủy các thay đổi chưa được commit trong transaction.

Ví dụ SQL khái quát:

BEGIN;

UPDATE accounts
SET balance = balance - 100
WHERE id = 1;

UPDATE accounts
SET balance = balance + 100
WHERE id = 2;

COMMIT;

Đây chỉ là minh họa luồng thao tác. Trong application thật, cần kiểm tra tài khoản có tồn tại không, số dư có đủ không, xử lý lỗi của từng câu lệnh và rollback khi một bước thất bại. Nếu chỉ thực hiện COMMIT mà không xử lý error đúng cách, application có thể tạo ra trạng thái không mong muốn.

ACID là gì?

ACID là bốn thuộc tính nền tảng của transaction:

Atomicity nghĩa là các thay đổi thuộc cùng transaction được xử lý như một đơn vị: nếu transaction bị rollback, những thay đổi chưa commit của transaction không được giữ lại như một giao dịch thành công.

Consistency nghĩa là transaction phải giữ các quy tắc toàn vẹn được thiết lập cho dữ liệu. Ví dụ, foreign key và những constraint phù hợp giúp ngăn dữ liệu tham chiếu không hợp lệ.

Isolation liên quan đến cách các transaction đồng thời nhìn thấy và tác động lên dữ liệu của nhau. Mức isolation quyết định những hành vi nào được phép xuất hiện khi nhiều transaction chạy cùng lúc.

Durability nghĩa là khi transaction đã commit thành công, database bảo đảm tính bền vững của thay đổi theo các cơ chế lưu trữ và khôi phục đã cấu hình.

8. PostgreSQL và MySQL khác nhau như thế nào?

PostgreSQL được biết đến với hệ thống kiểu dữ liệu phong phú và nhiều loại index. Ngoài B-tree, PostgreSQL có các loại như GIN, GiST, SP-GiST và BRIN, mỗi loại phù hợp với những nhóm truy vấn khác nhau

PostgreSQL thường được lựa chọn khi application cần query phức tạp, thao tác trên JSONB, kiểu dữ liệu chuyên biệt hoặc extension phù hợp với workload.

MySQL cung cấp nhiều kiểu dữ liệu phổ biến cho application web, bao gồm kiểu JSON, full-text index và các cơ chế tối ưu cho InnoDB. Những tính năng này đủ để xây dựng nhiều hệ thống CRUD, thương mại điện tử và backend doanh nghiệp.

Bài viết khác

Database Normalization – 1NF, 2NF, 3NF & Denormalization

1. Database Normalization là gì? Database Normalization (chuẩn hóa dữ liệu) là quá trình tổ chức dữ liệu thành các bảng và quan hệ hợp lý nhằm giảm dư thừa không cần thiết, tránh dữ liệu mâu thuẫn và duy trì tính toàn vẹn của database. Khi thiết kế database, nếu lưu tất cả thông […]

Database Design & Relationships

1. Database Design là gì? Database Design là quá trình thiết kế cách tổ chức, lưu trữ và liên kết dữ liệu trong một hệ thống sao cho dữ liệu có cấu trúc hợp lý, hạn chế trùng lặp không cần thiết, bảo đảm tính toàn vẹn và hỗ trợ các truy vấn mà application […]

Sanity Testing(Kiểm thử sự hợp lý)

Sanity Testing là gì? Trong quá trình phát triển và vận hành một dự án phần mềm, hoạt động lập trình không bao giờ dừng lại ở lần phát hành đầu tiên. Sau khi nhận được phản hồi từ đội ngũ QC hoặc người dùng thực tế, các lập trình viên sẽ liên tục tiến […]

Laravel Routing & Controllers

Laravel Routing và Controllers là gì? 1. Laravel Routing là gì? Laravel Routing (định tuyến trong Laravel) là cơ chế xác định cách ứng dụng tiếp nhận và xử lý HTTP request dựa trên những thông tin như HTTP method và URL. Một route có thể chuyển request đến Controller, thực thi Closure (hàm ẩn […]

Functional Testing (Kiểm thử chức năng)

1.Functional Testing (Kiểm thử chức năng) là gì? Trong bức tranh toàn cảnh của ngành phát triển phần mềm, mục tiêu cuối cùng của mọi ứng dụng công nghệ là giải quyết các bài toán nghiệp vụ cho con người. Dù một hệ thống có kiến trúc mã nguồn siêu việt, giao diện bắt mắt […]

PHP & Laravel Fundamentals

PHP là gì? — Ngôn ngữ lập trình phía máy chủ và vai trò trong phát triển web PHP là gì?   PHP (viết tắt của PHP: Hypertext Preprocessor) là một ngôn ngữ lập trình phía máy chủ, thường được sử dụng để xây dựng website và ứng dụng web động. Trong mô hình phát […]

Leave a Reply

Your email address will not be published. Required fields are marked *