DB-Tabelleninhalte in SESSION zwischenspeichern oder neu abfragen?

DrEvil

Erfahrenes Mitglied
Hallo Leute,
lediglich eine knappe Frage wie ihr das so händelt bzw. was euch sinnvoller scheint:

Ich habe in einer Datenbank u.a. eine Tabelle hinterlegt in der für eine bestimmte ID eine Klartext-Entsprechung gespeichert ist. Konkret geht es um Studien-Modulnamen an einer Uni.
Jetzt benutze ich an verschiedenen Stellen ja nicht die IDs der Modulnamen, sondern gebe sie als Klartext aus, damit der Nutzer die normal lesen kann.

Meine Frage ist nun:
Macht es Sinn diese Zuordnungen in eine Session-Variable zu schreiben und die "Übersetzung" (ID -> Klartext) immer nur aus der Session-Variable zu lesen.
ODER
Sollte ich jedes Mal, wenn ich den Klartext benötige das entsprechende lieber aus der Datenbank-Tabelle neu laden und die Connects in Kauf nehmen?


Danke für eure Hilfe! Eric
 
Ohne den genauen Hintergrund und Ablauf auf der Seite zu kennen würde ich es wohl als Session-Variable speichern.

Kommt natürlich auch darauf an wie oft sich der Wert ändert. Wenn ich auf die Seite komme, ein bestimmtes Modul auswähle und dann bis zum Verlassen der Seite dabei bleibe macht es sicher keinen Sinn dauernd die Daten aus der DB zu holen.
 
Ich mache in den meisten Fällen eine Singleton-Klasse (Ableitung von ArrayObject) die jedesmal nur einmal geladen wird

PHP:
class MyStrings extends ArrayObject{
    // Speichert die Instanz der Klasse
    private static $instance;
    
    // Leider muss es wegen array_object public sein..
    public function __construct(){
        //Hier halt dein SQL
    	$sql = "SELECT REC_ID AS id, BARCODE AS string FROM artikel;";
    	$result = mysql_query($sql);
    	while($item = mysql_fetch_assoc($result)){
    		parent::offsetSet($item['id'], $item['string']);
    	}
    }

    // Die Singleton Funktion
    public static function singleton() 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }

    public function get($id){
        return parent::offsetGet($id);
    }
}

//Ausgabe eines Strings
echo MyStrings::singleton()->get(1);
//Ausgabe der ganzen Liste als array
var_dump((array) MyStrings::singleton());

Du kannst dann immer noch mit __sleep und __wakeup das ganez zu konstruieren dass du dies sinnvoll n die Session quetschen kannst. Lohnt sich mMn aber nur bei einer grossen lasite wo die Abfrage lange geht.
 
Hey tombe, danke für die fixe Antwort.
So hatte ich mir das grundsätzlich auch überlegt, war mir halt nur nicht sicher, ob dieser Gebrauch so "üblich" ist.

Ich meine wie wird denn sowas sonst gehändelt?
Es kommt ja öfter vor, dass Datenbank-intern einfach nur mit den numerischen IDs gearbeitet wird, was für den Nutzer aber jedesmal wieder in lesbaren Text verwandelt werden muss, wenn es irgendwo ausgegeben wird.
Ich bin mir immer nur nicht sicher, ob solche Sachen einfach in die $_SESSION zu legen, nicht "unsauberer Stil" ist... :)
 
Hi Yaslaw,
das is natürlich auch ganz fesch. Auf die Idee quasi die Strings einmal alle in eine Klasse zu laden bin ich noch garnicht gekommen. :)
 
Sowas sollte man nicht in die Session speichern, da du damit für jeden Benutzer die Session nur unnötig vergrößerst und redundante Informationen speicherst!

Außerdem werden die Session-Daten normalerweise auf der Festplatte gespeichert, was somit größere Ladezeiten hervorruft.
MySQL bietet z.B. die MEMORY (HEAP) Storage Engine an, welche die Daten im Arbeitsspeicher hält und somit die beste Ladezeiten erreicht!

Die Datenbankabfragen sollten bei einer kleinen Seite bis mittleren Seite eigentlich schnell genug sein, ansonsten kann du z.B. memcached o.Ä. benutzen.
 
Zurück