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.
Đôi nét về hệ quản trị cơ sở dữ liệu
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.
Kiểu dữ liệu và ràng buộ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ụcNULL
nào.PRIMARY KEY
: Là sự kết hợp củaUNIQUE
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ộtFOREIGN KEY
là một cột trong một bảng dùng để tham chiếu đếnPRIMARY 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ộtFOREIGN KEY
phải đã tồn tại trong cộtPRIMARY 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ộcCHECK
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
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.
Các kiểu dữ liệu được SQLite hỗ trợ
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.
Ưu điểm của SQLite
- Ít tốn tài nguyên: Đúng như tên gọi của nó, thư viện SQLite rất nhẹ. Mặc dù lượng ổ cứng nó cần thay đổi tùy thuộc vào hệ thống được cài đặt, nó có thể chiếm ít hơn 600KiB dung lượng. Ngoài ra, SQLite hoạt động hoàn toàn độc lập. Bạn không phải cài đặt bất kỳ phần mềm phụ thuộc nào khác vào hệ thống để sử dụng nó.
- Thân thiện với người dùng: SQLite hay được mô tả là một cơ sở dữ liệu không cần cấu hình (zero-configuration) và sẵn sàng dùng ngay sau khi cài đặt. Nó không chạy như một tiến trình server. Điều đó có nghĩa là ta không bao giờ cần phải dừng, khởi động, hay khởi động lại SQLite và không cần quản lý bất kỳ file cấu hình nào đi kèm. Những tính năng này giúp đơn giản hóa quá trình từ cài đặt đến tích hợp SQLite với một ứng dụng.
- Tính di động: Các hệ quản trị cơ sở dữ liệu khác thường lưu trữ dữ liệu dưới dạng một tập hợp lớn các file riêng biệt. Trong khi đó, toàn bộ cơ sở dữ liệu SQLite được lưu trữ trong một file duy nhất. File này có thể được đặt ở bất cứ đâu trong hệ thống file và có thể được chia sẻ qua ổ cứng di động hoặc giao thức truyền file khác.
Nhược điểm của SQLite
- Khả năng xử lý đồng thời (concurrency) bị giới hạn: Mặc dù nhiều hơn một tiến trình có thể truy cập và truy vấn một cơ sở dữ liệu SQLite cùng một lúc, chỉ có một trong số chúng có thể thực hiện thay đổi đối với cơ sở dữ liệu tại bất kỳ thời điểm nào. Điều này có nghĩa là trong khi SQLite hỗ trợ concurrency cao hơn hầu hết các hệ quản trị cơ sở dữ liệu nhúng khác, khả năng này không tốt bằng các RDBMS dạng client/server như MySQL hay PostgreSQL.
- Không có cơ chế quản lý người dùng: Các hệ thống cơ sở dữ liệu thường đi kèm với hệ thống người dùng (user) hoặc các kết nối được quản lý với các đặc quyền truy cập xác định trước cho cơ sở dữ liệu và các bảng. Do SQLite đọc và ghi trực tiếp vào một file thông thường, các quyền truy cập duy nhất có thể áp dụng là các quyền truy cập của hệ điều hành bên dưới. Điều này làm cho SQLite trở thành một lựa chọn không phù hợp cho các ứng dụng đòi hỏi hỗ trợ nhiều người dùng với các quyền truy cập đặc biệt.
- Bảo mật: Trong một số trường hợp, một database engine sử dụng server có thể cung cấp khả năng bảo vệ tốt hơn khỏi các lỗi trong ứng dụng client so với một cơ sở dữ liệu serverless như SQLite. Ví dụ, các con trỏ đi lạc (stray pointers) trong client không thể làm hỏng bộ nhớ trên server. Ngoài ra, vì mỗi server là một tiến trình đơn nhất, không bị gián đoạn, một cơ sở dữ liệu client-server có thể kiểm soát quyền truy cập dữ liệu với độ chính xác cao hơn một cơ sở dữ liệu serverless. Điều này cho phép cơ chế khóa chi tiết hơn và concurrency tốt hơn.
Khi nào nên sử dụng SQLite
- Ứng dụng nhúng: SQLite là một lựa chọn tuyệt vời cho các ứng dụng cần tính di động và không yêu cầu mở rộng về lâu dài. Ví dụ điển hình bao gồm các ứng dụng cục bộ cho một người dùng, ứng dụng di động, hoặc game.
- Thay thế cho việc truy cập đĩa: Trong các trường hợp một ứng dụng cần đọc và ghi file trực tiếp vào đĩa cứng, SQLite có thể mang lại lợi ích nhờ vào các chức năng bổ sung và sự đơn giản đến từ việc sử dụng SQL.
- Kiểm thử: Đối với nhiều ứng dụng, việc kiểm thử chức năng của chúng với một DBMS (sử dụng một tiến trình server bổ sung) có thể là quá mức cần thiết. SQLite có một chế độ hoạt động trong bộ nhớ (in-memory). Nó có thể được sử dụng để chạy các bài kiểm thử một cách nhanh chóng mà không có gánh nặng xử lý của các hoạt động cơ sở dữ liệu thực tế, làm cho nó trở thành một lựa chọn lý tưởng cho việc kiểm thử.
Khi nào không nên sử dụng SQLite
- Làm việc với lượng dữ liệu lớn: Về mặt kỹ thuật, SQLite có thể hỗ trợ một cơ sở dữ liệu lên đến 140TB, miễn là ổ cứng và hệ thống file hỗ trợ được kích thước đó của cơ sở dữ liệu. Tuy nhiên, chính trang web của SQLite cũng khuyên rằng với cơ sở dữ liệu lớn gần đến 1TB, ta nên đặt nó trên một cơ sở dữ liệu client-server tập trung. Một cơ sở dữ liệu SQLite có kích thước đó hoặc lớn hơn sẽ khó quản lý hiệu quả.
- Lưu lượng ghi cao: SQLite chỉ cho phép một hoạt động ghi diễn ra tại một thời điểm bất kỳ. Điều này giới hạn đáng kể thông lượng của nó. Nếu ứng dụng của bạn yêu cầu nhiều hoạt động ghi hoặc nhiều người ghi đồng thời, SQLite có thể không đáp ứng đủ được nhu cầu của bạn.
- Yêu cầu truy cập qua mạng: Vì SQLite là một cơ sở dữ liệu serverless, nó không cung cấp quyền truy cập trực tiếp qua mạng vào dữ liệu của mình. Quyền truy cập này được tích hợp vào ứng dụng. Nếu dữ liệu trong SQLite được đặt trên một máy khác với ứng dụng, nó sẽ yêu cầu một liên kết engine-tới-đĩa có băng thông cao qua mạng. Đây là một giải pháp tốn kém, không hiệu quả. Trong những trường hợp như vậy, một DBMS dạng client-server có thể là một lựa chọn tốt hơn.
MySQL
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 MySQL hỗ trợ
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. |
Ưu điểm của MySQL
- Phổ biến và dễ sử dụng: MySQL là một trong những hệ thống cơ sở dữ liệu phổ biến nhất thế giới nên luôn có nhiều các quản trị viên cơ sở dữ liệu có kinh nghiệm làm việc với nó. Tương tự, có rất nhiều tài liệu giấy và trực tuyến về cách cài đặt và quản lý một cơ sở dữ liệu MySQL. Điều này bao trùm cả một số công cụ của bên thứ ba như phpMyAdmin, giúp đơn giản hóa quá trình bắt đầu với cơ sở dữ liệu.
- Bảo mật: MySQL đi kèm với một script giúp bạn cải thiện tính bảo mật của cơ sở dữ liệu. Nó thiết lập mức độ bảo mật mật khẩu của cài đặt, xác định mật khẩu cho người dùng root, xóa các tài khoản ẩn danh, và xóa các cơ sở dữ liệu kiểm thử mặc định có thể truy cập bởi tất cả người dùng. Ngoài ra, không giống như SQLite, MySQL hỗ trợ quản lý người dùng và cho phép bạn cấp quyền truy cập trên cơ sở từng người dùng.
- Tốc độ: Bằng cách chọn không triển khai một số tính năng nhất định của SQL, các nhà phát triển MySQL đã có thể tối ưu hóa tốc độ của nó. Mặc dù các bài kiểm tra hiệu năng gần đây cho thấy các RDBMS khác như PostgreSQL có thể sánh ngang hoặc ít nhất là gần bằng MySQL về mặt tốc độ, MySQL vẫn giữ được coi là một giải pháp cơ sở dữ liệu cực kỳ nhanh.
- Ssao chép: MySQL hỗ trợ một số loại replication (sao chép, chia sẻ thông tin trên hai hoặc nhiều host khác nhau) để giúp cải thiện độ tin cậy, tính sẵn sàng và khả năng chịu lỗi. Điều này rất hữu ích để thiết lập một giải pháp sao lưu cơ sở dữ liệu hoặc scale cơ sở dữ liệu theo chiều ngang.
Nhược điểm của MySQL
- Một số giới hạn: Vì MySQL được thiết kế để chạy nhanh và dễ sử dụng thay vì tuân thủ đầy đủ tiêu chuẩn SQL, nó có một số giới hạn chức năng nhất định. Ví dụ, nó thiếu hỗ trợ cho các mệnh đề
FULL JOIN
. - Giấy phép và các tính năng độc quyền: MySQL là phần mềm giấy phép kép. Nó một phiên bản cộng đồng miễn phí và mã nguồn mở được cấp phép theo GPLv2 và một số phiên bản thương mại trả phí được phát hành theo giấy phép độc quyền. Do đó, một số tính năng và plugin chỉ có khi bạn trả tiền để mua các bản thương mại.
- Quá trình phát triển bị chậm lại: MySQL được Sun Microsystems mua lại vào năm 2008, và sau đó là Oracle Corporation vào năm 2009. Kể từ đó, đã có những phàn nàn từ người dùng rằng quá trình phát triển của DBMS đã chậm lại đáng kể. Bên phát triển không còn phản ứng nhanh chóng với các vấn đề nảy sinh cũng như triển khai các thay đổi.
Khi nào nên sử dụng MySQL
- Ứng dụng phân tán: Việc hỗ trợ replication của MySQL làm cho nó trở thành một lựa chọn tuyệt vời cho các cấu hình cơ sở dữ liệu phân tán như kiến trúc primary-secondary (chính phụ) hoặc primary-primary (chính-chính).
- Trang web và ứng dụng web: MySQL làm nền tảng cho nhiều trang web và ứng dụng trên internet. Điều này phần lớn là nhờ vào việc dễ dàng cài đặt và thiết lập một cơ sở dữ liệu MySQL, cũng như tốc độ hoạt động và khả năng mở rộng tổng thể của nó trong dài hạn.
- Dự kiến tăng trưởng trong tương lai: Việc hỗ trợ replication của MySQL có thể giúp tạo điều kiện thuận lợi cho việc scale theo chiều ngang. Ngoài ra, việc nâng cấp lên một sản phẩm MySQL thương mại, như MySQL Cluster, hỗ trợ sharding tự động (một quy trình scale theo chiều ngang khác) là một quá trình tương đối đơn giản.
Khi nào không nên sử dụng MySQL
- Yêu cầu tuân thủ SQL: Vì MySQL không có ý định triển khai toàn bộ SQL, công cụ này không hoàn toàn tuân thủ tiêu chuẩn này. Khi bắt buộc phải tuân thủ SQL (hoàn toàn hoặc gần như hoàn toàn), bạn nên lựa chọn một DBMS khác.
- Concurrency và khối lượng dữ liệu lớn: Mặc dù MySQL thường hoạt động tốt với các khối lượng đọc lớn, việc đọc-ghi đồng thời có thể gây ra vấn đề. Nếu ứng dụng của bạn sẽ có rất nhiều người dùng ghi dữ liệu cùng một lúc, các RDBMS khác như PostgreSQL có thể là một lựa chọn tốt hơn.
PostgreSQL
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.
Các kiểu dữ liệu được PostgreSQL hỗ trợ
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. |
Ưu điểm của PostgreSQL
- Tuân thủ SQL: Khác với SQLite hay MySQL, PostgreSQL hướng tới việc tuân thủ chặt chẽ các tiêu chuẩn SQL. Theo tài liệu chính thức của dự án, PostgreSQL hỗ trợ 160 trong số 179 tính năng cần thiết cho việc tuân thủ đầy đủ cơ bản SQL:2011. Ngoài ra nó còn hỗ trợ nhiều tính năng tùy chọn khác.
- Mã nguồn mở và do cộng đồng điều hành: PostgreSQL là một dự án mã nguồn mở hoàn toàn và được phát triển bởi một cộng đồng lớn và tận tụy. Tương tự, cộng đồng Postgres duy trì và đóng góp vào vô số tài tài liệu hướng dẫn cách làm việc với DBMS, bao gồm tài liệu chính thức, wiki PostgreSQL, và các diễn đàn trực tuyến khác nhau.
- Khả năng mở rộng: Người dùng có thể mở rộng PostgreSQL một cách lập trình hoặc tức thời thông qua vận hành dựa trên catalog và sử dụng dynamic loading (nạp động). Bạn có thể chỉ định một file object code (mã đối tượng, chẳng hạn như của một thư viện chia sẻ), và PostgreSQL sẽ nạp nó khi cần thiết.
Nhược điểm của PostgreSQL
- Hiệu năng bộ nhớ: Với mỗi kết nối client mới, PostgreSQL tạo ra một tiến trình mới. Mỗi tiến trình mới được cấp phát khoảng 10MB bộ nhớ, một con số có thể tăng lên nhanh chóng khi cơ sở dữ liệu phục vụ nhiều kết nối. Do đó, đối với các hoạt động đọc nhiều đơn giản, PostgreSQL thường có hiệu năng kém hơn các RDBMS khác như MySQL.
- Độ phổ biến: Mặc dù được sử dụng rộng rãi hơn trong những năm gần đây, PostgreSQL vẫn thua MySQL về mức độ phổ biến. Một hệ quả của điều này là vẫn còn ít công cụ từ bên thứ ba có thể giúp quản lý một cơ sở dữ liệu PostgreSQL. Tương tự, không có nhiều quản trị viên cơ sở dữ liệu có kinh nghiệm với Postgres so với MySQL.
Khi nào nên sử dụng PostgreSQL
- Khi cần tính toàn vẹn dữ liệu: PostgreSQL đã hoàn toàn tuân thủ ACID từ năm 2001. Nó triển khai multiversion concurrency control để đảm bảo rằng dữ liệu vẫn nhất quán. Đây là lý do PostgreSQL là một lựa chọn RDBMS tốt khi tính toàn vẹn dữ liệu là cực kỳ quan trọng.
- Tích hợp với các công cụ khác: PostgreSQL tương thích với một loạt các ngôn ngữ lập trình và nền tảng khác nhau. Việc bạn di chuyển cơ sở dữ liệu của mình sang một hệ điều hành khác hoặc tích hợp nó với một công cụ cụ thể nào đó có thể sẽ dễ dàng hơn so với một DBMS khác.
- Các hoạt động phức tạp: PostgreSQL hỗ trợ các kế hoạch truy vấn để tận dụng CPU nhằm phục vụ các truy vấn với tốc độ cao hơn. Cùng với việc hỗ trợ tốt cho nhiều người ghi đồng thời, PostgreSQL trở thành một lựa chọn tuyệt vời cho các hoạt động phức tạp như kho dữ liệu (data warehousing) và xử lý giao dịch trực tuyến.
Khi nào không nên sử dụng PostgreSQL
- Tốc độ là yếu tố cấp thiết: Để đổi lấy khả năng mở rộng và khả năng tương thích, PostgreSQL đã hy sinh một phần tốc độ hoạt động. Nếu dự án của bạn yêu cầu việc đọc nhanh nhất có thể, PostgreSQL có thể không phải là lựa chọn DBMS tốt nhất.
- Các hệ thống đơn giản: Do có bộ tính năng lớn và tuân thủ chặt chẽ với tiêu chuẩn SQL, Postgres đôi khi là lựa chọn quá mức cần thiết cho các hệ thống cơ sở dữ liệu đơn giản. Đối với các hoạt động đọc nhiều cần tốc độ nhanh, MySQL thường là một lựa chọn thực tế hơn.
- Replication phức tạp: Mặc dù PostgreSQL đã cung cấp hỗ trợ cho replication, đây vẫn là một tính năng tương đối mới. Một số cấu hình (như kiến trúc primary-primary) chỉ có thể thực hiện điều này được với các phần mở rộng. Replication trên MySQL có tính ổn định hơn. Nhiều người dùng cũng thấy rằng tính năng replication của MySQL dễ triển khai hơn, đặc biệt là đối với những người thiếu kinh nghiệm quản trị cơ sở dữ liệu và hệ thống.
Tổng kết: So sánh giữa SQLite, MySQL và PostgreSQL
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.