Ưu điểm của việc sử dụng cơ sở dữ liệu không có lược đồ như MongoDB so với cơ sở dữ liệu quan hệ là gì?


95

Tôi đã quen với việc sử dụng cơ sở dữ liệu quan hệ như MySQL hoặc PostgreSQL và kết hợp với các khung công tác MVC như Symfony, RoR hoặc Django và tôi nghĩ nó hoạt động rất tốt.

Nhưng gần đây tôi đã nghe nói nhiều về MongoDB, một cơ sở dữ liệu phi quan hệ, hoặc để trích dẫn định nghĩa chính thức ,

một cơ sở dữ liệu hướng tài liệu, hiệu suất cao, có thể mở rộng, hiệu suất cao, không có lược đồ.

Tôi thực sự quan tâm đến việc đi trước và muốn biết tất cả các lựa chọn tôi sẽ có cho một dự án tiếp theo và chọn những công nghệ tốt nhất hiện có.

Trong trường hợp nào sử dụng MongoDB (hoặc các cơ sở dữ liệu tương tự) tốt hơn so với việc sử dụng cơ sở dữ liệu quan hệ "cổ điển"? Và lợi thế của MongoDB vs MySQL nói chung là gì? Hoặc ít nhất, tại sao nó lại khác biệt như vậy?

Nếu bạn có con trỏ đến tài liệu và / hoặc ví dụ, nó cũng sẽ giúp ích rất nhiều.

Câu trả lời:


57

Dưới đây là một số lợi thế của MongoDB để xây dựng các ứng dụng web:

  1. Một mô hình dữ liệu dựa trên tài liệu. Đơn vị lưu trữ cơ bản tương tự như JSON, từ điển Python, hàm băm Ruby, v.v. Đây là một cấu trúc dữ liệu phong phú có khả năng chứa các mảng và các tài liệu khác. Điều này có nghĩa là bạn thường có thể biểu diễn trong một thực thể duy nhất một cấu trúc sẽ yêu cầu một số bảng để biểu diễn chính xác trong một db quan hệ. Điều này đặc biệt hữu ích nếu dữ liệu của bạn là bất biến.
  2. Khả năng truy vấn sâu. MongoDB hỗ trợ các truy vấn động trên tài liệu bằng ngôn ngữ truy vấn dựa trên tài liệu gần như mạnh mẽ như SQL.
  3. Không có di chuyển giản đồ nào. Vì MongoDB là không có giản đồ, mã của bạn xác định lược đồ của bạn.
  4. Một con đường rõ ràng cho khả năng mở rộng theo chiều ngang.

Bạn sẽ cần đọc thêm về nó và chơi với nó để hiểu rõ hơn. Đây là bản demo trực tuyến:

http://try.mongodb.org/


3
Tôi đã chấp nhận câu trả lời này, nhưng hãy xem bên dưới những câu trả lời hay khác. @marcgg đã trả lời với các liên kết thú vị chẳng hạn.
Guillaume Flandre

Nói "hiệu suất tốt hơn" là gây hiểu lầm; nó phụ thuộc vào những gì bạn đang làm. MongoDB không hỗ trợ tham gia không làm cho nó nhanh hơn, nó chỉ có nghĩa là nó tốt hơn trong các hoạt động DB đơn giản (được cho là, tôi thực sự chưa thấy một điểm chuẩn để chứng minh điều này). Khi bạn cần chức năng mà các tham gia cung cấp, hiệu suất của bạn với Mongo sẽ giảm mạnh. Nhưng nếu bạn không cần tham gia hoặc các tính năng quan hệ, thì chắc chắn, Mongo có thể hoạt động hiệu quả hơn / có thể mở rộng hơn.
Sasha Chedygov

Cảm ơn @SashaChedygov. Tôi đồng ý với bạn. Điều đó khá luộm thuộm với tôi của năm 2010 :)
Kyle Banker

@KyleBanker: Đừng lo lắng, chỉ cần bình luận trong trường hợp ai đó nhìn thấy nó vào năm 2013 và hiểu sai ý. :) +1 cho bản chỉnh sửa.
Sasha Chedygov

Mongo cung cấp một đường dẫn rất cụ thể về khả năng mở rộng theo chiều ngang, rất hữu ích trong các tình huống cụ thể ....
AK_ 26/09

23

Có rất nhiều lợi thế.

Ví dụ: lược đồ cơ sở dữ liệu của bạn sẽ có khả năng mở rộng cao hơn, bạn sẽ không phải lo lắng về việc di chuyển, mã sẽ dễ viết hơn ... Ví dụ đây là một trong những mã của mô hình của tôi:

class Setting
  include MongoMapper::Document

  key :news_search, String, :required => true
  key :is_availaible_for_iphone, :required => true, :default => false

  belongs_to :movie
