Tôi có nên sử dụng node_load () thay vì xây dựng các truy vấn của riêng mình với db_select () không?


6

Tôi khá thoải mái với việc sử dụng các chức năng của Drupal 7 như thế nào db_select(). Mặc dù node_load()rõ ràng là rất dễ sử dụng, tôi thường thấy rằng nó trả về các trường tôi không cần và không cung cấp các trường mà tôi cần (trường cần một số joins để có được).

Do đó, việc xây dựng các truy vấn của riêng tôi có cung cấp hiệu suất tốt hơn so với sử dụng node_load()kết hợp với các truy vấn khác không? Hoặc có một số loại tăng hiệu suất mà kết quả từ việc sử dụng node_load(), có lẽ từ bộ đệm, vv?

Tôi là một chuyên gia về các vấn đề hiệu suất của MySQL, nhưng đối với tôi, việc xây dựng một truy vấn cụ thể, duy nhất tốt hơn là sử dụng nhiều truy vấn riêng lẻ chỉ lấy một phần của những gì tôi cần cuối cùng (và rất nhiều thứ tôi không ).

Câu trả lời:


13

Về mặt kỹ thuật, có, viết các db_query()tuyên bố của riêng bạn sẽ trả về dữ liệu nhanh hơn và ít chi phí hơn. Tuy nhiên, nó không thực sự là "cách Drupal" để làm việc.

node_load()cung cấp bộ đệm 'tĩnh'; nói cách khác, nếu bạn tải cùng một nút hai lần trong một yêu cầu trang, nó sẽ chỉ nhấn DB một lần.

Những gì bạn thực sự đang bỏ lỡ khi không sử dụng node_load()là tất cả các móc API và tích hợp mô-đun của bên thứ ba. Nếu bạn cần một trường CCK, hãy node_load()lấy tất cả dữ liệu đó cho bạn, trong đó một truy vấn thủ công sẽ yêu cầu rất nhiều phép nối.

Như bạn lưu ý, có rất nhiều xử lý / tải thêm đang diễn ra mà bạn có thể không cần tại thời điểm đã cho. Nếu bạn không cần dữ liệu, về mặt kỹ thuật sẽ không gây hại cho bạn nếu không có dữ liệu. Nó thực sự là tùy thuộc vào bạn nếu bạn muốn đi tuyến đường này.

Lý do lớn nhất IMO để sử dụng node_load()mặc dù bạn có thể không cần thêm dữ liệu chỉ nhằm mục đích tiêu chuẩn hóa. Bạn sẽ không phải lo lắng về những phần dữ liệu bạn có tại một thời điểm nhất định. Bạn sẽ có một nút được tải đầy đủ và sẽ có nhiều tùy chọn hơn để điều chỉnh dữ liệu khi cần thiết thông qua hook_nodeapi(). Các nhà phát triển khác nhìn vào mã của bạn sẽ có một thời gian dễ dàng hơn để hiểu những gì họ đang làm việc với. Ngoài ra, 6 tháng sau khi bạn thêm một tính năng / trường hiển thị mới, bạn sẽ không phải điều chỉnh các truy vấn của mình.

node_load chắc chắn là một tài nguyên hog, nhưng tôi đã thấy nó tốt hơn để sử dụng theo kinh nghiệm của tôi. Drupal 7 cải thiện đáng kể tình hình bằng cách cung cấp node_load_mult Môn (), như tên gọi của nó, làm giảm số lượng truy vấn khi tải nhiều nút.


Các lý do chính để sử dụng node_load()là khả năng tương thích với các phiên bản tương lai của Drupal và tích hợp với các mô-đun khác, có thể thay đổi kết quả trả về từ chức năng. Đối với điểm đầu tiên, điều đó thể hiện rõ với Drupal 7: Truy vấn để có được một đối tượng nút hoàn chỉnh khá khác biệt, so với truy vấn được sử dụng trên Drupal 6; nó cũng thay đổi các bảng cơ sở dữ liệu liên quan đến truy vấn.
kiamlaluno

