Objekt-relationales mapping:Was ist der beste Weg für die Implementierung von Getter?

StackOverflow https://stackoverflow.com/questions/169818

  •  05-07-2019
  •  | 
  •  

Frage

Was soll passieren, wenn ich rufe $user->get_email_address()?

Option 1:Ziehen Sie die E-Mail-Adresse aus der Datenbank auf Nachfrage

public function get_email_address() {
    if (!$this->email_address) {
        $this->read_from_database('email_address');
    }
    return $this->email_address;
}

Option 2:Ziehen Sie die E-Mail-Adresse (und die anderen User Attribute) aus der Datenbank auf Objekt erstellen

public function __construct(..., $id = 0) {
    if ($id) {
        $this->load_all_data_from_db($id);
    }
}

public function get_email_address() {
    return $this->email_address;
}

Meine grundlegende Frage ist, ob es am besten minimieren Sie die Anzahl der Datenbankabfragen, oder ob es am besten, zu minimieren die Menge von Daten wird aus der Datenbank übernommen.

Eine andere Möglichkeit ist, dass es ist beste zu laden die Attribute, die Sie benötigen, die / enthalten sind die wenigsten Daten bei der Objekterstellung und alles andere auf Nachfrage.

Eine follow-up-Frage:Was tun ORM Abstraktion frameworks wie Activerecord tun?

War es hilfreich?

Lösung

Es gibt wirklich keine richtige Antwort für diese. Hängt davon ab, wie viele Benutzer Sie auf einmal einlegen, wie vielen Text / Blob-Felder sind in Ihrer Benutzer-Tabelle, ob Ihre Benutzertabelle alle zugehörigen untergeordneten Objekte lädt. Wie aaronjensen sagt, wird dieses Muster namens verzögertes Laden - eifrig Laden und das entgegengesetzte Verhalten (Laden alles vorne nur, wenn Sie es brauchen) bekannt .

Das heißt, gibt es eine dritte Option, die Sie betrachten möchten vielleicht, was die gesamte Benutzer ist Objekt faul-Laden, wenn eine seiner Eigenschaften zugegriffen wird:

public function get_email_address() {
    if (!$this->email_address) {
        $this->load_all_data_from_db($this->id)
    }
    return $this->email_address;
}

Die Vorteile dieses Ansatzes sind, dass Sie eine Sammlung von Benutzern (zB eine Liste aller Benutzer, deren Passwörter sind leer, vielleicht?) Erstellen können, auf der Grundlage ihrer IDs nur, ohne den Speicher schlagen voll jeden einzelnen Benutzer geladen, aber dann Sie für jeden Benutzer einen einzigen Datenbank-Aufruf benötigen Sie den Rest der Benutzerfelder zu füllen.

Andere Tipps

Minimieren Sie die Anzahl der Abfragen.Die optimale Anzahl der Abfragen ist 0, aber wenn Sie Abfragen muss, weil es nicht zwischengespeichert, es ist 1.Abfragen für jede Immobilie ist ein sicher Feuer Weg, um ein system, das nicht skaliert werden, hat massive Konflikte Probleme, und verursachen so mehr Kopfschmerzen als sein Wert.

Ich sollte erwähnen, dass es Wert ist zu faul zu laden (das ist, was du redest in Schritt 1) wenn es ist unwahrscheinlich, dass Sie benötigen die Daten werden träge geladen.Wenn Sie können, aber, es ist beste zu sein, explizite und Holen genau oder fast genau das, was Sie brauchen.Je weniger Zeit Sie verbringen, das Abfragen, die weniger Zeit, die Ihre Verbindung geöffnet ist und skalierbarer Ihr system ist.

würde ich mit aaronjensen einverstanden sind, außer wenn die Menge an Daten, die Sie ziehen sind, ist zu so groß, dass Sie eine übermäßige Menge an Speicher aufbrauchen werden beginnen. Ich denke, wo eine Reihe 3 Textfelder hat, die alle recht groß sind und alles, was Sie wollen, ist das ID-Feld.

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