Tại sao bạn chọn MongoDB mà không phải những người khác?

Bài viết này đề cập đến các vấn đề tiềm ẩn mà bạn sẽ gặp phải khi sử dụng MongoDB cho các tác vụ quan hệ điển hình

TLDR. Nếu bạn không biết chọn cơ sở dữ liệu nào thì hãy chọn cơ sở dữ liệu quan hệ (MySQL hoặc PostgreSQL). Trong phần lớn các trường hợp, đó sẽ là quyết định đúng đắn, trong một số trường hợp còn lại, bạn có thể chuyển sang MongoDB sau

MongoDB là một trong những cơ sở dữ liệu phổ biến nhất dành cho các nhà phát triển Node JS và một số nhà phát triển, đặc biệt là những người mới bắt đầu, tin rằng nếu bạn chọn Node JS thì MongoDB là lựa chọn mặc định. Và thật không may, MongoDB là lựa chọn tồi tệ nhất cho đàn em, vì bắt đầu với MongoDB rất dễ dàng, nhưng khi bạn tiếp tục, các vấn đề sẽ phát sinh nhanh chóng

Những lầm tưởng và quan niệm sai lầm phổ biến về MongoDB

Lầm tưởng N1 — Nếu bạn đang làm việc với Node JS, thì bạn cần chọn MongoDB. Đúng là Mongoose là một trong những ORM tốt nhất cho Node JS, nhưng Node cũng có các ORM quan hệ rất tốt

Lầm tưởng N2—MongoDB nhanh hơn cơ sở dữ liệu quan hệ. Đây là một trong những sai lầm lớn nhất;

Lầm tưởng N3 — Phát triển với MongoDB nhanh hơn vì bạn không có thiết kế lược đồ nghiêm ngặt. Một lần nữa không phải là một điểm hợp lệ, nếu bạn không thiết kế lược đồ và di chuyển của mình một cách thích hợp thì bạn sẽ gặp phải các vấn đề thực sự sau này và thậm chí còn nhiều hơn nếu bạn có dữ liệu sản xuất. Điều này chỉ đúng với tạo mẫu nhanh

Lầm tưởng N4 — MongoDB là mã nguồn mở và miễn phí trong khi các cơ sở dữ liệu quan hệ khác phải trả phí. Máy chủ cộng đồng MongoDB hoàn toàn miễn phí sử dụng, tuy nhiên nó cũng có phiên bản dành cho doanh nghiệp và có một số hạn chế đối với việc sử dụng miễn phí nếu bạn sửa đổi mã nguồn hoặc cung cấp nó dưới dạng dịch vụ. Đồng thời, có các cơ sở dữ liệu quan hệ miễn phí tuyệt vời như MariaDB và PostgreSQL

Nếu bạn đang đọc đến đây, bạn có thể nghĩ rằng tôi đang viết bài này để chống lại MongoDB. Không hề, MongoDB là một trong những cơ sở dữ liệu mạnh nhất hiện nay. Vấn đề là hầu hết dữ liệu điển hình được lưu trữ trong cơ sở dữ liệu về bản chất là quan hệ, ví dụ: danh sách người dùng, đơn đặt hàng của người dùng, chi tiết đơn hàng, cửa hàng, sản phẩm và danh mục sản phẩm. Và mặc dù MongoDB có một số tính năng DB quan hệ, nhưng khi bạn bắt đầu sử dụng nó cho các mục đích quan hệ thuần túy, các vấn đề bắt đầu xuất hiện theo thời gian

Các vấn đề có thể xảy ra bạn nên biết

Tôi sẽ không so sánh cơ sở dữ liệu Quan hệ với cơ sở dữ liệu NoSQL trên cơ sở tính năng, vì bạn có thể tìm thấy nhiều bài đăng tương tự trên web. Tôi thực sự muốn tập trung vào các vấn đề mà chúng tôi gặp phải với MongoDB cho một trong những dự án “quan hệ điển hình” mà chúng tôi đã phát triển trong hơn 5 năm

N1. Thiết kế quan hệ không đơn giản trong MongoDB

Trong cơ sở dữ liệu quan hệ, quá trình thiết kế thực sự đơn giản. Có các dạng chuẩn hóa được xác định (1N — 6NF và Boyce Codd) và nếu bạn tuân theo ít nhất 3 dạng đầu tiên, thì cơ sở dữ liệu của bạn ở trạng thái khá dễ quản lý. Và làm theo 3 form đầu tiên không phải là thử thách với bất kỳ junior developer nào

Mặc dù trong thiết kế lược đồ MongoDB thực sự cung cấp hai lựa chọn cho mọi dữ liệu. Bạn có thể nhúng trực tiếp dữ liệu đó hoặc tham chiếu đến một phần dữ liệu khác bằng cách sử dụng toán tử $lookup (tương tự như THAM GIA). Và cả hai đều có ưu điểm và hạn chế

