Frage

Als meine Anwendung wuchs, ist mir aufgefallen, dass ich viele Datenbankabfragen auf mehreren Webseiten wiederverwende.

Im Moment habe ich es mit einer .CFM-Datei gemacht, die viele enthält <cfstoredproc> Tags, die auf jeder Seite eingefügt werden, die Datenbankdaten benötigt.Alles, was ich tue, ist, diese gespeicherten Prozedurausführungen in eine zu verpacken <cfif> Tag, der den Namen der aufrufenden Seite testet und dann das entsprechende ausführt <cfstoredproc> Codeblock.

Ich bin kein Experte in irgendetwas, aber das fühlt sich für mich nicht richtig an.Ich weiß einfach nicht, wie ich alle meine Datenbankabfragen richtig verwalten soll, damit sie auf jeder CFM-Seite der gesamten Website gemeinsam genutzt werden können.Beispielsweise benötigt eine Seite möglicherweise die gespeicherte Prozedur „GetUsers“ und eine andere Seite möglicherweise „GetOrders“.

Ich bin gerade dabei, einen CFC zu erstellen, der alle Einzelteile enthält <cfstoredproc> oder <cfquery> in seiner eigenen Methode/Funktion.Z.B.:

<cfcomponent name="DBQueries" hint="Everything for DB retrieval">
 <cffunction name="GetUsers" returntype="query">
   <cfstoredproc procedure="GetUsers">
   <cfprocresult name="rsUsers">
   </cfstoredproc>
   <cfreturn rsUsers>
 </cffunction>
.....
 <cffunction name="DBQuery100">
   <cfstoredproc procedure="GetSomething" returntype="query">
   <cfprocresult name="rsSomething">
   </cfstoredproc>
   <cfreturn rsSomething>
 </cffunction>
</cfcomponent>

Dann rufe ich auf einer .CFM-Hauptseite die Komponente und Methode auf, die zum Zurückgeben der Daten erforderlich sind.Ist dies ein guter Weg, um eine DB-Abfrageverwaltung zu erreichen?

War es hilfreich?

Lösung

Betrachten Sie die folgenden zwei Datenbanktabellen

Benutzer

UserID primaryKey FirstName Lastname

Sicherheit

SecurityId PrimaryKey Userid ForeignKey -Berechtigung

Alle Datenbanktabellen verfügen über Operationen zum Erstellen, Lesen, Aktualisieren und Löschen (CRUD).

CRUD-Operationen können an mehreren Stellen vorhanden sein

  1. Innen <cfquery> Stichworte
  2. Innerhalb gespeicherter Prozeduren
  3. Andere

Die Sache ist, dass alle CRUD-Operationen auf ihre eigene Weise zusammengehören.Erwägen Sie die Erstellung eines Benutzerobjekts (user.cfc).

<cfcomponent>
   <cffunction name="create"></cffunction>
   <cffunction name="read"></cffunction>
   <cffunction name="update"></cffunction>
   <cffunction name="delete"></cffunction>
 </cfcomponent> 

Sicherheit ist Teil der Benutzerverwaltung. Stimmt das Objekt also eins zu eins mit der Datenbanktabelle überein?In manchen Umgebungen wie ORM lautet die Antwort „Ja“, in anderen nicht.

Wenn Sie Sicherheit als Teil der Benutzerverwaltung betrachten, ist Ihr user.cfc könnte so aussehen

<cfcomponent>
   <cffunction name="create"></cffunction>
   <cffunction name="read" hint="Read will also read security info"></cffunction>
   <cffunction name="update" hint="Perhaps this can update security too"></cffunction>
   <cffunction name="delete" hint="Delete will also delete security info"></cffunction>

   <cffunction name="create_security"></cffunction>
   <cffunction name="read_secrity" hint="This may not even be needed"></cffunction>
   <cffunction name="update_security"></cffunction>       
   <cffunction name="delete_security" hint="This may not even be needed"></cffunction>
</cfcomponent> 

Am Ende des Tages stellen Sie möglicherweise fest, dass Sie weitaus weniger Objekte benötigen (*.cfcs) als Tabellen.

OK, jetzt hast du dich user.cfc was machst du damit?Es kann auf verschiedene Weise mit dem Rest Ihrer App verknüpft werden

  • application.User = neuer Benutzer();
  • session.User = neuer Benutzer();
  • request.User = neuer Benutzer();

