Speicherung von Daten (in einer Model-Klasse)

Heute beschäftigt mich das M von MVC, obwohl ich bisher immer dem V und C mehr Beachtung geschenkt habe. Ich bin momentan dabei, ein Projekt mithilfe meines eigenen MVC-Frameworks zu realisieren.

Model für was?

Zuerst sollte ich noch sagen, was das Model tun soll. Es ist dazu da, sich um die Speicherung der Daten in der Datenbank zu kümmern, so dass man an keiner anderen Stelle im Code wissen muss, wo und wie die Daten gespeichert werden.

In diesem Fall möchte ich Usergruppen in einer MySQL-Tabelle namens „groups“ ablegen. Im Normalfall gibt es nicht mehr als 10 Gruppen.  Dabei habe ich mich gefragt, wie ich die Daten innerhalb der Model-Klasse am besten verwalte.

Prinzipiell gibt es 2 Möglichkeiten:

  1. Ich lese im Konstruktor des Models die komplette Datenbanktabelle „groups“ aus und lege das Resultat in einem Array ab. Immer wenn ich jetzt Informationen über eine Gruppe brauche, ist nur eine Abfrage auf das Array notwendig. Die DB wird dadurch entlastet. (Weil nur einmal eine Abfrage stattfindet)Es folgt ein Beispielcode:
    class Model_Group extends FW_Model_Abstract
    {
      private $db = null;
      private $groups = array();
    
      public function __construct()
      {
        $this->db = FW_MySQL::getInstance("db1");
    
        //Alle Gruppen aus Datenbank lesen und in Array speichern
        $this->groups = $this->db->getRowset("SELECT group_name, group_id, kommentar FROM groups");
      }
    
      public function getGroups()
      {
        return $this->groups;
      }
    
      public function getGroupName($group_id)
      {
        return $this->groups[(int)$group_id]["name"];
      }
    
      public function getGroupDescription($group_id)
      {
        return $this->groups[(int)$group_id]["description"];
      }
    }

    Man sieht, dass nur eine einzige Abfrage ausgeführt wird. Damit lassen sich dann alle anderen Aktionen ausführen, die lesend auf die DB zugreifen würden.

    Doch wie sieht es beim Schreiben aus?
    Wenn ich an der Tabelle „groups“ etwas ändern möchte, muss ich bei diesem Konzept 2 Aktionen ausführen:

    1. Array anpassen (So dass ich später die richtigen Daten habe)
    2. DB updaten

    Zusammenfassend lässt sich über diese Variante also sagen:
    Vorteile: Bessere Performance beim Lesen
    Nachteile: Schlechtere Performance beim Schreiben

  2. Die zweite Methode arbeitet nicht mit einem Array, das die DB abbildet, sondern direkt mit der Datenbank.
    Immer wenn ein Wert benötigt wird, wird eine Abfrage an die Datenbank gesendet. Das Beispiel oben sieht dann so aus:

    class Model_Group extends FW_Model_Abstract
    {
      private $db = null;
      
      public function __construct()
      {
        $this->db = FW_MySQL::getInstance("db1");
      }
      
      public function getGroups()
      {
        return $this->db->getRowset("SELECT group_id, group_name, description FROM groups");
      }
      
      public function getGroupName($group_id)
      {
        return $this->db->getFieldValue("SELECT group_name FROM groups WHERE group_id=".(int)$group_id, "group_name");
      }
      
      public function getGroupDescription($group_id)
      {
        return $this->db->getFieldValue("SELECT description FROM groups WHERE group_id=".(int)$group_id, "description");
      }  
    }
    

    Hier gibt es für jede Aufgabe ein DB-Query.

    Vorteile: Beim Schreiben muss kein Array angepasst werden. Einfacher zu verstehen.
    Nachteile: Für jeden lesenden Zugriff muss eine Abfrage gestartet werden.

Was ist besser?

Ich habe gerade überhaupt keine Ahnung, welche Variante ich wählen soll. Was würdet ihr tun?

1 Star2 Stars3 Stars4 Stars5 Stars (Wurde noch nicht bewertet)
Loading...


3 Kommentare zu “Speicherung von Daten (in einer Model-Klasse)”

  1. die erstere Methode ist meiner meinung nach besser, da die meisten anfragen lese anfragen sind(ca 70% lesen, 30% schreiben), moderne pcs haben auch viele zwischenspeicher(caches)

  2. Bei meinen weitern Projekten habe ich es auch so gemacht, da es einfach besser so ist.

    Das mit dem 70/30 kann man aber wirklich nicht so allgemein sagen…

  3. Fast die identische Fragestellung hat mich zum googeln getrieben 😉

    Leider habe ich bis zu dem Artikel hier keine konkret passenden Tipps zu Vor-/Nachteilen gefunden, Danke für den Denkansatz … ich werde nun auch die lesefreundlichere Variante einsetzen, da das in meiner Anwendung Prio hat.

Hinterlasse einen Kommentar!

Time limit is exhausted. Please reload the CAPTCHA.

»Informationen zum Artikel

Autor: Simon
Datum: 05.04.2009
Zeit: 00:04 Uhr
Kategorien: PHP
Gelesen: 3749x heute: 2x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Meta