Khi nào thì ai đó sẽ sử dụng MongoDB (hoặc tương tự) trên DBMS quan hệ?


134

Tôi có một chút bối rối về toàn bộ điều NoQuery và như vậy. Khi nào bạn sẽ chọn sử dụng một cái gì đó như MongoDB trên một cái gì đó như Oracle hoặc MySQL? Tôi không thực sự hiểu "sự khác biệt" khi sử dụng giữa chúng.

Theo hiểu biết của tôi, cơ sở dữ liệu loại NoQuery không có nghĩa là để thay thế RDBMS, nhưng chính xác thì chúng có nghĩa là gì?


Bạn đã đọc những gì? Bạn có thể cung cấp báo giá hoặc liên kết hoặc một số nền tảng cho chúng tôi? Chúng tôi không biết bạn biết bao nhiêu - hoặc không biết.
S.Lott

3
Cho đến khi / trừ khi chúng được chuyển đến đây, có một số câu hỏi rất giống nhau trên StackOverflow , bao gồm Khi nào nên sử dụng MongoDB hoặc các hệ thống cơ sở dữ liệu hướng tài liệu khác?
Nicole

1
Đây là web quy mô mongodb-is-web-scale.com / s
Froome

3
Một cách hoài nghi: Bởi vì đó là một từ cường điệu và nhiều người thích theo dõi cường điệu.
Sjoerd

@Pace: Tôi nghĩ rằng sẽ rất khó để đánh bại bài đăng này .
Robert Harvey

Câu trả lời:


34

Tôi đã sử dụng CouchDB trước đây cho ba dự án vật nuôi.

  • Một hệ thống blog vi mô.
  • Để lưu thông tin cho một ghi chú nhỏ dùng ứng dụng tôi đã thực hiện.
  • Một ứng dụng động não mục đích chung.

Lý do chính tại sao tôi chọn cái này hơn MSSQL hoặc MySQL là tính linh hoạt bạn có được khi sử dụng nó. Không có lược đồ cứng nhắc. Nếu ba tháng xuống dòng bạn cần một bảng nhất định để có thêm một trường, và cái này và cái kia, bạn chỉ cần thay đổi nó và nó gợn lên từ đó ra.

Tôi đã sử dụng Beginning CouchDB by Apress để tìm hiểu cách sử dụng nó.

Ví dụ, CouchDB sử dụng json để liên lạc đến / từ cơ sở dữ liệu. Nếu ngôn ngữ của bạn có thể POST dữ liệu, thì bạn có thể sử dụng nó để giao tiếp với DB.

Cũng đọc: Tại sao tôi nên sử dụng cơ sở dữ liệu dựa trên tài liệu thay vì cơ sở dữ liệu quan hệ? trên StackOverflow


31
Hai ví dụ đầu tiên của bạn nghe có vẻ như là một miền tốt cho DBMS quan hệ truyền thống.
Jonas

4
@yati: Loại ứng dụng này nghe có vẻ giống với StackOverflow.com và tôi thấy nó hoạt động rất tốt với cơ sở dữ liệu quan hệ truyền thống.
Jonas

4
@yatisagade: Tôi không nói về các trang xã hội năng động. Nhưng một lưu ý nhỏ về ứng dụngmột hệ thống blog vi mô .
Jonas

2
Làm thế nào không có một lược đồ được xác định bao giờ là một cộng? Với một DB quan hệ, nếu ba tháng xuống dòng bạn cần thêm một trường, bạn chỉ cần thêm trường. Với DB quan hệ, bạn không thể thêm trường một cách linh hoạt nhưng bạn cũng không thể thay đổi mã ứng dụng của mình một cách linh hoạt để hoạt động với trường được thêm động.
Bí mật của Solomonoff

12
Câu trả lời này dường như cho thấy lược đồ của cơ sở dữ liệu quan hệ không thể thay đổi. Tôi không thể hiểu được mức độ hiểu lầm nào có thể khiến ai đó tin vào điều này. Việc thêm một cột mới trong cơ sở dữ liệu quan hệ là chuyện nhỏ. Thông thường có một giao diện người dùng đẹp hoặc nếu bạn thích kịch bản nó, nó có thể được thực hiện trong một câu lệnh SQL.
JacquesB

24