end

Thêm khóa chỉ là thêm một dòng mã!

Ngoài ra còn có những lợi thế khác sẽ xuất hiện trong thời gian dài, như khả năng quay và tốc độ tốt hơn.

... Nhưng hãy nhớ rằng cơ sở dữ liệu không quan hệ không tốt hơn cơ sở dữ liệu quan hệ . Nếu cơ sở dữ liệu của bạn có nhiều mối quan hệ và chuẩn hóa, thì việc sử dụng một cái gì đó như MongoDB có thể không có ý nghĩa gì. Đó là tất cả về việc tìm kiếm công cụ phù hợp cho công việc.

Để biết thêm những điều cần đọc, tôi khuyên bạn nên xem " Tại sao tôi nghĩ Mongo là đối với Cơ sở dữ liệu mà Rails là đối với Khung công tác " hoặc bài đăng này trên trang web mongodb. Để trở nên hào hứng và nếu bạn nói được tiếng Pháp, hãy xem bài viết này giải thích cách thiết lập MongoDB từ đầu.

Chỉnh sửa: Tôi gần như quên nói với bạn về railscast này của Ryan . Nó rất thú vị và khiến bạn muốn bắt đầu ngay lập tức!


Rilscast này có vẻ thực sự thú vị; sẽ xem xét nó, hy vọng tôi sẽ hiểu rõ hơn về cách hoạt động của nó.
Guillaume Flandre

5

Ưu điểm của schema-free là bạn có thể kết xuất bất cứ thứ gì tải của bạn trong đó và không ai có cơ sở để phàn nàn về nó hoặc nói rằng nó đã sai.

Nó cũng có nghĩa là bất cứ thứ gì bạn đổ vào đó, sẽ hoàn toàn vô nghĩa sau khi bạn đã làm như vậy.

Một số cho rằng đó là một bất lợi hoàn toàn, một số khác thì không.

Thực tế là cơ sở dữ liệu quan hệ có một lược đồ được thiết lập tốt, là kết quả của việc nó có một tập hợp các vị từ mở rộng được thiết lập tốt, cho phép chúng ta gắn ý nghĩa với những gì được ghi trong cơ sở dữ liệu và cũng là điều kiện tiên quyết cần thiết để chúng tôi làm được điều đó.

Nếu không có một lược đồ được thiết lập tốt, không có các vị từ mở rộng và không có các phân khu mở rộng, thì không có cách nào để người dùng hiểu được bất kỳ ý nghĩa nào từ những gì được nhồi vào đó.


1
Đây thực sự là một câu trả lời chống. Hầu hết ý nghĩa, như hầu hết mọi người đều hiểu, không chỉ xuất phát từ các khái niệm quan hệ. Trên thực tế, hầu hết các nhà phát triển ứng dụng khó phân biệt được ý nghĩa của một lược đồ được chuẩn hóa cao hơn là đối với một kho tài liệu.
user1020853 Ngày

1
Ý nghĩa, như logic có nó, bắt nguồn từ các mệnh đề. Các mệnh đề có thể phát sinh từ các vị từ có địa điểm miễn phí nếu và khi các địa điểm miễn phí đó được thay thế bằng các mục dữ liệu thực tế. Nhưng các mục dữ liệu đó phải đến từ một cấu trúc. Và nếu có một cấu trúc thì có một lược đồ. Do đó, nếu không có lược đồ, không có cấu trúc nào có thể phục vụ cho việc xây dựng các mệnh đề sau đó tạo ra ý nghĩa, ngoại trừ bằng cách thò ngón tay vào không trung và tạo ra một mệnh đề. Đó không phải là chống đối hay ủng hộ bất cứ điều gì, đó là một sự thật đơn giản.
Erwin Smout

3
Đó chỉ là một quan điểm về ý nghĩa và chỉ phù hợp với bối cảnh trí tuệ khá hẹp (và đó là một quan điểm triết học, không phải là một quan điểm logic). Câu trả lời của bạn về cơ bản là "nếu bạn không có lược đồ như cơ sở dữ liệu quan hệ, thì bạn không có ý nghĩa." Đó hầu như không phải là câu trả lời cho câu hỏi ban đầu về "những lợi thế là gì?" do đó tôi gọi nó là một câu trả lời phản đối. Nó cũng không thực sự đúng trừ khi chúng ta hạn chế "ý nghĩa" trong bối cảnh hẹp mà bạn đang đến. Có rất nhiều chỗ cho "nghĩa" nếu không có "lược đồ được thiết lập tốt".
user1020853 Ngày

