Thiết Kế Database – SQL vs NoSQL, MySQL vs MongoDB

Khi bắt đầu dự án mới, bên cạnh việc chọn ngôn ngữ, stack backend và frontend. Lựa chọn database cũng là một việc hết sức quan trọng và tiêu tốn rất nhiều công sức khi các bạn phân vân giữa SQL hay NoSQL.

Hôm nay mình giới thiệu mọi người sự khác nhau giữa SQL và NoSQL nói chung, MySQL và MongoDB nói riêng; hy vọng nó sẽ giúp ích mọi người

MySQL Là Gì

Đầu tiên, hãy phát âm đúng. Nhiều người đọc nó là “my sequel” hoặc khác, nhưng phát âm chính thức là là: MY-ES-KYOO-EL’ [maɪˌɛsˌkjuːˈɛl]. Công ty Thuy Điển MySQL AB phát triển MySQL vào năm 1994. Công ty công nghệ Mỹ Sun Microsystem sau đó giữ quyền sở hữu MySQL sau khi mua lại MySQL vào năm 2008. Năm 2010, gã khổng lồ Oracle mua Sun Microsystems và MySQL thuộc quyền sở hữu của Oracle từ đó.

Quay lại với khái niệm chính, MySQL là một hệ thống quản trị cơ sở dữ liệu mã nguồn mở (Relational Database Management System, viết tắt là RDBMS) hoạt động theo mô hình client-server. RDBMS là một phần mềm hay dịch vụ dùng để tạo và quản lý các cơ sở dữ liệu (Database) theo hình thức quản lý các mối liên hệ giữa chúng.

MySQL là một trong số các phần mềm RDBMS. RDBMS và MySQL thường được cho là một vì độ phổ biến quá lớn của MySQL. Các ứng dụng web lớn nhất như Facebook, Twitter, YouTube, Google, và Yahoo! đều dùng MySQL cho mục đích lưu trữ dữ liệu. Kể cả khi ban đầu nó chỉ được dùng rất hạn chế nhưng giờ nó đã tương thích với nhiều hạ tầng máy tính quan trọng như Linux, macOS, Microsoft Windows, và Ubuntu.

MongoDB Là Gì

MongoDB (chữ mongo được lấy từ “humongous” trong tiếng Anh, nghĩa là “khổng lồ”), là một NoSQL database. Khác với MySQL hay các loại SQL database khác chạy theo mô hình database – table – row với số dòng – cột nhất định, schema phức tạp, và phải sử dụng nhiều JOIN khi query. MongoDB chạy theo mô hình database – collection – document, thay thế mô hình cơ sở dữ liệu dùng table truyền thống bằng các document với định dạng JSON với cấu trúc linh hoạt hơn (MongoDB gọi là BSON).

Với nhiều ưu điểm như hỗ trợ đa nền tảng (Windows, Linux), hiệu năng cao, dễ dàng mở rộng theo chiều ngang.

Có rất nhiều loại NoSQL như là:

  • Document-Based Database
  • Key-Value Database
  • Wide Column Based Database
  • Graph-Based Database

Sự Khác Biệt Chính

Relation vs Non-Relation

Sự khác biệt đầu tiên đó chính là quan hệ dữ liệu

MySQL thật sự rất phổ biến trong database để lưu dữ liệu kiểu quan hệ với nhau, tưởng tượng các bạn đang làm sản phẩm thương mại điện tử nơi mà hàng ngày người dùng đặt rất nhiều hàng hóa trên sàn.

Mỗi đơn hàng khi được tạo trên hệ thống thì phải biết rõ:

  • Có bao nhiêu món hàng, thông tin của từng món hàng là gì?
  • Ai là người đặt hàng? Thông tin chi tiết của người đặt hàng?
  • Đơn hàng có được giảm giá và mã giảm giá là gì?

Không có đơn hàng nào mà không biết người mua hay sản phẩm đúng không nào? Đó chính là mối quan hệ dữ liệu