Tôi cũng sẽ nói thêm rằng trong trường hợp phun ra 1000 nút, nếu bạn không cần các hook của các mô-đun khác để giúp xây dựng đối tượng nút của mình, một câu lệnh sql khổng lồ, chắc chắn sẽ nhanh hơn nhiều. 1 chuyến đến db tham gia nhanh, truy vấn nhanh rất nhanh, trái ngược với efq để quay vòng và tải các nút lặp, php để yêu cầu các mô-đun khác móc, mỗi nid có chuyến đi tích hợp vào db (cho bộ đệm hoặc xây dựng) và php để xử lý từng cái trên đường ra. Ngứa bạn
texas-bronius

5

Như đã giải thích trong câu trả lời của jakarska, node_load()hãy node_load_mutliple()làm nhiều hơn là chỉ truy vấn DB. Họ đảm nhiệm việc gọi tất cả các hook xây dựng nút được triển khai bởi các mô-đun được kích hoạt của trang web của bạn.

Ngoài ra, trong Drupal 7, với việc giới thiệu kho lưu trữ trường có thể cắm được , khi làm việc với mã có thể sử dụng lại, bạn không thể biết liệu dữ liệu trường của bạn có khả dụng trong cơ sở dữ liệu (chính) của bạn hay không. Theo nguyên tắc chung, tôi sẽ sử dụng node_load(), node_load_mutliple()EntityFieldQueryđể truy vấn cho các nút. Nếu bạn chỉ cần một trường cụ thể cho nhiều nút, bạn cũng có thể sử dụng field_attach_load()với $options['field_id']kết quả của một EntityFieldQuery.

Vì vậy, tôi sẽ không đi cho một truy vấn SQL tùy biến trừ khi mã chắc chắn sẽ được sử dụng trong trường hợp tất cả những gì node_load(), node_load_mutliple()EntityFieldQuerycung cấp không phải là, và sẽ không bao giờ có, cần thiết và trên dữ liệu đó là, và sẽ luôn luôn, được lưu trữ trong cơ sở dữ liệu SQL.


1

node_load()là "cách Drupal"; điều đó có nghĩa là, bằng cách gọi hàm này, API sẽ gửi thông báo đến các mô-đun khi quá trình tải nút đã bắt đầu, vì vậy chúng có thể thêm / thay đổi / xóa thông tin của riêng chúng. Có, thậm chí node_load()sử dụng bộ nhớ đệm, vì nó sử dụng rất nhiều truy vấn.
Bạn có thể sử dụng db_select()để chọn dữ liệu cụ thể, nhưng hãy chắc chắn rằng bạn thu thập / thay đổi / xóa dữ liệu chính xác.


0

Bạn có thể cẩn thận xây dựng chế độ xem để lọc và liên hệ những gì bạn muốn và sau đó sử dụng hàm view_get_view_result () để nhận kết quả.

Và bằng cách cẩn thận, tôi có nghĩa là bạn chỉ sử dụng các lĩnh vực bạn cần. Ví dụ: bao gồm một trường của tiêu đề nút có liên kết đến nút của nó sẽ làm cho truy vấn của bạn dài hơn đáng kể trong các lượt xem thay vì chỉ sử dụng id nút mà không có liên kết.

Lượt xem là một trình xây dựng truy vấn mạnh mẽ và sử dụng nó theo lập trình có thể là một câu trả lời tốt cho vấn đề của bạn. Bạn có thể có được điều tốt nhất của cả hai thế giới: các truy vấn dễ dàng thân thiện với Drupal và kết quả nhanh hơn so với việc tải tất cả dữ liệu từ một thực thể cụ thể.

Bạn phải định cấu hình mô-đun khung nhìn của mình để xem các truy vấn được tạo khi xây dựng nó. Ngoài ra, bạn có thể thấy hữu ích khi đặt tên hoặc gắn thẻ các quan điểm của mình là "hệ thống" hoặc một cái gì đó tương tự, để tránh ghi đè không mong muốn.

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.