Khi nào nên sử dụng cơ sở dữ liệu nosql như mongodb trên mysql?


13

Tôi chưa quen với khái niệm cơ sở dữ liệu nosql và chưa bao giờ sử dụng nó. Dựa trên những gì tôi đã đọc và một chút mà tôi đã hiểu, tôi vẫn không thấy chúng có thể đặc biệt hữu ích như thế nào nếu bạn không thể tạo tài liệu tham khảo giữa các dữ liệu, nếu không có khái niệm về khóa ngoại.

Làm thế nào tôi có thể ví dụ truy vấn một cái gì đó đơn giản như 'tìm tất cả các bình luận được đăng bởi người dùng này', 'tìm tất cả các ảnh thuộc về một thực thể album', v.v.

Các hệ thống nosql có di chuyển ra khỏi mô hình dữ liệu quan hệ tĩnh nhưng vẫn cho phép bạn theo dõi các tham chiếu như vậy không, có điều gì tương tự với các khóa ngoại mà bạn có thể sử dụng trong các truy vấn không?

Câu trả lời:


19

Công dụng chung

  • Nếu bạn có cấu trúc dữ liệu không được xác định rõ ràng tại thời điểm bạn tạo hệ thống. Tôi có xu hướng giữ các thiết lập người dùng trong nosql, ví dụ. Một ví dụ khác là một hệ thống mà người dùng cần để có thể thêm các trường khi chạy - rất đau trong RDBMS và dễ dàng trong NoQuery.

  • Nếu cấu trúc mô hình của bạn chủ yếu tập trung xung quanh một hoặc một vài đối tượng mô hình và hầu hết các mối quan hệ thực sự là các đối tượng con của các đối tượng mô hình chính. Trong trường hợp này, bạn sẽ thấy rằng bạn sẽ có khá ít nhu cầu tham gia thực tế. Tôi thấy rằng hệ thống quản lý liên hệ có thể được triển khai khá độc đáo trong nosql chẳng hạn. Một người có thể có nhiều địa chỉ, điện thoại và e-mail. Thay vì đặt chúng vào một bảng riêng biệt, tất cả chúng đều trở thành một phần của cùng một mô hình và bạn có một đối tượng một người.

  • Nếu bạn muốn hưởng lợi từ việc phân cụm dữ liệu của mình trên nhiều máy chủ thay vì có một máy chủ nguyên khối, thường được RDBMS yêu cầu.

  • Bộ nhớ đệm. Ngay cả khi bạn muốn gắn bó với RDBMS làm cơ sở dữ liệu chính của mình, việc sử dụng cơ sở dữ liệu NoQuery để lưu kết quả truy vấn hoặc lưu giữ dữ liệu, chẳng hạn như bộ đếm.

  • Lưu trữ tài liệu. Nếu bạn muốn lưu trữ các tài liệu mạch lạc, trong cơ sở dữ liệu, một số cơ sở dữ liệu NoQuery (như MongoDB) thực sự chuyên lưu trữ chúng.

Còn tham gia thì sao?

Thành thật mà nói, việc không tham gia nghe có vẻ khá đáng sợ với tôi ngay từ đầu. Nhưng mẹo là ngừng suy nghĩ trong SQL. Bạn phải thực sự suy nghĩ với đối tượng bạn có trong bộ nhớ khi bạn đang chạy ứng dụng của mình. Chúng nên được lưu ít nhiều vào cơ sở dữ liệu NoQuery khi chúng nằm trong khu vực.

Bởi vì bạn có thể lưu trữ biểu đồ đối tượng đầy đủ của mình, với các đối tượng con, hầu hết nhu cầu tham gia đều bị loại bỏ. Và nếu bạn thấy bạn cần một thứ, bạn sẽ phải cắn viên đạn và tìm nạp cả hai đối tượng và tham gia vào mã ứng dụng của mình.

May mắn thay, hầu hết các trình điều khiển có thể thực hiện việc tham gia cho bạn, nếu bạn thiết lập lược đồ của mình đúng.

Để đọc thêm, tôi thực sự khuyên Martin Fowler .


2

Tôi chắc chắn sẽ sử dụng một cơ sở dữ liệu như vậy trong các giai đoạn lập kế hoạch của một dự án (trước khi phát triển, trước cả khi thiết kế) để ghi lại dữ liệu mà cấu trúc, mối quan hệ và đặc điểm của chúng chưa được biết và phải phân tích. Tôi sẽ cố gắng làm cho mọi thứ phù hợp với một mô hình quan hệ sau đó.


2
Gì? ... Tại sao? ...
Robert Harvey

Vì vậy, trong thực tế, người ta có thể sử dụng một mô hình quan hệ cho dữ liệu mà người ta biết sẽ không thực sự thay đổi nhiều như thông tin người dùng, với tên thông thường, email, v.v., trong ví dụ mysql. Và sau đó sử dụng kết hợp với cơ sở dữ liệu nosql để xử lý dữ liệu không có cấu trúc, không đều như nhật ký hoạt động của người dùng. Sắp xếp trách nhiệm phân chia. ? Hoặc bạn có gợi ý với việc bắt đầu với cơ sở dữ liệu nosql và thực hiện di chuyển hoàn chỉnh sang mô hình quan hệ sau khi mọi thứ được đặt không?
akomada

Trong trường hợp bạn đã có dữ liệu trước khi phân tích bắt đầu, (giả sử, bạn được gọi để viết lại phần mềm điều khiển một nhà máy hiện có, nơi các cảm biến đã phun dữ liệu,) Tôi sẽ ngay lập tức bắt dữ liệu trong cơ sở dữ liệu nosql, và sau đó tôi sẽ cố gắng, nếu có thể, để phù hợp với nó trong một mô hình quan hệ. Nếu không thể, thì tôi sẽ tiếp tục với nosql.
Mike Nakis

0

Trong một số trường hợp, bạn sẽ không cần khóa ngoại. Ví dụ:

Tìm tất cả các ý kiến ​​được đăng bởi người dùng này

có thể đơn giản như tải commentsphần tài liệu tương ứng với người dùng. Điều này được gọi là không chuẩn hóa : thay vì có hai bộ có liên kết, bạn có một tài liệu và mọi thứ bạn cần đều nằm trong tài liệu. Một truy vấn, không tham gia, hiệu suất tốt hơn .

Nhưng trong một số trường hợp, điều này có thể dẫn đến sao chép dữ liệu , do đó liên kết từ tài liệu này sang tài liệu khác có thể phù hợp. Trong trường hợp này, bạn có thể quan tâm đến việc chuẩn hóa MongoDB, khóa ngoại và tham gia , trang Tham chiếu cơ sở dữ liệu và đặc biệt là tính năng DBRefs.

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.