Die Leistung ist einer der wichtigsten Aspekte, die bei der Entwicklung von Webanwendungen berücksichtigt werden müssen. Die Analyse der Art und Weise, wie die Daten aus einer Datenbank abgerufen werden, ist ein guter Ausgangspunkt für die Suche nach Verbesserungen. In diesem Artikel finden Sie Beispiele dafür, wie Sie die Leistung durch die Verwendung von Aggregatfunktionen und das Filtern von Daten auf Datenbankebene verbessern können.
Zunächst etwas Kontext
Dieser Artikel wurde von einem echten Problem inspiriert, mit dem ich einmal konfrontiert wurde. Der Umgang damit hat mich viel gelehrt, und ich habe es immer noch als Referenz im Kopf. Ich denke, Beispiele sind eine gute Lernquelle, sie können viel klären. In diesem Artikel möchte ich Ihnen einige Beispiele für die Verwendung der Active Record-Abfragemethoden vorstellen.
Um keine domänenspezifischen Details einzuführen, werde ich zur Veranschaulichung der Beispiele eine Beispielanwendung für eine Bibliothek verwenden. Es ist alles ziemlich einfach, wie das folgende Diagramm zeigt. Wir haben vier Tabellen: Autoren, Bücher, Benutzer und Ausleihen. Da ein Benutzer viele Bücher ausleihen kann und ein Buch von vielen Benutzern ausgeliehen werden kann, benötigen wir eine Verbindungstabelle, um die Beziehungen zwischen mehreren Benutzern zu modellieren. In unserem Fall ist das die Tabelle "Ausleihen". Wir speichern dort auch einige zusätzliche Informationen, nämlich die Daten der Ausleihe und der Rückgabe. Einem Autor können viele Bücher zugewiesen werden. Ein Buch hat auch ein Attribut, das sein Genre definiert.
Benutzer-Lesestatistiken
Die Aufgabe bestand darin, eine Statistik für einen einzelnen Benutzer zu erstellen, damit wir wissen, wie viele Bücher aus jedem Genre ausgeliehen wurden. Mein erster Gedanke war, alle Bücher, die vom Benutzer ausgeliehen wurden, zu holen, sie nach ihrem Genre zu gruppieren und dann die Zuordnung vorzunehmen, so dass jedem Genre eine Anzahl von Büchern anstelle einer Liste zugeordnet ist. Ich habe mir folgendes ausgedacht:
Dieser Ansatz funktioniert zwar und sieht sauber aus, aber er nutzt nicht alle Möglichkeiten, die Active Record-Abfragemethoden bieten. Dank ihnen sind wir in der Lage, Daten auf Datenbankebene zu filtern und zu aggregieren, ohne rohes SQL direkt in unserer Code. Die Arbeit auf db-Ebene erhöht auch unsere Effizienz.
Im obigen Beispiel können wir die group-Methode anstelle von Ruby's group verwendennach Methode. Es wird die GROUP angewendetBY-Klausel in die tSQL-Abfrage einfügen. Außerdem kann die Mapping- und Size-Methode durch eine Zählaggregationsfunktion ersetzt werden. Am Ende haben wir eine Abfrage, die wie folgt aussieht:
Book.joins(:rentals).where(rentals: { user: user }).group(:genre).count(:books)
Es sieht noch einfacher aus!
Weitere nützliche Beispiele
Nachfolgend finden Sie einige weitere Möglichkeiten zur Verwendung der Abfragemethoden, die ich für wissenswert halte.
Einladung für inaktive Nutzer
AUFGABE: Filtern Sie Nutzer, die noch nie ein Buch ausgeliehen haben oder dies vor mehr als einem Jahr getan haben.
Wir könnten alle Benutzer abrufen, indem wir die zugehörigen Mietverträge einbeziehen und sie dann mit der Select-Methode filtern.
User.includes(:rentals).select do |user|
benutzer.mietobjekte.leer? || benutzer.mietungen.keine? { |vermietung| vermietung.start_date >= Date.today - 1.year }
end
Aber es ist natürlich nicht nötig, alles abzurufen. Mit Hilfe der Abfragemethoden können wir die Daten auf der Ebene der Datenbank herausfiltern. Lassen Sie uns zunächst die Benutzer auswählen, die im letzten Jahr einige Bücher ausgeliehen haben, und diese dann von der endgültigen Auswahl ausschließen.
AUFGABE: Autoren mit einem oder keinem ausgeliehenen Buch finden
Es mit der Select-Methode zu tun ist super einfach, aber wieder - es gibt keine Notwendigkeit, auf einem so großen Satz von Daten zu arbeiten, wie die DB kann es für uns filtern:
Bei der Verwendung von Left_Joins (und Outer-Joins im Allgemeinen) ist eine Sache zu beachten. Wenn es Datensätze in der linken Tabelle (hier: Autoren) gibt, die keine entsprechenden Datensätze in der rechten Tabelle (hier: Bücher) haben, dann werden die Spalten der rechten Tabelle mit Nullwerten gefüllt.
Da wir auch Autoren benötigen, denen ein Buch im System zugewiesen ist, müssen wir noch einige weitere Operationen durchführen. Wir müssen die Gruppierung, die Zählung und das Hinzufügen einer Bedingung vornehmen. Hier sehen Sie, wie man das alles zusammenfügt:
Die Bedingung kommt nach der Aggregationsfunktion, daher müssen wir die HAVING-Klausel anstelle der WHERE-Klausel verwenden, um sie anzugeben.
Die Abfragemethoden von Active Record sind eine Überlegung wert, wenn es um die Leistung einer Anwendung geht. Sie können Ihren Code vereinfachen und schneller arbeiten lassen. Ich hoffe, dass die gemeinsamen Beispiele Ihnen dabei helfen, die Möglichkeiten zu erkunden, die die Abfragemethoden bieten.