Tại sao bạn chọn MongoDB mà không phải những người khác?

Mối quan hệ thành viên nhóm đơn giản này, mà mọi người mới bắt đầu có thể tạo trong thiết kế quan hệ không đơn giản như trong MongoDB

Nếu bạn quyết định sử dụng tham chiếu như trong thiết kế quan hệ, thì chỉ cần tìm nạp thành viên nhóm 2 lần tra cứu và bạn vẫn gặp sự cố với tính toàn vẹn của dữ liệu vì MongoDB không hỗ trợ khóa ngoại

Nếu bạn quyết định thực hiện nhúng và lưu trữ nhóm người dùng trong tài liệu người dùng dưới dạng một mảng, thì việc lấy nhóm người dùng sẽ nhanh hơn, nhưng việc lấy nhóm người dùng rất chậm

Cách cuối cùng là lưu trữ id nhóm trong tài liệu người dùng và id người dùng trong tài liệu nhóm và như bạn thấy, chúng tôi có sự trùng lặp và chúng tôi cần xử lý các bất thường về cập nhật/xóa

N2. Tham gia các bộ sưu tập trong MongoDB

Thao tác “quan hệ” tiếp theo là nối nhiều tập hợp, đây là một trong những thao tác dễ dàng và phổ biến đối với cơ sở dữ liệu quan hệ

Để “nối” hai bộ sưu tập MongoDB có một toán tử tra cứu $. Nhưng lời khuyên thiết kế lược đồ MongoDB là tránh tham gia, vì tham gia các bộ sưu tập là một thao tác nặng nề và không có khóa ngoại được hỗ trợ cho nó. Thay vào đó, cách tốt nhất là lưu các tham chiếu id thủ công trong một tài liệu bộ sưu tập và thêm các chỉ mục vào trường bộ sưu tập tham gia để tối ưu hóa việc tra cứu

Mặc dù các tra cứu đơn lẻ ít nhiều phù hợp với những cân nhắc ở trên, nhưng việc kết hợp với các điều kiện và truy vấn phụ trên một bộ sưu tập đã tham gia mang lại một số hạn chế và cả hai - sự phức tạp trong thiết kế và thực thi

Trong khi viết bài đăng trên blog này, tôi đã tìm thấy một bài viết tuyệt vời khác hoàn toàn dành riêng cho chủ đề này. Vì vậy, thay vì phát minh lại bánh xe, tôi sẽ sử dụng lại dữ liệu từ blog. Nó rất giống với ví dụ của chúng tôi. bảng nhân viên, phòng ban và employee_departments. Mục tiêu là đo lường hiệu suất của hai truy vấn để tìm tổng lương của từng bộ phận, có hoặc không có bộ phận không có nhân viên

Tại sao bạn chọn MongoDB mà không phải những người khác?

Không có gì ngạc nhiên khi MongoDB chậm hơn 50–130 lần. Điều đó không có nghĩa là MongoDB nói chung là một cơ sở dữ liệu chậm hơn, điều đó có nghĩa là nếu bạn đang sử dụng MongoDB thì bạn cần thiết kế cơ sở dữ liệu của mình cho phù hợp và khi bạn gặp phải một số vấn đề về hiệu suất, bạn không thể chỉ thêm các chỉ mục để sửa nó.

N3. Toàn vẹn dữ liệu — giao dịch ACID

Nếu bạn không biết ACID là gì, đừng lo lắng, nó chỉ là viết tắt của Atomity, Consistency, Isolation và Durability và ở mức rất cao, nó đảm bảo rằng dữ liệu của bạn không bao giờ rơi vào trạng thái không nhất quán do một hoạt động nào đó

Một nhược điểm lớn của cơ sở dữ liệu phi quan hệ là thiếu tính toàn vẹn của dữ liệu. Cơ sở dữ liệu quan hệ thường có các giao dịch ACID cho nhiều hoạt động vì về bản chất, việc cập nhật cơ sở dữ liệu quan hệ thường có nghĩa là cập nhật nhiều bảng có liên quan

MongoDB và phần lớn cơ sở dữ liệu hỗ trợ các giao dịch ACID cho các hoạt động đơn lẻ. Sau này MongoDB 4. 0 đi kèm với hỗ trợ giao dịch ACID đa tài liệu. Tuy nhiên, đó là trường hợp sử dụng để người dùng DB xử lý giao dịch và bạn không thể tận dụng chúng một cách thường xuyên

Tóm lại. MongoDB không đảm bảo tính toàn vẹn của dữ liệu trong bất kỳ tình huống nào, vì nó thiếu các mối quan hệ. Bạn có thể thêm một số mức độ nhất quán bằng cách sử dụng giao dịch nhiều tài liệu và kiểm tra cấp ứng dụng

N4. Phân trang trong MongoDB không hoạt động như bạn mong đợi

