web-dev-qa-db-ja.com

db_select()で独自のクエリを作成するのではなく、node_load()を使用する必要がありますか?

Drupal db_select()のような7つの関数を使用することにかなり慣れています。node_load()は明らかに非常に使いやすいですが、フィールドを返すことがよくあります私は必要ありませんし、必要なフィールド(取得するためにjoinsを必要とするフィールド)を提供していません。

したがって、独自のクエリを作成すると、他のクエリと組み合わせてnode_load()を使用するよりもパフォーマンスが向上しますか?または、おそらくキャッシュなどにより、node_load()を使用することにより、何らかのパフォーマンスの向上がありますか?

私はMySQLのパフォーマンス問題の専門家とはほど遠いですが、最終的に必要なものの一部のみを個別に取得する複数のクエリを使用するよりも、単一の特定のクエリを構築する方が良いようです(そして私が必要としないものの多く) )。

6
maxedison

技術的には、はい。独自のdb_query()ステートメントを作成すると、データがより速く、オーバーヘッドも少なくなります。しかし、それは実際に物事を行うための「Drupalな方法」ではありません。

node_load()は「静的」キャッシュを提供します。つまり、1つのページ要求で同じノードを2回ロードすると、DBに1回しかヒットしません。

node_load()を使用しないことで実際に見逃しているのは、すべてのAPIフックとサードパーティモジュールの統合です。 CCKフィールドが必要な場合は、node_load()がすべてのデータを取得します。手動のクエリでは、多くの結合が必要になります。

お気づきのように、現時点では必要のない追加の処理/ロードが数多く行われています。データが必要ない場合でも、技術的にデータを持たなくても害はありません。このルートに行きたいかどうかはあなた次第です。

IMOがnode_load()を使用する最大の理由は、追加のデータが必要ない場合でも、標準化のためだけです。特定の時点でどのようなデータがあるかを気にする必要はありません。完全に読み込まれたノードがあり、hook_nodeapi()を介して必要に応じてデータを調整するためのオプションがさらにあります。あなたのコードを見る他の開発者は、彼らが何を使っているのかを理解するのにより簡単な時間を費やすでしょう。また、6か月後に新しい機能/表示フィールドを追加すると、クエリを調整する必要がなくなります。

node_loadは間違いなくリソースを独占しますが、私の経験ではそれを使用する方が良いことがわかりました。 Drupal 7は、node_load_multiple()を提供することで状況を大幅に改善します。これは、その名前が示すように、複数のノードをロードするときのクエリの数を減らします。

13
jakraska

Jakarskaの回答で説明されているように、 node_load()node_load_mutliple() はDBクエリだけではありません。彼らはあなたのサイトの有効なモジュールによって実装されたすべてのnode buildingフックの呼び出しを処理します。

また、Drupal 7の pluggable field storages の導入により、再利用可能なコードで作業している場合、フィールドデータかどうかがわかりません) (メイン)データベースで利用できるようになります。原則として、node_load()node_load_mutliple()および EntityFieldQuery を使用して、ノード。複数のノードの特定のフィールドのみが必要な場合は、_ field_attach_load() を_$options['field_id']_とともにEntityFieldQueryの結果に使用することもできます。

したがって、node_load()node_load_mutliple()およびEntityFieldQueryが提供するすべてのものが提供されない場合にコードが確実に使用されない限り、カスタムSQLクエリを実行しません、および必要になることはなく、SQLデータベースに保存されるデータに保存されます。

5
Pierre Buyle

node_load()は「Drupalの方法」です。つまり、この関数を呼び出すことにより、ノードの読み込みが開始されたときにAPIがモジュールにメッセージを送信するため、これらのモジュールは独自の情報を追加/変更/削除できます。はい、node_load()でも多くのクエリを使用するため、キャッシュを使用します。
具体的なデータの選択にはdb_select()を使用できますが、正しいデータを収集/変更/削除してください。

1
Nikit

ビューを注意深く作成して、必要なものをフィルタリングして関連付け、views_get_view_result()関数を使用して結果を取得できます。

そして注意深く言うと、必要なフィールドだけを使用するということです。たとえば、そのノードへのリンクを持つノードタイトルのフィールドを含めると、リンクなしでノードIDのみを使用する代わりに、ビューでのクエリがかなり長くなります。

Viewsは強力なクエリビルダーであり、プログラムで使用すると問題を解決するのに役立ちます。 Drupalを使用した簡単なクエリと、特定のエンティティからすべてのデータをロードするよりも高速な結果が得られます。

作成時に生成されたクエリを表示するには、ビューモジュールを構成する必要があります。また、望ましくないオーバーライドを回避するために、ビューに「システム」などの名前を付けたり、タグを付けたりすると便利です。

0
Beto Aveiga