- Sản phẩm & Dịch vụSản phẩm & Dịch vụ
- Giải phápGiải pháp
- Bảng giáBảng giá
- Công tyCông ty
- Tài liệuTài liệu
vi
vi
Chuyên mục với các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.
Technical Writer
I have over 5 years of experience writing technical documentation for tech products, making them accessible and user-friendly. My focus is always on providing clear and precise information. @#@ Tôi đã có hơn 5 năm kinh nghiệm viết tài liệu kỹ thuật cho các sản phẩm công nghệ, giúp người dùng dễ dàng tiếp cận và sử dụng. Tôi luôn tập trung vào việc cung cấp thông tin chính xác và dễ hiểu.
Thảo luận (0)
Đăng nhập để thảo luận
Mô hình dữ liệu quan hệ (relational data) tổ chức dữ liệu thành các bảng gồm hàng và cột. Đây là mô hình phổ biến nhất trong các công cụ quản lý cơ sở dữ liệu. Ngày nay, mặc dù có nhiều mô hình dữ liệu khác như NoSQL và NewSQL, nhưng các hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) vẫn giữ vị trí thống trị trong việc lưu trữ và quản lý dữ liệu trên toàn thế giới.

Bài viết này sẽ so sánh ba RDBMS mã nguồn mở được sử dụng rộng rãi nhất: SQLite, MySQL và PostgreSQL. Cụ thể, chúng ta sẽ đi sâu vào các kiểu dữ liệu mà mỗi RDBMS sử dụng, ưu và nhược điểm của chúng, và các trường hợp sử dụng tối ưu nhất.
Cơ sở dữ liệu (database) là các cụm thông tin hay dữ liệu được mô hình hóa một cách logic. Trong khi đó, một hệ quản trị cơ sở dữ liệu (DBMS) là một phần mềm dùng để tương tác với cơ sở dữ liệu đó. DBMS cho phép bạn kiểm soát quyền truy cập cơ sở dữ liệu, ghi dữ liệu, chạy các câu truy vấn (query), và thực hiện bất kỳ tác vụ nào khác liên quan đến quản trị cơ sở dữ liệu.
Mặc dù các hệ quản trị cơ sở dữ liệu thường được gọi tắt là “cơ sở dữ liệu”, hai thuật ngữ này không thể thay thế cho nhau. Một cơ sở dữ liệu có thể là bất kỳ tập hợp dữ liệu nào, không chỉ là dữ liệu được lưu trữ trên máy tính. Ngược lại, khái niệm DBMS chỉ cụ thể đến phần mềm cho phép bạn tương tác với một cơ sở dữ liệu. Mọi hệ quản trị cơ sở dữ liệu đều có một mô hình dữ liệu xác định cách thức dữ liệu được lưu trữ và truy xuất. Một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) là một DBMS sử dụng mô hình dữ liệu quan hệ. Trong mô hình này, dữ liệu được tổ chức thành các bảng. Các bảng trong RDBMS còn được gọi chính xác hơn là quan hệ (relation). Mỗi quan hệ là một tập hợp các bộ (tuple), tương đương với các dòng trong bảng, trong đó mỗi bộ chia sẻ cùng một tập thuộc tính (attribute), tương ứng với các cột trong bảng.

