Bài viết được dịch từ trang web Cloud Boost

Lời nói đầu: Tôi là một hacker và tôi đang làm việc tại CloudBoost.io. Chúng tôi làm việc với rất nhiều database NoSQL và SQL. MongoDB quả là một database tuyệt vời và bài viết này dành để nói về ở đâu và trong trường hợp nào thì bạn nên và KHÔNG nên sử dụng MongoDB và nơi nào thì MongoDB phù hợp nhất. Quan điểm của tôi có thể chưa đúng, mong nhận được thêm ý kiến phản hồi từ các bạn.

Các cơ sở dữ liệu dạng document như MongoDB thì rất tuyệt vời để lưu trữ JSON vào trong một 'collection'. Bạn có thể lưu trữ bất kỳ JSON Document nào mà bạn thích và phân loại chúng vào trong bất kỳ collection nào bạn muốn. JSON được lưu vào trong MongoDB được gọi là Binary JSON hoặc BSON và chúng cũng giống như bất kỳ JSON nào đều là schema-less. Vì vậy không giống như các cơ sở dữ liệu SQL truyền thống, bạn có thể lưu trữ bất cứ thứ gì bạn thích trong bất kỳ collection nào mà bạn muốn - Vâng, chính cái điểm tự do đó kết hợp với khả năng mở rộng theo chiều ngang của MongoDB là điều khiến cho các nhà phát triển hào hứng sử dụng nó. Điều này nghe thật tuyệt! Oh, nhưng đợi đã...

Cơ sở dữ liệu MongoDB rất tuyệt vời, nhưng không phải trong trường hợp nào nó cũng mang lại hiệu quả.
Cơ sở dữ liệu MongoDB rất tuyệt vời, nhưng không phải trong trường hợp nào nó cũng mang lại hiệu quả.

Tại sao không sử dụng nó nếu nó là một cơ sở dữ liệu "tuyệt vời"

Cơ sở dữ liệu mà bạn dùng cho ứng dụng của mình phụ thuộc vào kiểu ứng dụng mà bạn đang xây dựng. Bạn không phải là người chọn cơ sở dữ liệu, mà ứng dụng của bạn mới quyết định việc đó. Sau đây tôi sẽ đưa ra một số ví dụ:

Nếu bạn đang xây dựng một ứng dụng chứa dữ liệu có khái niệm giống như "documents" thì MongoDB là một sự lựa chọn tốt. Ví dụ, nếu bạn đang xây dựng một blog engine, trong đó mỗi tác giả có nhiều blog và mỗi blog có nhiều comment, và nếu bạn nghĩ blog engine của mình sẽ mở rộng để chứa được HÀNG TẤN blog thì vâng, MongoDB là một sự lựa chọn rất tốt.

MongoDB không có mối quan hệ giữa các document và collection (Bạn có thể có một Database Reference, nhưng chúng thì không đủ).

Hãy thử suy nghĩ về document như là một "document" thực sự, bạn có những mẩu dữ liệu mà chúng không liên kết với bất kỳ dữ liệu nào khác và không có cách nào có thể làm một phép join dễ dàng như bạn thường làm trong SQL.

Vâng, nếu không có mối quan hệ nào và bạn không thể join các table - thì tại sao người ta lại lao đầu vào sử dụng nó? Bởi vì nó có ưu điểm là khả năng mở rộng cực lớn và có một độ trễ bé trong việc đọc/ghi khi so sánh với SQL. Đối với những ứng dụng mà dữ liệu phần lớn là không có mối liên hệ và cần khả năng mở rộng thì MongoDB là một sự lựa chọn hoàn hảo. Hầu hết các lập trình viên cũng sử dụng MongoDB để lưu trữ dữ liệu quan hệ và thực hiện phép join thủ công trong code của họ, điều này có thể hoạt động tốt trong một số trường hợp nào đó chỉ có join một cấp (one level join) / và có ít mối liên quan giữa dữ liệu nhưng không phải trường hợp nào cũng sử dụng được.

Tôi nên sử dụng cơ sở dữ liệu nào?

Có rất nhiều kiểu cơ sở dữ liệu ở ngoài kia, và mỗi cơ sở dữ liệu phù hợp cho một tập các yêu cầu xác định mà bạn có trong ứng dụng của mình. Một số loại cơ sở dữ liệu phổ biến là:

Document Databases (ví dụ: MongoDB): Các cơ sở dữ liệu dạng document thường được sử dụng để lưu trữ các JSON document trong các collection và truy vấn các trường liên quan. Bạn có thể sử dụng cơ sở dữ liệu này để xây dựng các ứng dụng không có quá nhiều mối quan hệ giữa các document. Một ví dụ tốt của dạng ứng dụng này là - Blog Engine / Nếu bạn muốn lưu trữ một danh mục sản phẩm.

Graph Databases (ví dụ: Neo4j): Các cơ sở dữ liệu dạng đồ thị (graph) thường được sử dụng để lưu trữ mối quan hệ giữa các thực thể, trong đó các node là các thực thể và cạnh nối là mối quan hệ giữa chúng. Ví dụ: nếu bạn đang xây dựng một mạng xã hội và nếu Người A follow Người B. Thì Người A và Người B có thể là các node và "follow" là cạnh nối giữa chúng. Đồ thị (graph) là cách tuyệt vời để làm công việc join giữa các node thậm chí trong trường hợp chiều sâu của liên kết đến 100 cấp.

Cache (ví dụ: Redis): Cache thường được sử dụng khi bạn cần truy cập cực nhanh đến dữ liệu của mình. Ví dụ, nếu bạn đang xây dựng một ứng dụng thương mại điện tử. Bạn có các danh mục sản phẩm phải load trên mỗi sự kiện page load. Thay vì việc cứ phải truy cập cơ sở dữ liệu cho mỗi hoạt động đọc đó (cho mỗi lần page load) thường tốn nhiều thời gian, bạn có thể lưu trữ nó trong cache sẽ giúp cho công việc đọc/ghi có tốc độ cực nhanh. Cache giống như Redis sẽ là một bộ đệm cho cơ sở dữ liệu của bạn phục vụ cho những truy xuất dữ liệu thường xuyên. Bạn có thể lưu trữ dữ liệu trong cache và không phải truy xuất cơ sở dữ liệu trong toàn bộ quá trình.

Search Databases (ví dụ: ElasticSearch): Nếu bạn muốn thực hiện một full text search trên dữ liệu của mình (ví dụ: các sản phẩm trong một ứng dụng thương mại điện tử) thì bạn cần một search database như ElasticSearch, nó có thể giúp bạn thực thi việc tìm kiếm trên một lượng dữ liệu lớn và mang lại cho bạn một tập các đặc trưng thú vị.

Row Store (ví dụ: Cassandra): Cassandra thường được sử dụng để lưu trữ dạng dữ liệu theo thời gian như các phân tích / logs/ dữ liệu số lượng lớn được thu về từ các bộ cảm biến sensor. Nếu bạn có một dạng ứng dụng kiểu đó mà có số lượng dữ liệu cần ghi rất lớn và ít phải đọc và dữ liệu là không có mối quan hệ (non-relational) thì Cassandra là một cơ sở dữ liệu mà bạn nên quan tâm tới.

Sử dụng nhiều cơ sở dữ liệu cùng lúc có được không?

Ngày nay nếu bạn đang xây dựng một ứng dụng, thì có thể cần phải sử dụng 2 hoặc nhiều cơ sở dữ liệu cùng một lúc. Ví dụ, nếu ứng dụng của bạn làm công việc search thì bạn có thể phải sử dụng ElasticSearch, cho việc lưu trữ dữ liệu không có quan hệ thì MongoDB là lựa chọn tốt nhất, và nếu bạn đang xây dựng một IoT (Internet of Things) có rất nhiều bộ cảm biến trả về hàng tấn dữ liệu thì tại sao lại không sử dụng Cassandra. Việc sử dụng nhiều cơ sở dữ liệu để xây dựng một ứng dụng được gọi là "Polyglot Persistence", tôi đã viết một bài blog nói về ưu và nhược điểm của việc sử dụng nhiều cơ sở dữ liệu. Bạn hãy thử đọc bài viết đó và để lại bình luận nếu bạn cảm thấy thú vị nhé!

Về tác giả bài viết:

Lập trình viên NawazNawaz Dhandala là một entrepreneur và một hacker. Anh là một full stack developer và có thể hoàn thành công việc - cực nhanh. Nawaz thích làm việc với những người có đam mê và có giấc mơ lớn và đủ hoài bão thay đổi để khiến cho thế giới này ngày càng tốt đẹp hơn. Bạn có thể liên hệ với anh qua blog cá nhân hoặc qua email hotcomputerworks[at]hotmail.com