Ở phía ngược lại, MongoDB không cần thiết phải đảm bảo mối quan hệ này.

Cho nên khi sử dụng MongoDB trong trường hợp này thi bạn phải làm validation kiểm tra sản phẩm và người mua ở tầng ứng dụng trước khi lưu hóa đơn nhé 😀

Schema

Khi thiết kế database cho dự án mới có phải các bạn luôn phải liệt kê ra có bao nhiêu bảng, mỗi bảng có bao nhiêu cột, kiểu dữ liệu là gì, độ dài, có thể để trống hay bắt nhâp….

Đây chính là schema design và MySQL bắt buộc các bạn phải thiết kế tất cả thông tin trên trước khi coding nha (Predefined Schema)

Ở phía ngược lại, MongoDB không cần schema phải được thiết kế trước. Cơ bản là không có schema trong MongoDB có nghĩa là bạn lưu cái gì cũng được trên cùng một collection, thậm chí khác nhau cho mỗi row luôn cũng không sao. Có gì thì lưu nấy (Dynamic Schema)

Scaling

MySQL không thể nào nhanh hơn, lưu được nhiều data hơn nếu như các bạn không tăng cấu hình cho server như là RAM, CPU, SDD/HDD. Người ta gọi cái này là Vertical scaling hay là scale up.

Ở phía ngược lại, MongoDB nổi tiếng ở việc sử dụng cluster/sharding hay partition để tăng tốc, nâng dung lượng lưu trữ… và người ta gọi là Horizontal scaling hay là scale out

Hiểu đơn giản là bạn sẽ có rất nhiều máy chủ để nâng cấp cho MongoDB nhanh và mạnh hơn (cái này coi như là không giới hạn rồi :D)

Storage

MySQL sẽ lưu trữ dữ liệu theo bảng, mỗi bảng sẽ có nhiều cột và hàng. (Table)

Ở phía ngược lại thì MongoDB sẽ lưu trữ dữ liệu theo dạng tập hợp nhiều JSON document (Collection)

Nói tới JSON thì các bạn biết rồi đó, nó là cấu trúc internet-friendly và có thể tích hợp với rất nhiều hệ thống với cú pháp này vì tính chất linh hoạt và kích thước nhỏ gọn phải không nào

Tiêu Chí Lựa Chọn

Vậy thì lựa chọn tiêu chí gì khi bạn phân vân giữa MySQL và NoSQL

Chọn MongoDB khi:

  • Khi ứng dụng cập nhật, tạo mới dữ liệu thường xuyên
  • Lưu trữ khối lượng dữ liệu lớn
  • Lưu trữ dữ liệu thô và đa dạng về cấu trúc
  • Nói đến đây chắc các bạn liên tưởng đến Big Data rồi phải không khi mà Volume, Velocity, Variety được nhắc đến rất nhiều. Đó là lý do tại sao MongoDB được chọn cho dự án Big Data mà không phải là MySQL
  • Cần sự linh hoạt trong lưu và xử lý dữ liệu

Chọn MySQL khi:

  • Dữ liệu cần độ toàn vẹn (integrity), quan hệ (relation) và tránh trùng lặp (duplication)
  • Biết rõ cấu trúc dữ liệu cũng như là ít có sự thay đổi trong cấu trúc
  • Xử lý logic ngay trên database cũng như là hệ thống cần nhiều transaction phức tạp
  • Có nhu cầu cần join nhiều nguồn dữ liệu

Lựa chọn khác

Khi nói về lựa chọn khác cho MySQL thì còn rất nhiều database khác như là: MSSQL, SQLite, H2, Postgre, MariaDB, Oracle,…. trên cloud có AWS RDS hay Azure SQL, GCP SQL

Lựa chọn khác cho MongoDB: Apache Cassandra, HBase, Redis, OrientDB, trên cloud có AWS DynamoDB, Azure Cosmos, GCP DataStore

Xem thêm video ở đây nhé

Image by macrovector on Freepik