Xin lỗi để thêm một câu trả lời nhưng không có câu trả lời nào ở đây rất thỏa đáng. Câu trả lời này là dành riêng cho MongoDB (trái ngược với hàng loạt các tùy chọn lưu trữ dữ liệu khác ngoài đó không phải là cơ sở dữ liệu quan hệ).

Ưu điểm:

  • MongoDB có độ trễ thấp hơn cho mỗi truy vấn & dành ít thời gian CPU hơn cho mỗi truy vấn vì nó thực hiện công việc ít hơn rất nhiều (ví dụ: không tham gia, giao dịch). Kết quả là, nó có thể xử lý tải cao hơn về mặt truy vấn mỗi giây và do đó thường được sử dụng nếu bạn có số lượng người dùng khổng lồ.
  • MongoDB dễ dàng hơn để phân chia (sử dụng trong một cụm) vì nó không phải lo lắng về các giao dịch và tính nhất quán.
  • MongoDB có tốc độ ghi nhanh hơn vì nó không phải lo lắng về các giao dịch hoặc rollback (và do đó không phải lo lắng về việc khóa).
  • MongoDB không có lược đồ trong trường hợp bạn có trường hợp sử dụng đặc biệt có thể tận dụng lợi thế đó.

Nhược điểm:

  • MongoDB không hỗ trợ giao dịch . Đây là cách nó có được hầu hết các lợi ích của nó.
  • Nói chung, MongoDB tạo ra nhiều công việc hơn (ví dụ: chi phí CPU nhiều hơn) cho máy chủ khách . Ví dụ, để tham gia dữ liệu, người ta phải đưa ra nhiều truy vấn và thực hiện phép nối trên máy khách.
  • Ngay cả ở đây vào năm 2017 cũng có ít công cụ hỗ trợ cho MongoDB hơn là dành cho các cơ sở dữ liệu quan hệ đơn giản vì nó mới hơn. Cũng có ít chuyên gia MongoDB hơn các đối tác quan hệ của họ.

Điểm thường bị hiểu sai:

  • Cả MongoDB và cơ sở dữ liệu quan hệ đều hỗ trợ lập chỉ mục. Hiệu suất truy vấn của họ tương tự nhau khi thực hiện các truy vấn lớn .
  • MongoDB không loại bỏ nhu cầu di chuyển hoặc cụ thể hơn, cập nhật dữ liệu hiện tại của bạn khi lược đồ của bạn phát triển. Ví dụ: Nếu bạn có một ứng dụng dựa vào bảng người dùng để chứa dữ liệu nhất định và bạn sửa đổi bảng đó để chứa các dữ liệu khác nhau (giả sử bạn thêm một trường ảnh hồ sơ), thì bạn vẫn sẽ cần:
    • Viết cho bạn ứng dụng để xử lý các đối tượng mà thuộc tính này không được xác định HOẶC
    • Viết di chuyển một lần để đặt giá trị mặc định cho thuộc tính này HOẶC
    • Viết mã để cung cấp một giá trị mặc định tại thời điểm truy vấn nếu trường này không có mặt HOẶC
    • Xử lý trường bị thiếu theo một số cách khác