Jedes davon ist sehr unterschiedlich.Bevor wir entscheiden, was angemessen ist, müssen wir die Mitgliederdaten berücksichtigen und überlegen, wie lange wir sie haben möchten.

<cfcomponent>
   <cfset this.userid = ""><!--- This always points to the user I want to interact with --->

   <cffunction name="create"></cffunction>
   <cffunction name="read"></cffunction>
   <cffunction name="update"></cffunction>
   <cffunction name="delete"></cffunction>
 </cfcomponent> 

Es ist wahrscheinlich, dass Ihre CRUD-Operationen mit denselben interagieren UserID für alle ihre Operationen.Möglicherweise stellen Sie fest, dass Sie einen Datensatz nach dem Aktualisieren häufig lesen.Anstatt immer zu sagen, welches UserID mit dem Sie interagieren, möchten Sie es vielleicht nur einmal einrichten und alle Funktionen einfach mit demselben nutzen.

OK, jetzt kommen wir zurück zu dem Ort, an dem Sie sie verwenden werden

application.User

Einziger User Das Objekt wird im gesamten System vorhanden sein.Es wird erstellt, wenn die Anfrage auf der Website eingeht.Dieses Objekt wird für jede Anfrage geteilt.Wenn Sie Ihre anhängen user Objekt hier, was darauf hindeutet, dass alle Anfragen denselben Benutzer betreffen.

session.UserEins User Das Objekt existiert für einen bestimmten Endbenutzer in der Außenwelt.Es wird von allen anderen Endbenutzern getrennt.Dies deutet darauf hin, dass sich jeder Endbenutzer sein eigenes Bild ansehen wird user UND dass sie, auch wenn sie sich auf der Website umsehen, immer noch das Gleiche sehen user

request.BenutzerEins User Objekt wird pro Anfrage vorhanden sein.Es ist nur für eine bestimmte Anfrage vorhanden und wird dann verworfen.Dies deutet darauf hin, dass man sich etwas genauer ansieht User ist bei dieser Anfrage sinnvoll, aber die nächste kann ganz anders sein oder sich vielleicht nicht einmal um Benutzer drehen.

~~~~~~~~~~~~~~~

Am Ende des Tages müssen Sie entscheiden, wie Sie Ihre DB-Interaktionen bündeln und wie lange Sie diese gebündelten Aktionen zusammenhalten

Andere Tipps

Die Tatsache, dass es sich um eine Datenbank handelt, ist nicht so relevant wie die Tatsache, dass es Codewiederholungen gibt.Mit Ihren Bemühungen, den Code wiederverwendbar zu machen, sind Sie auf dem richtigen Weg.

Wenn Sie Ihre Abfragen in ein CFC stellen, können Sie darüber nachdenken, noch einen Schritt weiter zu gehen.Anstatt es ständig aufzurufen, verwenden Sie die onApplicationStart-Methode Ihrer Application.cfc, um eine Anwendungsvariable zu erstellen, die allen Benutzern auf allen Seiten zur Verfügung steht.

Ein anderer Ansatz besteht darin, alle diese Datenbank-Tags in einer .cfm-Datei abzulegen und ein cfinclude in die onRequestStart-Methode Ihrer Application.cfc einzufügen.

Beide Methoden funktionieren.Und wie es fast immer der Fall ist, wenn man zwei Dinge vergleicht, hat beides Vorteile gegenüber dem anderen.

Ich hätte ein Modell pro Tisch.

Darin befindet sich jede Abfrage, die jemals etwas mit dieser Tabelle bewirkt

Nehmen wir an, die Benutzertabelle

Benutzer.cfc

hätte alle Methoden, die Abfragen zurückgeben

getUsers – alle Benutzer zurückgeben

getUserById – könnte auch ein Parameter für die erste Funktion sein.

Wenn Sie dann herausfinden müssen, wo etwas in den Bestellungen aktualisiert wird, gibt es nur einen Ort, an dem Sie suchen können.

Ich bekomme die Ergebnisse so

<cfset users = new model.Users().getUsers() />

oder ich verwende Skript

users = new model.Users().getUsers();

Und wenn Sie wirklich mutig sind, versuchen Sie, alle Abfragen auch im Skript durchzuführen.

Eine letzte Sache, die Sie berücksichtigen sollten: Wenn sich die Daten nicht ändern, sollten Sie die Abfrage zwischenspeichern.

Durch Dinge wie OrderType oder ähnliches erhalten Sie einen großen Leistungsvorteil, anstatt die Abfrage immer wieder wiederholen zu müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top