Announcement

Collapse
No announcement yet.

Klassenmodellierung / Datenbanktabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Klassenmodellierung / Datenbanktabelle

    Hallo,

    ich habe bisher vor allem mit Objective-C und Python gearbeitet, und seit 2-3 Monaten beschäftige ich mich nun mit PHP. Dabei bin ich auf eine Frage gestossen, die mich ein wenig beschäftigt. Ich würde gerne wissen, wie ihr das machen würdet oder macht.

    Ich habe eine Datenbanktabelle 'countries' und ein entsprechendes Objekt 'Country'. Ein Datensatz aus der Tabelle entspricht einer Instanz des Objekts, soweit so gut.

    Was macht ihr nun, wenn ihr alle oder sagen wir 40 Datensätze haben wollt? Ich habe mir dafür eine statische Funktion 'getAll' (siehe Code weiter unten) geschrieben, die ein Array mit Country-Instanzen zurückgibt. Was mich hier ein wenig stört ist, dass ich ja dann 41 Select-Statements haben würde.

    Was meint ihr dazu? Wie könnte man das performanter machen? Theoretisch finde ich den Ansatz eigentlich richtig, doch praktisch... hm.

    Danke und Grüße.
    Stefan

    PHP Code:
    <?php
    class Country extends Coordinate {
      private 
    $db NULL;
      const 
    TABLE COUNTRY;
      
      private 
    $id 0;
      
    // weitere vars
      // ...
      // ...
      
      
    public function __construct($id$db NULL) {
        
    $this->id intval($id);
        if(
    $db != NULL) {
          
    $this->db $db;
        }
        else {
          
    $this->db =& MDB2::singleton();
        }
        
        
    $sql 'SELECT de, en, lon, lat, gm_code, iso, status FROM ' self::TABLE ' WHERE id = ' $this->id;
        
    $res $this->db->queryRow($sql);
        if (
    PEAR::isError($res)) { die($res->getMessage()); }
        
        if(
    count($res) == 0) {
          
    // raise error
        
    }
        else {
          
    $this->nameDe stripslashes($res['de']);
          
    $this->nameEn stripslashes($res['en']);
          
    $this->iso stripslashes($res['iso']);
          
    $this->lon $res['lon'];
          
    $this->lat $res['lat'];
          
    $this->gmcode $res['gm_code'];
          
    $this->status $res['status'];
        }
      } 
      
      
    // weitere funktionen
      // ...
      // ...
      
      
    public static function getAll($where ''$db NULL) {
        
    $countries = array();
        
        if(
    $db == NULL) {
          
    $db =& MDB2::singleton();
        }
        
        
    $sql 'SELECT id FROM ' Country::TABLE . (!empty($where) ? ' WHERE = ' $where '');
        
    $res $db->queryAll($sql);
        if (
    PEAR::isError($res)) { die($res->getMessage()); }
        
        
    $counter count($res);
        
        if(
    $counter 0) {
          for(
    $i 0$i $counter$i++) {
            
    $countries[$i] = new Country($res[$i]['id']);
          }
        }
        
        return 
    $countries;
      }
    }
    ?>

  • #2
    Hallo,
    Originally posted by intamplare View Post
    Was meint ihr dazu?
    Soweit zur Theorie .
    Das mag theoretisch richtig sein, aber praktisch ist es einfach nur gruselig. Mit sowas zwingst du über kurz oder lang jeden Web- und Datenbankserver in die Knie!

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Originally posted by Falk Prüfer View Post
      Das mag theoretisch richtig sein, aber praktisch ist es einfach nur gruselig. Mit sowas zwingst du über kurz oder lang jeden Web- und Datenbankserver in die Knie!
      Danke für deine Antwort. Wie würdest du es machen?

      Grüsse.
      Stefan

      Comment


      • #4
        Alle lesen und days Ergebnis den Instanzen zuweisen
        Christian

        Comment


        • #5
          Originally posted by intamplare View Post
          ... Wie würdest du es machen?
          Ich würde zuerst meine konkreten Anforderungen formulieren und mir die Frage stellen ob es wirklich notwendig ist, für jeden DS eine Instanz eines Objektes zu haben. Nicht alles was theoretisch schön ist ist praktisch sinnvoll. Brauch ich wirklich eine Liste als Array? Welchen Vorteil hat dieses gegenüber einer Cursor-Resource? Mir fällt da nur der wahlfreie Zugriff ein. Dafür lade ich mir eine Menge Nachteile in punkto Performance und Speicherplatzverbrauch auf.
          Der normale Anwendungsfall für eine Liste sieht doch eher so aus, dass diese mehr oder weniger geordnet auch als Liste ausgegeben wird - als Tabelle als Listenelement... Warum muß ich jetzt in einer Schleife 40 mal den Cursor durchackern, alles in ein Array schreiben, um dann für die Ausgabe nochmal 40mal das Array durchzuackern.
          Warum soll ein getAll() nicht einfach eine Cursor-Resource zurückgeben. Wenn die nachfolgende Verarbeitung das braucht, kann sie immer noch ein Array daraus machen oder eben jeden DS mit fetch_object() als Objekt abholen.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment

          Working...
          X