2
Tôi đã thêm một điều rất lớn, đó là bằng cách nào đó đã bị bỏ lỡ trong nhiều cuộc thảo luận giữa NoQuery và RDBMS: Cơ sở dữ liệu NoQuery khó hơn nhiều cho truy vấn đặc biệt (đó là "phần không có SQL". Điều này đúng cho dù bạn có phải là nhà phát triển hay không. , họ cũng khó khăn hơn nhiều để tạo báo cáo , điều này rất quan trọng đối với bất kỳ doanh nghiệp nghiêm túc nào.
Michael

Heh, tôi gần như gọi đó là một tính năng cho MongoDB khi tôi không khuyến khích loại tương tác đó với cơ sở dữ liệu của mình. Tuy nhiên, Mongo có ngôn ngữ truy vấn đặc biệt và ứng dụng khách quảng cáo đồ họa (La bàn). Nó không phải là tính năng phong phú như SQL vì vậy tôi sẽ đồng ý rằng đó là một thiếu sót tiềm năng nhưng với cá nhân tôi, nó sẽ không bao giờ tạo ra sự khác biệt khi tôi quyết định sử dụng cơ sở dữ liệu nào.
Pace

1
Tại sao bạn không khuyến khích khám phá dữ liệu trong cơ sở dữ liệu của bạn? Nếu cơ sở dữ liệu này có bất kỳ thông tin hữu ích nào cho doanh nghiệp, thì nó phải dễ truy cập nhất có thể. Rõ ràng trong khi không thêm tải cho đến khi sản xuất, đó là những gì bạn đã đọc bản sao.
Michael

Đây có lẽ là một câu hỏi thú vị theo đúng nghĩa của nó và tôi tưởng tượng nhiều người sẽ có quan điểm khác nhau. Cá nhân tôi tránh nó vì nó trở thành một vấn đề bảo trì. Tôi tạo các ứng dụng web và hiển thị API REST mà tôi cam kết duy trì và tối ưu hóa cho hiệu suất. Tôi đã ở trong tình huống không thể thực hiện thay đổi bán buôn cho cơ sở dữ liệu vì nó sẽ phá vỡ quá nhiều tập lệnh truy vấn của kỹ sư bán hàng và tôi cố gắng tránh kịch bản đó ngay bây giờ. Ví dụ: tôi mới chỉ là một phần của db từ PostgreSQL sang Cassandra để có hiệu suất cao và không phải thay đổi API của mình.
Pace

Cuối cùng, bạn sẽ luôn có các bên liên quan quan tâm đến việc xem dữ liệu. Cho dù đó là thông qua truy vấn SQL hoặc một loại tập lệnh máy tính xách tay ipython hoặc thông qua re: dash. Vì vậy, khi bạn thực hiện thay đổi cơ sở dữ liệu, bạn sẽ luôn phải đảm bảo rằng bạn không phá vỡ các phụ thuộc này. SQL (không phải RDBMS) làm cho dữ liệu dễ truy cập hơn và đó là điều tốt cho doanh nghiệp.
Michael

13

Để đánh cắp một cách đáng xấu hổ từ Renesis (thực ra tôi đang thực hiện câu trả lời này CW):


Sử dụng RDBMS thay vì các loại khác:


4
"RDBMS sử dụng nhiều chỉ mục cho hiệu suất" Không phải là lập chỉ mục được sử dụng với MongoDB sao?
Rotareti

Khi nào nên sử dụng MongoDB hoặc các hệ thống cơ sở dữ liệu định hướng tài liệu khác? hiện đang bị xóa trên SO ... không còn nữa .. đã mở lại câu hỏi cũng như bảo vệ nó. Không chắc chắn lý do đằng sau xóa.
Rahul

9

Khi dữ liệu của bạn không liên quan, có thể có những lợi ích lớn cho việc sử dụng cơ sở dữ liệu NoQuery như hiệu suất và khả năng mở rộng (tất nhiên tùy thuộc vào hoàn cảnh). Một số công cụ thiết kế như CQRS giúp việc tận dụng dữ liệu phi quan hệ trong các khu vực thường yêu cầu sử dụng độc quyền cơ sở dữ liệu SQL.

Người ta thường sử dụng các cơ sở dữ liệu như mongo cho dữ liệu được lưu trữ. Ví dụ: nếu bạn cần tạo một báo cáo, bạn có thể thực hiện một truy vấn SQL phức tạp để tham gia và tổng hợp một loạt dữ liệu nhanh chóng hoặc bạn có thể lấy một tài liệu json duy nhất từ ​​cơ sở dữ liệu mongo của bạn đã có sẵn mọi thứ bạn cần để tạo báo cáo. Điều này làm cho việc đọc dữ liệu thực sự dễ dàng (và nhanh chóng!), Nhưng có thể làm cho việc ghi dữ liệu khá phức tạp (đây là lúc CQRS xuất hiện).


8

Cơ sở dữ liệu như MongoDB rất tuyệt khi bạn thường biết dữ liệu của mình ở đâu (trái ngược với việc cần phải viết một số truy vấn phức tạp). Với Mongo, dữ liệu "có liên quan" được lồng trong dữ liệu gốc hoặc nó có khóa chính / khóa ngoài. Điều này thật tuyệt nếu, ví dụ, bạn có Bài đăng và Nhận xét; nói chung, bạn sẽ không hiển thị các bình luận bên ngoài ngữ cảnh của một bài đăng, do đó, có ý nghĩa rằng các bình luận được chứa trong một bài đăng (theo cách đó bạn có được tất cả các bình luận cho bài đăng mà không cần phải truy vấn một bảng riêng biệt).

MongoDB là schemaless. Điều này có nghĩa là nó sẽ lấy bất kỳ cấu trúc dữ liệu nào bạn ném vào nó, đối với hầu hết các phần.

Mặt khác, nếu bạn cần sử dụng các hàm tổng hợp và cảm thấy cần phải truy vấn dữ liệu theo những cách phức tạp không thể đạt được thông qua các nhúng hoặc quan hệ đơn giản trong Mongo, đó là khi bạn biết đã đến lúc sử dụng RDBMS như MySQL hoặc PostgreQuery.

MongoDB không có nghĩa là để thay thế SQL. Nó chỉ đơn giản đáp ứng các nhu cầu khác nhau và MongoDB và RDBMS có thể được sử dụng cùng nhau. Theo tôi, MongoDB không phải là tất cả những gì cần thiết nếu bạn không cần dữ liệu của mình linh hoạt hoặc được nhúng trong tài liệu gốc. Phát triển với MongoDB rất thú vị vì có rất ít bước liên quan đến việc đưa một dự án (nói trong Rails) lên và chạy. Cần phải thay đổi? Không vấn đề gì. Chỉ cần thêm một thuộc tính cho mô hình của bạn. Làm xong.

Tôi không thể nói cho nhiều cơ sở dữ liệu NoQuery khác, mặc dù tôi biết rằng chúng thường được thiết kế tương tự để đáp ứng một nhu cầu cụ thể mà RDBMS không thể đáp ứng. Một số cư trú hoàn toàn trong bộ nhớ hoặc có thể được chia nhỏ hoặc thu nhỏ rất dễ dàng. Tôi khá chắc chắn rằng Cassandra được thiết kế để tiếp tục hoạt động mà không mất dữ liệu nếu một nút bị hỏng. Redis về cơ bản là một kho lưu trữ giá trị chính nằm trong bộ nhớ (với việc ghi đĩa định kỳ để duy trì), nhưng cũng có khả năng lưu trữ các loại dữ liệu như bộ và sắp xếp chúng.


6

Chiến thắng chính là khi bạn muốn bảo vệ dữ liệu hoặc có nhiều cơ sở dữ liệu chính. Bạn có thể hủy dữ liệu trong MySQL nhưng nó biến thành một nỗi đau lớn. Nếu bạn đang viết nhiều, việc phân chia dữ liệu trên nhiều máy chủ thường rất hữu ích, vấn đề là nếu bạn muốn có tính nhất quán tham chiếu mạnh trong khi thực hiện việc này thì có thể rất khó nếu không tìm kiếm định lý CAP.

Cơ sở dữ liệu SQL có tính nhất quán rất tốt nhưng hỗ trợ phân vùng thực sự xấu, cơ sở dữ liệu NoQuery có xu hướng đi theo hướng khác. Dễ dàng phân vùng nhưng thường được gọi là tính nhất quán cuối cùng. Nếu bạn đang xây dựng một trang web nhắn tin ổn, đối với một ngân hàng có lẽ không ổn.

Điểm cộng là hiện tại có nhiều mô hình về cách lưu trữ dữ liệu để có sự lựa chọn trong cách bạn triển khai công cụ, trong khi trước tất cả những gì bạn có là cơ sở dữ liệu SQL.

SE Radio đã có một vài tập hay về chủ đề này.


Cần phải nhớ rằng shending phụ thuộc rất nhiều vào kiến ​​trúc của trung tâm dữ liệu của bạn. Nếu bạn có một giá đỡ máy chủ thì hiệu suất của nó là tuyệt vời. Trên các DC phân tán, không quá nhiều. Đồng ý với những gì bạn nói về sự dễ dàng chung của việc chia tay trên DB NoSql - nhưng độ tin cậy nhưng là mối quan tâm chính.
Apoorv Khurasia

Nếu bạn viết nhiều, bạn có thể chỉ cần có 2 mô hình: một mô hình đọc chỉ mục không chuẩn hóa và mô hình ghi không được lập trình. Nhân rộng tự nhiên là cần thiết mà thêm phức tạp. Bạn sẽ phải đánh giá điều gì bất lợi hơn cho bạn: đối phó với các hạn chế của NoQuery, tức là tự mình làm việc lập trình nhiều hơn để khớp các bản ghi trong miền java hoặc công nghệ sao chép DB hiện có làm việc hoặc bạn sẽ tốn nhiều chi phí hơn về các điều khoản của cấu hình và phần cứng.
Lawrence

1

MongoDB hoạt động tốt khi bạn viết nhiều dữ liệu và khi nhu cầu truy vấn của bạn không quá phức tạp. Do đó, MongoDB rất phù hợp khi bạn triển khai CQRS với Tìm kiếm sự kiện ở phía Lệnh - tức là cửa hàng sự kiện của bạn là cơ sở dữ liệu MongoDB.

Về phía truy vấn, chúng tôi vẫn sử dụng db SQL Server với các khung nhìn và Dịch vụ dữ liệu WCF trên đầu, vì tính linh hoạt của nó. Tôi nghĩ rằng trong hầu hết các trường hợp, bạn sẽ thực sự cần sức mạnh của một DB quan hệ để truy vấn.


Nếu bạn viết nhiều dữ liệu sẽ không khóa ghi toàn cầu ảnh hưởng tiêu cực đến bạn?
Apoorv Khurasia

1
Lưu ý rằng Mongodb không còn sử dụng khóa ghi toàn cầu (và đã được cập nhật để không yêu cầu khóa khi nhận xét trên được đăng).
Jules

1

Sự khác biệt cơ bản và ngay lập tức giữa MongoDB và RDBMS là mô hình dữ liệu cơ bản. Một cơ sở dữ liệu quan hệ cấu trúc dữ liệu thành các bảng và hàng, trong khi MongoDB cấu ​​trúc dữ liệu thành các bộ sưu tập tài liệu JSON. JSON là một định dạng dữ liệu tự mô tả, có thể đọc được của con người. Được thiết kế ban đầu để trao đổi nhẹ giữa trình duyệt và máy chủ, nó đã được chấp nhận rộng rãi cho nhiều loại ứng dụng.

Tài liệu JSON đặc biệt hữu ích cho việc quản lý dữ liệu vì nhiều lý do. Một tài liệu JSON bao gồm một tập hợp các trường mà chính chúng là các cặp khóa-giá trị. Điều này có nghĩa là mỗi tài liệu JSON mang thiết kế lược đồ có thể đọc được của con người với nó mọi lúc mọi nơi, cho phép các tài liệu dễ dàng di chuyển giữa cơ sở dữ liệu và ứng dụng khách mà không làm mất ý nghĩa của chúng.

JSON cũng là một định dạng dữ liệu tự nhiên để sử dụng trong lớp ứng dụng. JSON hỗ trợ cấu trúc dữ liệu phong phú và linh hoạt hơn các bảng được tạo thành từ các cột và hàng. Ngoài việc hỗ trợ các loại trường như số, chuỗi, Boolean, v.v., các trường JSON có thể là mảng hoặc các đối tượng con lồng nhau. Điều này có nghĩa là chúng ta có thể biểu diễn một tập hợp các quan hệ tinh vi, đại diện gần hơn cho các đối tượng mà ứng dụng của chúng ta làm việc với. Sử dụng các tài liệu JSON trong cơ sở dữ liệu của chúng tôi có nghĩa là chúng tôi không cần một trình ánh xạ quan hệ đối tượng giữa cơ sở dữ liệu của chúng tôi và các ứng dụng mà nó phục vụ. Chúng tôi có thể duy trì dữ liệu của mình ở dạng đúng


1

Nếu dữ liệu của bạn cần nhiều truy vấn thì giải pháp NoQuery không tốt và khi bạn cần hỗ trợ giao dịch (ACID) thì NoSql không phù hợp nhất. Tôi nghĩ NoQuery tỏa sáng khi bạn có rất nhiều lần đọc cần phải nhanh và khi cấu trúc có phần adhoc, bạn truy xuất bằng tài liệu hoặc theo cấu trúc trang, đại loại như thế. Nhưng rất nhiều giải pháp NoQuery cải thiện rất nhiều khá nhanh nên những thiếu sót có thể sẽ sớm biến mất. Dù sao, tôi nghĩ rằng cơ sở dữ liệu quan hệ vẫn phù hợp với hầu hết các ứng dụng.

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.