Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist der beste Weg, um die Anzahl der Abfragen zu reduzieren, wenn die Klasse DAO Methoden hat, die dasselbe Ergebnis verwenden?

Diese Antwort hängt von der aktuellen Abfragestruktur ab, in der es keine Bedingungen gibt

class CategoriaDAO extends PDOConnectionFactory
{
    /*DB Connection, static member since you only need one connection*/
    private static $dbConnection;

    /*Sql result set, static since there is not conditonal and only a single table used*/
    private static $resultSet;

    private static function getConnection()
    {
            /*Connect to mysql db, set CategoriaDAO::dbConnection; */
    }

    private static function populateResultSet()
    {
            /*Run query and populate resultSet - either as sql result or parse to array - your call*/
    }
    /**
     *
     * @var PDO $conn 
     */
    private $conn;

    public function __construct()
    {
                /*Get sql connection if one hasn't already been established*/
                if(!CategoriaDAO::dbConnection)
                        $this->conn = PDOConnectionFactory::getConnection();
    }
}

Da die Ergebnisse immer gleich sind (vorerst ignorieren, aktualisieren, einfügen, löschen), ist der Gedanke dahinter, dass es nicht erforderlich ist, eine Kopie der Ergebnisse in jedem Objekt aufzubewahren.

Wie Sie bereits erwähnt haben, führen Tabellenaktualisierungen dazu, dass die gespeicherte Ergebnismenge nicht mehr mit dem Objekt synchron ist. An dieser Stelle möchte ich etwas zurückgehen und sagen, dass, wenn die Ergebnismenge für ein bestimmtes Objekt nur zum Zeitpunkt der Erstellung aktuell sein muss, normale Objektmitglieder verwendet werden.

Es lohnt sich auch, sowohl unabhängig als auch in Verbindung mit dem vorherigen Kommentar zu überlegen, ob sich die Abfrage ändert oder nicht, und wenn dies der Fall ist, müssen Objektmitglieder generiert werden. Wenn sich die Abfrage nicht ändert, gibt es nichts zu befürchten - außer dem vorherigen Punkt. Wenn es sich ändert, werden Ihre Optionen mehr oder weniger in den folgenden Beispielen behandelt.

class Foo{
    private $someMember;

    /*
        $params = Associative array of fields and values
    */
    private static buildAndRunQuery($params)
    {
        /*Build sql query based on the given params Array()*/
    }
    public __construct($someMemebrValue)
    {
        $this->someMember = $someMemberValue;
        Foo::buildAndRunQuery(Array("fieldName" => $this->someMember));
    }
}

In diesem Beispiel verwenden Sie immer noch eine statische Methode, um die Abfrage zu generieren, aber Sie übergeben nicht statische Mitglieder für den Prozess/ An diesem Punkt (siehe Kommentar zu Objekten, die zum Zeitpunkt der Erstellung aktuell sind) können Sie entweder die Ergebnisse innerhalb des statischen Members oder übergeben sie an die Funktion __construct() und speichern sie in der Objektinstanz.

Dann besteht die Möglichkeit, dass die von Ihnen verwendete Abfrage etwas komplizierter ist, als nur bestimmte Felder anzufordern, sodass das Erstellen eines mehrdimensionalen Arrays zur Übergabe an die statische Funktion mehr Aufwand als es wert wäre. In diesem Fall können Sie buildAndRunQuery() in buildQuery() - Instanzmethode und runQuery() statische Methode wie z

class Foo{

    private $someMember;

    /*
        $params = Associative array of fields and values
    */
    private static runQuery($query)
    {
        /*Build sql query based on the given params Array()*/
    }

    private function buildQuery()
    {
        /*Construct your query here and either return calling method or store in instance member*/
         /*Either*/
            return <Constructed query>;
        /*Or*/
           $this->query = <Constructed query>;
    }

    public __construct($someMemebrValue)
    {
        $this->someMember = $someMemberValue;
        /*As per buildQuery() comment either:*/
            Foo::runQuery($this->buildQuery());
        /*Or*/
            Foo::runQuery($this->query);
    }
}

In diesem Fall gibt es ein paar Optionen zur Behandlung der generierten Abfrage vor dem Aufruf von Foo::runQuery().

Natürlich besteht immer die Möglichkeit, dass Sie die Abfrage nicht synchron oder gar im Konstruktor erstellen und ausführen möchten.

Abschließend bin ich persönlich der Meinung, dass es für Methoden, die mit Diensten interagieren, die unabhängig vom Objekt selbst sind, wie SQL oder vielleicht fokussiertes DOMDocument oder ähnliche Objektinteraktionen, am besten ist, statische Methoden zu verwenden, wenn sie beide relevant sind und Ihnen nicht letztendlich die Nase abschneiden Trotz deines Gesichts (unnötig komplex usw.). All dies muss natürlich pro Klasse betrachtet werden.