NoQuery so với các thiết lập Drupal SQL khác


14

Những lợi thế của việc chạy NoQuery (ex MongoDB) so với MySQL, PostGRE SQL hoặc MSSQL trong Drupal là gì? Là những lợi thế có được từ việc sử dụng lưu trữ đơn giản hay một số cấu hình Drupal cần phải thay đổi?


Đây là một câu hỏi mà Károly Négyesi sẽ đưa ra câu trả lời "có thẩm quyền". Anh ta chắc chắn biết lợi thế của việc sử dụng MongoDB với Drupal.
kiamlaluno

Đọc suy nghĩ của tôi .. rất quan tâm đến các lựa chọn khác nếu có lợi ích đáng kể, và tất nhiên các ưu điểm đi kèm với khuyết điểm.
Kevin

Câu trả lời:


13

MongoDB có thể được sử dụng để lưu trữ hầu hết hoặc tất cả các thực thể của bạn vào bộ lưu trữ hướng tài liệu nhanh. Loại lưu trữ này chia tỷ lệ tốt hơn so với lưu trữ dựa trên SQL tiêu chuẩn mà chúng ta có trong lõi Drupal (dựa trên lược đồ "một bảng trên mỗi trường").

Trong trạng thái hiện tại của Drupal 7, bạn sẽ có:

  • Bảng cơ sở của thực thể được lưu trữ trên SQL (ví dụ: bảng người dùng, bảng nút, v.v.)
  • Tất cả các trường được lưu trữ trong SQL
  • Các thuộc tính của các thực thể từ các bảng cơ sở của chúng được nhân đôi trong MongoDB

Điều này cho phép truy vấn nhanh trên các thực thể trên MongoDB và khả năng thêm các chỉ mục phức tạp không hỗ trợ cơ sở dữ liệu SQL Opensource (bao gồm các chỉ mục trên các bảng). Đồng thời, bạn không mất khả năng tương tác vì bảng cơ sở của thực thể vẫn được lưu trữ trong SQL và do đó có thể được nối bởi các mô-đun vẫn chỉ có SQL (như Flag).

Kiểu truy vấn nhanh này có sẵn nhờ cơ chế EntityFieldQuery, một cách để xây dựng truy vấn trên các thực thể, thuộc tính và trường của chúng theo cách trừu tượng. Việc triển khai mặc định trong lõi dịch các truy vấn đó sang SQL, nhưng mô-đun MongoDB có triển khai đầy đủ tính năng có thể đáp ứng trực tiếp các truy vấn đó từ MongoDB.

Nhờ vào phụ trợ EntityFieldQuery cho Chế độ xem , bạn có thể dễ dàng tận dụng sức mạnh này, bằng cách sử dụng các công cụ bạn đã quen. Nhược điểm duy nhất là các mối quan hệ không được hỗ trợ (nhưng trong thực tế, bạn hiếm khi cần chúng - và điều này có thể được khắc phục bằng cách đẩy dữ liệu bổ sung vào đối tượng thực thể và thêm hiển thị chúng dưới dạng các thuộc tính bổ sung của thực thể).

Tóm lại, ngay khi hiệu suất truy vấn là một vấn đề trong dự án của bạn, điều này xảy ra ngay khi bạn có một bộ dữ liệu quan trọng (giả sử bắt đầu từ một phần mười của hàng ngàn thực thể trên một loại thực thể nhất định), MongoDB là một lợi ích ròng cho rất rất ít nhược điểm. Rất khuyến khích.


Damien Tournoud: Nếu bạn gặp vấn đề về hiệu suất chỉ với một phần mười trong số hàng ngàn mục nhập, thì có lẽ có vấn đề về lớp lót (cấu hình DBMS, truy vấn được viết kém, nó có thể là bất cứ điều gì). Nếu lược đồ SQL lót là đủ tốt, bạn không phải lo lắng trước một triệu mục trên một bảng (nhưng các trường có thể tăng nhanh nếu bạn xem xét sửa đổi và các trường đa giá trị có thể).
Pierre

Quan điểm của tôi chính xác: lược đồ của chúng tôi được chuẩn hóa và kết quả là hiệu năng truy vấn rất kém. Để cải thiện hiệu năng truy vấn, bạn cần chuẩn hóa lược đồ. Ưu điểm chính của việc sử dụng MongoDB trong trường hợp của chúng tôi là nó là một loại "công cụ khử chuẩn hóa tự động".
Damien Tournoud

Và tất nhiên, MongoDB rất tuyệt ở đây vì đây là cơ sở dữ liệu định hướng tài liệu. Lưu trữ các tài liệu phức tạp như các thực thể trong bộ lưu trữ SQL chỉ đơn giản là ngu ngốc. Đó là thực hiện mặc định của chúng tôi, nhưng nó không có nghĩa là bạn nên sử dụng nó :)
Damien Tournoud