1
Vậy còn bạn thì sao, bạn hãy cho tôi thấy cái nhìn "rộng hơn" của bạn về "ý nghĩa" là như thế nào, và nó có thể tồn tại như thế nào mà không có các vị từ hoặc mệnh đề logic. Lưu ý rằng bình luận của tôi đã không đề cập đến từ "quan hệ" một lần. Công nghệ dữ liệu tiền quan hệ có các lược đồ và do đó thích hợp để suy ra "ý nghĩa". Công nghệ tiền cơ sở dữ liệu có các lược đồ và do đó thích hợp để suy ra "nghĩa". Giản đồ không có lược đồ không có lược đồ (trừ khi phần "miễn phí" là một lời nói dối hoàn toàn) và do đó không phù hợp để suy ra "ý nghĩa". ...
Erwin Smout

1
... Schema-free buộc người dùng của nó vào một trò chơi đoán. Và ngay cả khi những người dùng đó có thể thực hiện đúng 90 hoặc 99% thời gian, thì đó vẫn chỉ là một trò chơi phỏng đoán.
Erwin Smout


3

Kinh nghiệm của tôi với Postgres và Mongo sau khi làm việc với cả hai cơ sở dữ liệu trong các dự án của tôi.

Postgres (RDBMS)

Postgres được khuyến nghị nếu các ứng dụng trong tương lai của bạn có một lược đồ phức tạp cần nhiều phép nối hoặc tất cả dữ liệu có mối quan hệ hoặc nếu chúng ta có nhiều văn bản. Postgres là mã nguồn mở, nhanh hơn, tuân thủ ACID và sử dụng ít bộ nhớ hơn trên đĩa, đồng thời hoạt động tốt cho việc lưu trữ JSON và bao gồm khả năng tuần tự hóa đầy đủ của các giao dịch với 3 cấp độ cách ly giao dịch.

Lợi thế lớn nhất của việc ở lại với Postgres là chúng tôi có cả hai thế giới tốt nhất. Chúng ta có thể lưu trữ dữ liệu vào JSONB với các ràng buộc, tính nhất quán và tốc độ. Mặt khác, chúng ta có thể sử dụng tất cả các tính năng của SQL cho các loại dữ liệu khác. Công cụ cơ bản rất ổn định và đối phó tốt với nhiều khối lượng dữ liệu. Nó cũng chạy trên sự lựa chọn của bạn về phần cứng và hệ điều hành. Postgres cung cấp khả năng NoSQL cùng với hỗ trợ giao dịch đầy đủ, lưu trữ các tài liệu JSON với các ràng buộc về dữ liệu trường.

Ràng buộc chung cho Postgres

Chia tỷ lệ Postgres Theo chiều ngang khó hơn đáng kể, nhưng có thể làm được.

Các thao tác đọc nhanh không thể đạt được đầy đủ với Postgres.

KHÔNG có cơ sở dữ liệu SQL

Mongo DB (Hổ có dây)

MongoDB có thể đánh bại Postgres theo kích thước “tỷ lệ ngang”. Lưu trữ JSON là những gì Mongo được tối ưu hóa để làm. Mongo lưu trữ dữ liệu của nó ở định dạng nhị phân gọi là BSONb, (đại khái) chỉ là một biểu diễn nhị phân của một tập siêu JSON. MongoDB lưu trữ các đối tượng chính xác như khi chúng được thiết kế. Theo MongoDB, đối với các ứng dụng đòi hỏi nhiều khả năng ghi, Mongo cho biết công cụ mới (Wired Tiger) giúp người dùng tăng hiệu suất ghi lên đến 10 lần (tôi nên thử điều này), với việc giảm 80% việc sử dụng bộ nhớ, giúp giảm chi phí lưu trữ. , đạt được hiệu quả sử dụng phần cứng cao hơn.

Những hạn chế chung của MongoDb

Việc sử dụng một công cụ lưu trữ ít lược đồ dẫn đến vấn đề về các lược đồ ngầm. Các lược đồ này không được công cụ lưu trữ của chúng tôi xác định nhưng thay vào đó được xác định dựa trên hành vi và kỳ vọng của ứng dụng.

Các công nghệ NoSQL độc lập không đáp ứng các tiêu chuẩn ACID vì chúng hy sinh các biện pháp bảo vệ dữ liệu quan trọng để có hiệu suất thông lượng cao cho các ứng dụng phi cấu trúc. Không khó để áp dụng ACID trên cơ sở dữ liệu NoSQL nhưng nó sẽ làm cho cơ sở dữ liệu chậm và không linh hoạt ở một mức độ nào đó. “Hầu hết các hạn chế của NoSQL đã được tối ưu hóa trong các phiên bản và bản phát hành mới hơn, chúng đã khắc phục được những hạn chế trước đây của nó ở mức độ lớn”.


2

