Sollte ich node_load () verwenden, anstatt meine eigenen Abfragen mit db_select () zu erstellen?

6

Ich bin ziemlich vertraut mit Drupal 7 Funktionen wie db_select(). Obwohl node_load()es offensichtlich sehr einfach zu bedienen ist, stelle ich häufig fest, dass es Felder zurückgibt, die ich nicht benötige, und keine Felder bereitstellt, die ich benötige (Felder, joinfür deren Erhalt einige s erforderlich wären ).

Bietet das Erstellen eigener Abfragen daher eine bessere Leistung als das Verwenden node_load()in Verbindung mit anderen Abfragen? Oder gibt es eine Art Leistungssteigerung, die sich aus der Verwendung ergibt node_load(), möglicherweise aus dem Cacheing usw.?

Ich bin kein Experte für MySQL-Leistungsprobleme, aber es scheint mir, dass das Erstellen einer einzelnen, spezifischen Abfrage besser ist als die Verwendung mehrerer Abfragen, die einzeln nur einen Teil dessen abrufen, was ich letztendlich benötige (und vieles, was ich nicht brauche) ).

Maxedison
quelle

Antworten:

13

Technisch gesehen, ja, wenn Sie Ihre eigenen db_query()Anweisungen schreiben , werden die Daten schneller und mit weniger Aufwand zurückgegeben. Es ist jedoch nicht wirklich der "Drupal-Weg", Dinge zu tun.

node_load()stellt einen 'statischen' Cache bereit; Mit anderen Worten, wenn Sie denselben Knoten zweimal auf einer Seitenanforderung laden, wird er die Datenbank nur einmal treffen.

Was Sie wirklich verpassen, wenn Sie nicht verwenden, node_load()sind alle API-Hooks und die Modulintegration von Drittanbietern. Wenn Sie ein CCK-Feld benötigen, werden node_load()alle diese Daten für Sie abgerufen, wobei für eine manuelle Abfrage viele Verknüpfungen erforderlich wären.

Wie Sie bemerken, gibt es eine Menge zusätzlicher Verarbeitung / Laden, die Sie im gegebenen Moment möglicherweise nicht benötigen. Wenn Sie die Daten nicht benötigen, schadet es Ihnen technisch nicht, sie nicht zu haben. Es liegt wirklich an Ihnen, ob Sie diesen Weg gehen möchten.

Der Hauptgrund für die Verwendung von IMO, node_load()obwohl Sie die zusätzlichen Daten möglicherweise nicht benötigen, ist nur zum Zweck der Standardisierung. Sie müssen sich keine Gedanken darüber machen, welche Daten Sie zu einem bestimmten Zeitpunkt haben. Sie haben einen vollständig geladenen Knoten und mehr Optionen zum Anpassen der Daten nach Bedarf durch hook_nodeapi(). Andere Entwickler, die sich Ihren Code ansehen, können leichter verstehen, womit sie arbeiten. Außerdem müssen Sie 6 Monate später, wenn Sie ein neues Feature / Anzeigefeld hinzufügen, Ihre Abfragen nicht anpassen.

node_load ist definitiv ein Ressourcenfresser, aber ich habe es meiner Erfahrung nach besser gefunden. Drupal 7 verbessert die Situation erheblich, indem node_load_multiple () bereitgestellt wird, was, wie der Name schon sagt, die Anzahl der Abfragen beim Laden mehrerer Knoten verringert.