@Pierre: Damien đã nói về một vài phần mười thực thể , có thể là một điều hoàn toàn khác so với các hàng của bảng. Ví dụ: bạn có thể có 10 trường trở lên trên thực thể đó, sau đó bạn có 10 bảng bổ sung cần được truy vấn bằng một truy vấn riêng mỗi khi thực thể đó được tải. Và MongoDB có thể thay thế các bảng bổ sung này, không phải bảng cơ sở thực thể.
Berdir

2
Không có mô-đun nên mong đợi các trường trong MySQL. Cách duy nhất để truy vấn các trường trên Drupal 7 là EntityFieldQuery. Mở một lỗi trong mô-đun nếu nó đang truy vấn trực tiếp các bảng trường. Tôi không biết bất kỳ mô-đun nào tại thời điểm này.
Tourien Damnoud

7

MongoDB và tương tự được thiết kế để lưu trữ dữ liệu có cấu trúc (phân cấp) theo cách tương đối linh hoạt.

Ví dụ Drupal 7, khi sử dụng field_sql_storage, mọi trường đều có các bảng rất riêng. Khi bạn đính kèm 10 trường vào một loại nội dung, bạn sẽ có 10 bảng trong cơ sở dữ liệu của mình. Khi bạn tải nút đó, field_sql_storagesẽ thực hiện truy vấn trên mỗi trường và trên mỗi nút (hoặc nhiều nút, khi sử dụng node_load_multiple).

Khi bạn sử dụng mongodb_field_st Storage , bạn có thể lưu trữ tất cả các trường của một nút trong một tài liệu duy nhất và nhận được với một truy vấn duy nhất.

Bạn cũng có thể lưu trữ những thứ khác như watchdog, session, cache, blocks trong MongoDB .

Tuy nhiên, bạn vẫn cần MySQL, MongoDB không thay thế nó (chỉ dành cho các phần cụ thể).

Một ưu điểm khác là nó dễ dàng hơn với MongoDB quy mô , bạn có thể thêm nhiều máy chủ vào một cụm chia sẻ dữ liệu giữa chúng.


Xin chào Berdir! Bạn có biết nếu tôi thả MongoDB trong một proyect hiện có để kiểm tra hiệu năng thì tôi có bật và tắt mô-đun mà không gây hậu quả không? Tôi muốn thử mongo, nhưng nếu nó không hoạt động hoặc cái gì đó thì sao? Có an toàn để thử? (Tôi biết bạn không thể đảm bảo điều đó nhưng tôi tự hỏi điều gì xảy ra trong hầu hết các trường hợp)
Beto Aveiga

1
Chà, để bắt đầu, bạn không thể bỏ nó vào. Mỗi trường đã định cấu hình phụ trợ lưu trữ mà nó sử dụng, bạn sẽ phải thay đổi / tạo lại các trường của mình, tạo lại chế độ xem của bạn (vì chúng cần sử dụng phụ trợ efq_view ), có thể là các truy vấn của riêng bạn nếu bạn đã viết các truy vấn trực tiếp đối với các bảng dữ liệu trường. Có thể dễ dàng hơn để tạo lại cấu trúc tương tự trong một bản cài đặt mới để so sánh ban đầu.
Berdir

Cảm ơn Berdir! Tôi đã thử MongoDB vài ngày trước nhưng hiệu suất không đáng kể, nhưng tôi cũng không nhận thức được những điều / thay đổi mà bạn đang nói với tôi ngay bây giờ. Tôi đã nghĩ "MongoDB sẽ tạo ra sự khác biệt trong các trang web lớn hơn". Tôi sẽ thử lại MongoDB.
Beto Aveiga

5

Các ưu đi kèm với khuyết điểm.

Toàn bộ Drupal không thể được chuyển sang MongoDb, vì vậy bạn sẽ phải hỗ trợ hai cơ sở dữ liệu và đảm bảo chúng hoạt động tốt với nhau.

Nhiều mô-đun sẽ không thể làm việc với mongodb, do đó bạn sẽ mất khả năng tương tác.

Trừ khi bạn có nhu cầu cấp bách (như một phần trong hệ thống của bạn không đối phó với số lượng yêu cầu / hoặc lượng dữ liệu) tôi sẽ không chuyển đổi. Và ngay cả khi bạn bắt đầu tiếp cận giới hạn, hãy nhìn vào việc ném phần cứng vào vấn đề hoặc điều chỉnh trước khi chuyển đổi.

Tôi nghĩ rằng tôi đã trả lời điều này trước đây, có một sự trùng lặp gần như trên SO

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.