Đó là tất cả về sự đánh đổi. MongoDB nhanh nhưng không phải ACID, nó không có giao dịch. Nó tốt hơn MySQL trong một số trường hợp sử dụng và tệ hơn ở những trường hợp khác.


Hãy xem lại bình luận này ngay bây giờ. MongoDb 4.0 hiện hỗ trợ các giao dịch axit.
Anant Simran Singh

1

Những dòng dưới đây được viết bằng MongoDB: Hướng dẫn cuối cùng.

Có một số lý do chính đáng:

  1. Giữ các loại tài liệu khác nhau trong cùng một bộ sưu tập có thể là một cơn ác mộng đối với các nhà phát triển và quản trị viên. Các nhà phát triển cần đảm bảo rằng mỗi truy vấn chỉ trả về các tài liệu thuộc một loại nhất định hoặc mã ứng dụng thực hiện truy vấn có thể xử lý các tài liệu có hình dạng khác nhau. Nếu chúng tôi đang truy vấn các bài đăng trên blog, thì thật rắc rối khi loại bỏ các tài liệu chứa dữ liệu tác giả.
  2. Việc lấy danh sách các bộ sưu tập nhanh hơn nhiều so với trích xuất danh sách các loại trong một bộ sưu tập. Ví dụ: nếu chúng tôi có một khóa loại trong bộ sưu tập cho biết mỗi tài liệu là tài liệu “đọc lướt”, “toàn bộ” hay “chú khỉ con”, thì việc tìm ba giá trị đó trong một bộ sưu tập sẽ chậm hơn nhiều so với có ba bộ sưu tập riêng biệt và truy vấn tên của chúng
  3. Nhóm các tài liệu cùng loại với nhau trong cùng một tập hợp cho phép định vị dữ liệu. Nhận một số bài đăng trên blog từ một bộ sưu tập chỉ chứa các bài đăng có thể sẽ yêu cầu ít lần tìm đĩa hơn so với việc lấy các bài đăng tương tự từ một bộ sưu tập bao gồm các bài đăng và dữ liệu tác giả.
  4. Chúng tôi bắt đầu áp đặt một số cấu trúc vào tài liệu của mình khi chúng tôi tạo chỉ mục. (Điều này đặc biệt đúng trong trường hợp chỉ mục duy nhất.) Các chỉ mục này được xác định cho mỗi tập hợp. Bằng cách chỉ đặt các tài liệu của một loại duy nhất vào cùng một bộ sưu tập, chúng tôi có thể lập chỉ mục các bộ sưu tập của mình hiệu quả hơn

0

Sau khi đặt câu hỏi về cơ sở dữ liệu có lưu trữ dạng văn bản), tôi liếc qua MongoDB và các hệ thống tương tự.
Nếu tôi hiểu đúng, chúng được cho là dễ sử dụng và thiết lập hơn, và nhanh hơn nhiều. Có lẽ cũng an toàn hơn vì việc thiếu SQL ngăn chặn việc tiêm SQL ...
Rõ ràng, MongoDB được sử dụng chủ yếu cho các ứng dụng Web.
Về cơ bản, và họ tuyên bố rằng bản thân, các cơ sở dữ liệu này không phù hợp với các truy vấn phức tạp, khai thác dữ liệu, v.v. Nhưng chúng tỏa sáng trong việc truy xuất nhanh chóng nhiều dữ liệu phẳng.


1
Có một vài quan niệm sai lầm trong câu trả lời của bạn. Mặc dù MongoDB không dễ bị tiêm SQL nhưng nhìn chung nó dễ bị tiêm vào. Bạn có thể chỉ định Javascript tùy ý trong mệnh đề $ where của một truy vấn. Ngoài ra, không giống như nhiều tùy chọn NoSQL khác, MongoDB thực sự có thể thực hiện một số truy vấn khá phức tạp.
Emily

Cảm ơn vì sự lựa chọn. Lưu ý rằng, như tôi đã nêu, chính trang MongoDB đã đưa ra các hạn chế đối với các truy vấn quan hệ. Trừ khi tôi hiểu lầm cái gì khác ...
PhiLho

Có vẻ như họ cho biết MongoDB không phù hợp với các truy vấn quan hệ phức tạp, nhưng đối với các truy vấn không quan hệ phức tạp, nó khá phù hợp. Hãy xem mongodb.org/display/DOCS/Advanced+Queries để biết một số điều thú vị mà bạn có thể làm.
Emily

0
  1. MongoDB hỗ trợ tìm kiếm theo trường, tìm kiếm biểu thức chính quy, bao gồm các hàm tập lệnh java do người dùng định nghĩa.
  2. MongoDB có thể được sử dụng như một hệ thống tệp, tận dụng các tính năng cân bằng tải và sao chép dữ liệu trên nhiều máy để lưu trữ tệp.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.