Jakraska
quelle
Die Hauptgründe für die Verwendung node_load()sind die Kompatibilität mit zukünftigen Versionen von Drupal und die Integration mit anderen Modulen, wodurch das von der Funktion zurückgegebene Ergebnis geändert werden kann. Was den ersten Punkt betrifft, so ist dies bei Drupal 7 offensichtlich: Die Abfrage zum Abrufen eines vollständigen Knotenobjekts unterscheidet sich erheblich von der bei Drupal 6 verwendeten. Außerdem werden die an der Abfrage beteiligten Datenbanktabellen geändert.
Kiamlaluno
Ich werde auch , dass im Fall von Ausspucken 1000s Knoten hinzufügen, wenn Sie nicht brauchen andere Module Haken zum Aufbau Ihres Knotenobjekt, eine einzige, riesige SQL - Anweisung auf jeden Fall viel schneller ist. 1 trip zu schnell verbindender, schnell abfragender db ist schnell, im gegensatz zu einem efq, um knoten umzudrehen und iterativ zu laden, php, um andere module nach hooks zu fragen, jedes nid mit seiner eingebauten trip zur db (für cache oder build) und php, um sie auf dem Weg nach draußen zu verarbeiten. Youch.
Texas-Bronius
5

Führen Sie, wie in Jakarskas Antwort erläutert node_load(), node_load_mutliple()mehr als nur eine DB-Abfrage durch. Sie kümmern sich darum, alle von den aktivierten Modulen Ihrer Site implementierten Node Building Hooks aufzurufen .

Darüber hinaus können Sie in Drupal 7 mit der Einführung steckbarer Feldspeicher bei der Arbeit an wiederverwendbarem Code nicht wissen, ob Ihre Felddaten in Ihrer (Haupt-) Datenbank verfügbar sind oder nicht. Als allgemeine Regel gilt, würde ich verwenden node_load(), node_load_mutliple()und EntityFieldQueryzu Abfrage für Knoten. Wenn Sie nur ein bestimmtes Feld für mehrere Knoten benötigen, können Sie es auch field_attach_load()mit einem $options['field_id']für die Ergebnisse eines Knotens verwenden EntityFieldQuery.

Also, ich würde nicht für eine benutzerdefinierte SQL - Abfrage gehen , wenn der Code sicher ist , in den Fällen verwendet werden , wo alles, was node_load(), node_load_mutliple()und EntityFieldQuerybieten nicht, und wird es nie sein, benötigt und auf Daten , die sind und werden immer, gespeichert in die SQL-Datenbank.

Pierre Buyle
quelle
1

node_load()ist der "Drupal Weg"; Dies bedeutet, dass die API durch Aufrufen dieser Funktion eine Nachricht an Module sendet, wenn das Laden des Knotens gestartet wurde, damit diese ihre eigenen Informationen hinzufügen / ändern / entfernen können. Ja, verwendet sogar node_load()Caching, da es viele Abfragen verwendet.
Sie können db_select()konkrete Daten auswählen, aber stellen Sie sicher, dass Sie korrekte Daten sammeln / ändern / löschen.

Nikit
quelle
0

Sie können sorgfältig eine Ansicht erstellen, um zu filtern und zu verknüpfen, was Sie möchten, und dann die Funktion views_get_view_result () verwenden, um das Ergebnis zu erhalten.

Und mit vorsichtig meine ich, dass Sie nur die Felder verwenden, die Sie benötigen. Wenn Sie beispielsweise ein Feld mit dem Knotentitel mit einem Link zu seinem Knoten einfügen, wird Ihre Abfrage in Ansichten erheblich länger, anstatt nur die Knoten-ID ohne Link zu verwenden.

Views ist ein leistungsstarker Abfrage-Generator, dessen programmgesteuerte Verwendung eine gute Antwort auf Ihr Problem sein kann. Sie können das Beste aus beiden Welten herausholen: einfache Abfragen, die mit Drupal kompatibel sind, und schnellere Ergebnisse im Vergleich zum Laden aller Daten einer bestimmten Entität.

Sie müssen Ihr Ansichtsmodul so konfigurieren, dass die generierten Abfragen beim Erstellen angezeigt werden. Es könnte auch nützlich sein, Ihre Ansichten als "System" oder ähnliches zu benennen oder zu kennzeichnen, um unerwünschte Überschreibungen zu vermeiden.

Beto Aveiga
quelle