Đây chỉ là một ví dụ nhanh về hiệu suất chức năng MongoDB skip() so với PostgreSQL offset/limit. Đối với tất cả các trường hợp, chúng tôi yêu cầu cùng một lượng người dùng từ bộ sưu tập người dùng của chúng tôi. Nhưng thời gian thực hiện truy vấn tiếp tục tăng lên khi chúng tôi tiếp tục với phân trang

Tại sao bạn chọn MongoDB mà không phải những người khác?

Lý do nó chạy chậm là bỏ qua 10.000 bản ghi và trả về 1000, cơ sở dữ liệu vẫn kiểm tra 11.000 bản ghi và chỉ trả về 1000. Bạn có thể đọc thêm về cách thức hoạt động của tính năng "bỏ qua" và cách làm cho tính năng này nhanh hơn bằng một phương pháp khác tại đây

Ghi chú. để thử nghiệm, chúng tôi đã sử dụng phiên bản đám mây với 2GB RAM. Nếu bạn có thể mua một máy có CPU mới nhất và 64 GB RAM, thì cả MongoDB và PostgreSQL sẽ thực thi trong chưa đầy 1 giây, nhưng trong thực tế, chúng tôi triển khai các ứng dụng của mình trên các máy đám mây có 2 GB RAM

Vậy, khi nào nên sử dụng MongoDB?

Mặc dù MongoDB tuyên bố đây là cơ sở dữ liệu có mục đích chung, nhưng theo kinh nghiệm của chúng tôi, MongoDB thực sự tuyệt vời trong các tình huống sau

  1. Để tạo nguyên mẫu nhanh — khi nó chỉ là nguyên mẫu và bạn không muốn lo lắng về thiết kế DB, tạo bảng và lập chỉ mục. Không có dữ liệu thực trong cơ sở dữ liệu và hiệu suất sẽ không thành vấn đề
  2. Đối với lưu trữ tài liệu thông thường — như tải xuống và lưu trữ các trang HTML, tài liệu bán cấu trúc và các loại dữ liệu thực sự không có cấu trúc xác định
  3. Để ghi nhật ký tốc độ cao, lưu vào bộ nhớ đệm, v.v. trong thời gian thực

MongoDB là một trong những cơ sở dữ liệu tốt nhất trên thế giới, nhưng bạn chỉ nên sử dụng MongoDB khi bạn thực sự có dữ liệu không liên quan và bạn biết chính xác tại sao cơ sở dữ liệu NoSQL lại cần thiết. Nếu bạn không có câu trả lời cho câu hỏi này, chỉ cần sử dụng một DB quan hệ (MariaDB và PostgreSQL là những cơ sở dữ liệu tuyệt vời và miễn phí để sử dụng)

Mặc dù MongoDB được biết đến như một cơ sở dữ liệu miễn phí, hiệu suất cao và phát triển nhanh, nhưng khi sử dụng sai chỗ, bạn sẽ thấy tác dụng ngược lại, hệ thống của bạn sẽ trở nên chậm chạp, khó quản lý và việc khắc phục các sự cố về hiệu suất sẽ yêu cầu thay đổi cả dữ liệu

Tại sao MongoDB tốt hơn những cái khác?

MongoDB rất phù hợp để phân tích thời gian thực, quản lý nội dung, Internet vạn vật, thiết bị di động và các loại ứng dụng khác . Đó là một lựa chọn lý tưởng nếu bạn có dữ liệu phi cấu trúc và/hoặc có cấu trúc với tiềm năng tăng trưởng nhanh.

Tại sao bạn chọn MongoDB?

MongoDB có thể được sử dụng làm hệ thống lưu trữ tệp được gọi là GridFS. MongoDB cung cấp các cách khác nhau để thực hiện các hoạt động tổng hợp trên dữ liệu như đường dẫn tổng hợp, thu nhỏ bản đồ hoặc các lệnh tổng hợp mục tiêu đơn lẻ . MongoDB có thể lưu trữ bất kỳ loại tệp nào có kích thước bất kỳ mà không ảnh hưởng đến ngăn xếp của chúng tôi.

Điều gì khiến MongoDB khác biệt với các cơ sở dữ liệu khác?

MongoDB khác với các loại cơ sở dữ liệu khác như thế nào? . Điều này cung cấp một số lợi thế so với các loại cơ sở dữ liệu khác. Dữ liệu được lưu trữ trong MongoDB ánh xạ tới một lược đồ linh hoạt. data doesn't need to fit within the confines of a strict relationship, MongoDB can operate as a general data store. This provides several advantages over other types of databases. Data stored in MongoDB maps to a flexible schema.

Tại sao nên sử dụng MongoDB thay vì NoSQL khác?

MongoDB cung cấp sự linh hoạt nhất để đảm bảo độ bền cho các hoạt động cụ thể . người dùng có thể chọn cấu hình được tối ưu hóa về độ bền cho các hoạt động cụ thể được coi là quan trọng nhưng độ trễ bổ sung có thể chấp nhận được.