it-swarm-vi.com

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

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ì?

138
user6791

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 Bắt đầu CouchDB bởi 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

34
Sergio

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ễ trên mỗi truy vấn thấp hơn và dành ít thời gian CPU hơn cho mỗi truy vấn vì nó hoạt động í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 là 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ì 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ủ máy 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 hỗ trợ công cụ hơn cho MongoDB so với 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 so với các đối tác quan hệ của họ.

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

  • 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 trên bảng người dùng để chứa một số 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
26
Pace

Để đá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:

13
Matthew Read

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ó 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).

9
Graeme Hill

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.

8
Ravenstine

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.

6
Zachary K

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.

1
Roy Dictus

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.

Các 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 người lập bản đồ 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
Diwakar upadhyay

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.

1
marko