Hầu hết các cơ sở dữ liệu quan hệ sử dụng ngôn ngữ truy vấn có cấu trúc (SQL) để quản lý và truy vấn dữ liệu. Tuy nhiên, nhiều RDBMS sử dụng phương ngữ SQL riêng. Chúng có thể có những giới hạn hoặc phần mở rộng nhất định. Các phần mở rộng này thường bao gồm các tính năng bổ sung cho phép người dùng thực hiện các thao tác phức tạp hơn so với những gì họ có thể làm với SQL tiêu chuẩn.
Lưu ý rằng thuật ngữ SQL tiêu chuẩn sẽ xuất hiện nhiều lần trong suốt bài viết này. Các tiêu chuẩn SQL do Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI), Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) và Ủy ban Kỹ thuật Điện Quốc tế (IEC) cùng nhau lập ra và duy trì. Mỗi khi chúng ta đề cập đến SQL tiêu chuẩn, ta đang nói về phiên bản hiện tại của tiêu chuẩn SQL do các tổ chức này công bố.
Cần lưu ý rằng bộ tiêu chuẩn SQL đầy đủ rất lớn và phức tạp. Ví dụ, để tuân thủ hoàn toàn bộ SQL:2011 cơ bản cần đến 179 tính năng. Vì lý do này, hầu hết các RDBMS không hỗ trợ toàn bộ tiêu chuẩn, mặc dù một số chúng tuân thủ hoàn nhiều hơn và tương đối đầy đủ hơn những hệ thống khác.
Mỗi cột được gán một kiểu dữ liệu (data type). Nó quy định loại dữ liệu nào được phép nhập vào cột đó. Các RDBMS khác nhau triển khai các kiểu dữ liệu khác nhau và chúng không phải lúc nào cũng có thể hoán đổi trực tiếp cho nhau. Một số kiểu dữ liệu phổ biến bao gồm date, string, integer, và Boolean.
Lưu trữ số nguyên trong cơ sở dữ liệu không chỉ đơn giản là đặt các con số vào một bảng. Các kiểu dữ liệu số có thể là có dấu (signed), nghĩa là chúng có thể biểu diễn cả số dương và số âm, hoặc không dấu (unsigned), nghĩa là chúng chỉ có thể biểu diễn số dương.
Ví dụ, kiểu tinyint của MySQL có thể chứa 8 bit dữ liệu, tương đương với 256 giá trị khả dĩ. Phạm vi có dấu của kiểu dữ liệu này là từ -128 đến 127, trong khi phạm vi không dấu là từ 0 đến 255.
Việc kiểm soát dữ liệu nào được phép nhập vào cơ sở dữ liệu có tính chất rất quan trọng. Đôi khi, quản trị viên sẽ áp đặt một ràng buộc (constraint) trên một bảng để giới hạn các giá trị có thể được nhập vào. Một ràng buộc thường áp dụng cho một cột cụ thể, nhưng một số cũng có thể áp dụng cho toàn bộ bảng.
Dưới đây là một số ràng buộc thường được sử dụng trong SQL:
UNIQUE: Dùng ràng buộc này cho một cột đảm bảo rằng không có hai mục nào trong cột đó giống hệt nhau.NOT NULL: Ràng buộc này đảm bảo rằng một cột không có bất kỳ mục NULL nào.PRIMARY KEY: Là sự kết hợp của UNIQUE và NOT NULL. Ràng buộc này đảm bảo rằng không có mục nào trong cột là NULL và mọi mục đều là độc nhất.FOREIGN KEY: Một FOREIGN KEY là một cột trong một bảng dùng để tham chiếu đến PRIMARY KEY của một bảng khác. Ràng buộc này được sử dụng để liên kết hai bảng lại với nhau. Các mục nhập vào cột FOREIGN KEY phải đã tồn tại trong cột PRIMARY KEY cha thì quá trình ghi mới thành công.CHECK: Ràng buộc này giới hạn phạm vi các giá trị có thể được nhập vào một cột. Ví dụ, nếu ứng dụng của bạn chỉ dành cho cư dân Alaska, bạn có thể thêm một ràng buộc CHECK trên cột mã ZIP để chỉ cho phép các mục nhập trong khoảng từ 99501 đến 99950.Sau khi đã nắm chung về các RDBMS, ta sẽ bắt đầu tìm hiểu sâu hơn về một RDBMS mã nguồn mở cụ thể: SQLite.
SQLite là một RDBMS độc lập, dùng file, và hoàn toàn mã nguồn mở. Nó nổi tiếng với tính di động, độ tin cậy, và hiệu năng tốt ngay cả trong môi trường có ít bộ nhớ. Các transaction (giao dịch) của nó tuân thủ theo chuẩn ACID, ngay cả khi hệ thống bị treo hoặc mất điện.
Trang web của dự án SQLite mô tả nó là một cơ sở dữ liệu serverless (không yêu cầu server độc lập). Hầu hết các database engine (phần mềm chính xử lý và quản lý dữ liệu trong hệ thống) quan hệ được triển khai dưới dạng một tiến trình server. Các chương trình giao tiếp với server chủ thông qua cơ chế giao tiếp giữa các tiến trình để chuyển tiếp yêu cầu.
Ngược lại, SQLite cho phép mọi tiến trình truy cập cơ sở dữ liệu đọc và ghi trực tiếp vào file đĩa của cơ sở dữ liệu. Điều này giúp đơn giản hóa quá trình cài đặt SQLite vì nó loại bỏ mọi yêu cầu cấu hình một tiến trình server thông thường. Tương tự, ta cũng không cần cấu hình cho các chương trình sẽ sử dụng cơ sở dữ liệu SQLite. Tất cả những gì chúng cần là quyền truy cập vào hệ thống file.
SQLite là phần mềm miễn phí và mã nguồn mở nên ta không cần giấy phép đặc biệt để sử dụng nó. Tuy nhiên, dự án cũng có một số phần mở rộng có phí cho việc nén và mã hóa. Ngoài ra, SQLite còn cung cấp các gói hỗ trợ thương mại khác nhau, mỗi gói có một khoản phí hàng năm.
SQLite cho phép nhiều kiểu dữ liệu khác nhau, được tổ chức thành các lớp lưu trữ (storage class) sau:
| Kiểu dữ liệu | Giải thích |
|---|---|
| null | Bao gồm mọi giá trị null. |
| integer | Số nguyên có dấu, được lưu trữ trong 1, 2, 3, 4, 6, hoặc 8 byte tùy thuộc vào độ lớn của giá trị. |
| real | Số thực hoặc giá trị dấu phẩy động, được lưu trữ dưới dạng số dấu phẩy động 8 byte. |
| text | Chuỗi văn bản được lưu trữ bằng cách sử dụng bộ mã hóa của cơ sở dữ liệu (có thể là UTF-8, UTF-16BE hoặc UTF-16LE). |
| blob | Bất kỳ khối dữ liệu nào. Mỗi blob được lưu trữ chính xác như khi nó được nhập vào. |
Trong ngữ cảnh của SQLite, các thuật ngữ storage class và data type có thể thay thế cho nhau. Nếu bạn muốn tìm hiểu thêm về các kiểu dữ liệu và type affinity (cơ chế cho phép ưu tiên kiểu dữ liệu cho cột) của SQLite, hãy tham khảo tài liệu chính thức của dự án.
Theo bảng xếp hạng DB-Engines, MySQL đã là RDBMS mã nguồn mở phổ biến nhất kể từ khi trang web này bắt đầu theo dõi sự phổ biến của cơ sở dữ liệu vào năm 2012. Đây là một giải pháp giàu tính năng đứng đằng sau nhiều trang web và ứng dụng lớn nhất thế giới như Twitter, Facebook, Netflix, và Spotify. Việc làm quen với MySQL tương đối đơn giản. Phần lớn là nhờ vào tài liệu hướng dẫn đầy đủ và cộng đồng người dùng lớn, cũng như sự phong phú của các tài nguyên khác liên quan đến MySQL trên internet.
MySQL được thiết kế cho tốc độ và độ tin cậy, đổi lại phải hy sinh việc tuân thủ đầy đủ chuẩn SQL. Tuy các bên phát triển MySQL luôn cố gắng để tuân thủ chặt chẽ hơn với chuẩn SQL, nó vẫn đi sau các triển khai SQL khác về vấn đề này. Bù vào đó, MySQL đi kèm với các chế độ và phần mở rộng SQL khác nhau giúp nó tiến gần hơn đến việc tuân thủ chuẩn.
Không giống như các ứng dụng sử dụng SQLite, các ứng dụng sử dụng cơ sở dữ liệu MySQL truy cập nó thông qua một tiến trình daemon (chạy nền) riêng biệt. Vì tiến trình server đứng giữa cơ sở dữ liệu và các ứng dụng khác, nó cho phép kiểm soát chặt chẽ hơn việc ai có quyền truy cập vào cơ sở dữ liệu hay không.
MySQL đã truyền cảm hứng cho một loạt các ứng dụng, công cụ và thư viện tích hợp của bên thứ ba khác. Chúng giúp mở rộng chức năng của MySQL và giúp cho việc sử dụng nó trở nên dễ dàng hơn. Một số công cụ của bên thứ ba được sử dụng rộng rãi là phpMyAdmin, DBeaver, và HeidiSQL.
Các kiểu dữ liệu của MySQL có thể được chia thành ba loại chính: kiểu số, kiểu ngày giờ, và kiểu chuỗi.
Kiểu số:
| Kiểu dữ liệu | Giải thích |
|---|---|
| tinyint | Số nguyên rất nhỏ. Phạm vi có dấu cho kiểu dữ liệu số này là -128 đến 127, trong khi phạm vi không dấu là 0 đến 255. |
| smallint | Số nguyên nhỏ. Phạm vi có dấu cho kiểu số này là -32768 đến 32767, trong khi phạm vi không dấu là 0 đến 65535. |
| mediumint | Số nguyên cỡ trung bình. Phạm vi có dấu cho kiểu dữ liệu số này là -8388608 đến 8388607, trong khi phạm vi không dấu là 0 đến 16777215. |
| int hoặc integer | Số nguyên cỡ bình thường. Phạm vi có dấu cho kiểu dữ liệu số này là -2147483648 đến 2147483647, trong khi phạm vi không dấu là 0 đến 4294967295. |
| bigin | Số nguyên lớn. Phạm vi có dấu cho kiểu dữ liệu số này là -9223372036854775808 đến 9223372036854775807, trong khi phạm vi không dấu là 0 đến 18446744073709551615. |
| float | Số dấu phẩy động nhỏ (độ chính xác đơn). |
| double, double precision, hoặc real | Số dấu phẩy động cỡ bình thường (độ chính xác kép). |
| dec, decimal, fixed, hoặc numeric | Số dấu phẩy động cố định được đóng gói. Độ dài hiển thị của các mục cho kiểu dữ liệu này được xác định khi cột được tạo, và mọi mục đều phải tuân thủ độ dài đó. |
| bool hoặc boolean | Kiểu dữ liệu chỉ có hai giá trị khả dĩ, thường là true hoặc false. |
| bit | Một kiểu giá trị bit mà bạn có thể chỉ định số lượng bit cho mỗi giá trị, từ 1 đến 64. |
Kiểu ngày và giờ:
| Kiểu dữ liệu | Giải thích |
|---|---|
| date | Ngày trong năm dưới dạng YYYY-MM-DD. |
| datetime | Dấu thời gian bao gồm cả ngày và giờ, được hiển thị dưới dạng YYYY-MM-DD HH:MM:SS. |
| timestamp | Dấu thời gian định nghĩa bằng khoảng thời gian kể từ kỷ nguyên Unix (00:00:00 ngày 1 tháng 1 năm 1970). |
| time | Thời điểm trong ngày dưới dạng HH:MM:SS. |
| year | Năm ở định dạng 4 (mặc định) hoặc 2 chữ số. |
Kiểu chuỗi:
| Kiểu dữ liệu | Giải thích |
|---|---|
| char | Chuỗi có độ dài cố định. Các mục của loại này được đệm bên phải bằng dấu cách để đạt được độ dài đã chỉ định khi lưu trữ. |
| varchar | Chuỗi có độ dài thay đổi. |
| binary | Tương tự như kiểu char, nhưng là một chuỗi byte nhị phân có độ dài xác định thay vì một chuỗi ký tự không nhị phân. |
| varbinary | Tương tự như kiểu varchar, nhưng là một chuỗi byte nhị phân có độ dài thay đổi thay vì một chuỗi ký tự không nhị phân. |
| blob | Chuỗi nhị phân có độ dài tối đa là 65535 (2^16 – 1) byte dữ liệu. |
| tinyblog | Cột blob có độ dài tối đa là 255 (2^8 – 1) byte dữ liệu. |
| mediumblob | Cột blob có độ dài tối đa là 16777215 (2^24 – 1) byte dữ liệu. |
| longblob | Cột blob có độ dài tối đa là 4294967295 (2^32 – 1) byte dữ liệu. |
| text | Chuỗi có độ dài tối đa là 65535 (2^16 – 1) ký tự. |
| tinytext | Cột text có độ dài tối đa là 255 (2^8 – 1) ký tự. |
| mediumtext | Cột text có độ dài tối đa là 16777215 (2^24 – 1) ký tự. |
| longtext | Cột text có độ dài tối đa là 4294967295 (2^32 – 1) ký tự. |
| enum | Đối tượng chuỗi kiểu liệt kê (enumeration), nhận một giá trị duy nhất từ một danh sách các giá trị được khai báo khi bảng được tạo. |
| set | Tương tự như một kiểu liệt kê, nhưng là một đối tượng chuỗi có thể có không hoặc nhiều giá trị, và mỗi giá trị phải được chọn từ một danh sách các giá trị được phép được chỉ định khi bảng được tạo. |
FULL JOIN.PostgreSQL (hay gọi tắt là Postgres) tự nhận mình là “cơ sở dữ liệu quan hệ mã nguồn mở tiên tiến nhất thế giới.” Nó được tạo ra với mục tiêu mở rộng và tuân thủ tốt các tiêu chuẩn. PostgreSQL là một cơ sở dữ liệu quan hệ-đối tượng (object-relational). Điều này có nghĩa là tuy nó chủ yếu là cơ sở dữ liệu quan hệ, PostgreSQL cũng bao gồm các tính năng như kế thừa bảng và nạp chồng hàm (function overloading) vốn thường có ở cơ sở dữ liệu đối tượng.
Postgres có khả năng xử lý hiệu quả nhiều tác vụ cùng một lúc (concurrency). Nó làm điều này mà không cần khóa đọc (read lock) nhờ vào việc triển khai Multiversion Concurrency Control (MVCC, Điều khiển đồng thời đa phiên bản). Giải pháp này đảm bảo tính bất khả phân (atomicity), nhất quán, cô lập và bền vững của các transaction, hay còn được gọi là tuân thủ ACID.
Tuy PostgreSQL không được sử dụng rộng rãi như MySQL, vẫn có một số công cụ và thư viện của bên thứ ba được thiết kế để đơn giản hóa việc ứng dụng PostgreSQL như pgAdmin và Postbird.
PostgreSQL hỗ trợ các kiểu dữ liệu số, chuỗi, và ngày giờ giống như MySQL. Ngoài ra, nó còn hỗ trợ các kiểu dữ liệu cho hình dạng hình học, địa chỉ mạng, chuỗi bit, tìm kiếm văn bản, và các mục JSON, cũng như một số kiểu dữ liệu đặc thù khác.
Kiểu số:
| Kiểu dữ liệu | Giải thích |
|---|---|
| bigint | Số nguyên có dấu 8 byte. |
| bigserial | Số nguyên 8 byte tự động tăng. |
| double precision | Số dấu phẩy động độ chính xác kép 8 byte. |
| integer | Số nguyên có dấu 4 byte. |
| numeric hoặc decimal | Số có độ chính xác có thể lựa chọn (được khuyến nghị sử dụng trong các trường hợp yêu cầu độ chính xác tuyệt đối, chẳng hạn như số tiền). |
| real | Số dấu phẩy động độ chính xác đơn 4 byte. |
| smallint | Số nguyên có dấu 2 byte. |
| smallserial | Số nguyên 2 byte tự động tăng. |
| serial | Số nguyên 4 byte tự động tăng. |
Kiểu ký tự:
| Kiểu dữ liệu | Giải thích |
|---|---|
| character | Chuỗi ký tự có độ dài cố định được chỉ định. |
| character varying hoặc varchar | Chuỗi ký tự có độ dài thay đổi trong giới hạn. |
| text | Chuỗi ký tự có độ dài thay đổi không giới hạn. |
Kiểu ngày và giờ:
| Kiểu dữ liệu | Giải thích |
|---|---|
| date | Ngày trong năm, bao gồm ngày, tháng, và năm. |
| interval | Một khoảng thời gian. |
| time hoặc time without time zone | Một thời điểm trong ngày, không bao gồm múi giờ. |
| time with time zone | Một thời điểm trong ngày, bao gồm múi giờ. |
| timestamp hoặc timestamp without time zone | Ngày giờ, không bao gồm múi giờ. |
| timestamp with time zone | Ngày giờ, bao gồm múi giờ. |
Kiểu hình học:
| Kiểu dữ liệu | Giải thích |
|---|---|
| box | Hình chữ nhật trên một mặt phẳng. |
| circle | Hình tròn trên một mặt phẳng. |
| line | Đường thẳng vô hạn trên một mặt phẳng. |
| lseg | Đoạn thẳng trên một mặt phẳng. |
| path | Đường hình học trên một mặt phẳng. |
| point | Điểm hình học trên một mặt phẳng. |
| polygon | Đường hình học khép kín trên một mặt phẳng. |
Kiểu địa chỉ mạng:
| Kiểu dữ liệu | Giải thích |
|---|---|
| cidr | Một địa chỉ mạng IPv4 hoặc IPv6. |
| inet | Một địa chỉ host IPv4 hoặc IPv6. |
| macaddr | Một địa chỉ MAC (Media Access Control). |
Kiểu chuỗi bit:
| Kiểu dữ liệu | Giải thích |
|---|---|
| bit | Một chuỗi bit có độ dài cố định. |
| bit varying | Một chuỗi bit có độ dài thay đổi. |
Kiểu tìm kiếm văn bản:
| Kiểu dữ liệu | Giải thích |
|---|---|
| tsquery | Một truy vấn tìm kiếm văn bản. |
| tsvector | Một tài liệu tìm kiếm văn bản. |
Kiểu JSON:
| Kiểu dữ liệu | Giải thích |
|---|---|
| json | Dữ liệu JSON dạng văn bản. |
| jsonb | Dữ liệu JSON nhị phân đã được phân tách. |
Các kiểu dữ liệu khác:
| Kiểu dữ liệu | Giải thích |
|---|---|
| boolean | Giá trị logic, biểu diễn true hoặc false. |
| bytea | Viết tắt của “byte array”, kiểu này được sử dụng cho dữ liệu nhị phân. |
| money | Lượng tiền tệ. |
| pg_lsn | Số thứ tự trong log của PostgreSQL |
| txid_snapshot | Bản lưu transaction cấp user |
| uuid | Một định danh duy nhất ở mức toàn cục. |
| xml | Dữ liệu XML. |
Việc chọn lựa giữa SQLite, MySQL và PostgreSQL không đơn thuần là tìm kiếm giải pháp nhanh nhất hay nhiều tính năng nhất, mà là hiểu rõ đặc điểm và trường hợp sử dụng tối ưu của từng hệ quản trị cơ sở dữ liệu. Mỗi hệ thống đều có những cơ chế hoạt động và hạn chế riêng, cũng như những vượt trội trong các kịch bản cụ thể. Hy vọng bài viết này đã mang đến cho bạn cái nhìn tổng quan để giúp bạn có thể ra quyết định đúng đắn nhất về nền tảng dữ liệu cho các dự án tương lai của mình.