Datenbankschicht abstrahieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankschicht abstrahieren

    Hallo,

    ich bräuchte mal ein paar Ideen zur Umsetzung folgender Anforderung. Ich will in meiner PHP-Software möglichst unabhängig von der Datenschicht arbeiten. Egal ob SQL-Datenbanken, XML-Dateien oder serialisierte PHP-Objekte zur Speicherung von Daten zuständig sind, ich möchte eine universelle Schnittstelle verwenden, die auf die Fachlogik angepasst ist.

    Beispiel: ein Forum. Es gibt verschiedene Anforderungen an eine Klasse Thread, die über statische Methoden Threads sortiert nach verschiedenen Aspekten zurückgeben soll. So zum Beispiel Thread::getByUser(User $user) oder Thread::getByForum(Forum $forum). Sollte einleuchtend sein, was diese Methoden machen.

    Das Problem: Es kommen nach einiger Zeit ziemlich viele Aspekten, nach denen man Threads anzeigen lassen kann, zusammen. Was bei den oben genannten Methoden zum Beispiel noch fehlt, wäre die Sortierung. Nach dem Prinzip müsste es also Methoden geben, die da heißen Thread::getByForumSortAsc(Forum $forum) oder Thread::getByUserSortDesc oder aber auch Thread::getByForum(Forum $forum, SORT_FLAG). Das ist natürlich kein tolles Design. ich bräuchte also irgendeine Zwischenschicht, bei der ich so flexibel wie möglich sein kann, ohne mich auf einen Datenspeicherungsaspekt (beispielsweise SQL) festlegen zu müssen.

    Wäre für Ideen sehr dankbar.

    Grüße

  • #2
    Dein Design finde ich auch nicht wirklich Objektorientiert. Die Klasse Thread repräsentiert eigentlich mehrere Threads und bietet dabei noch ziemlich unflexible Methoden zur Filterung an...

    Ich mache es so ähnlich wie in folgendem Beispiel.
    PHP-Code:
    very abstract class ThreadList implements Iterator {
        public 
    $sortOrder 'ASC';
        
    pubilc $sortBy 'id';

        private 
    $DBConnection;
        public function 
    __construct(DBConnection $db);

        public function 
    addFilter($filter$conjunction);

        public function 
    addItem($t) {
            
    /* $t in die DB einfügen */
        
    }
        public function 
    removeItem(Thread $t) {
            
    /* Anhand von Suchkriterien aus $t (z.B. $t->id) löschen */
        
    }
        public function 
    updateItem(Thread $t) {
            
    /* Alle Werte von $t in die DB speichern (WHERE id = $t->id) */
        
    }

        
    // Iterator-Funktionen
        
    public function key();
        public function 
    rewind();
        public function 
    valid();
    }

    $threads = new ThreadList($DB);
    $threads->addFilter('forum = $forum''AND');
    foreach (
    $threads as $thread) {
        echo 
    "{$thread['von']}{$thread['thema']}<br />";

    Ich hoffe, die Idee ist klar geworden.
    hopka.net!

    Kommentar


    • #3
      Man, das wäre ne Idee. Jedoch macht deine Implementierung mich mindestens wieder von SQL-Datenbanken abhängig.

      [COLOR=red]update:[/COLOR] Hey, je mehr ich drüber nachdenke, desto besser scheint deine Lösung mir. Anstatt der SQL-spezifischen Features, könnte man mit Hilfe von abstrakten Oberklassen und Interfaces eine gemeinsame Schnittstelle erzeugen, die ThreadList-Varianten für SQL, Persistenzobjekte oder XML ermöglicht. Die Setzung von Sortierungs- und Filterbedingungen wäre dann generisch möglich. Cool, danke.
      Zuletzt geändert von MaxPayne; 01.07.2006, 18:25.

      Kommentar


      • #4
        Jo, stimmt, mein Beispiel war nur für Datenbanken. Und insbesondere die Idee mit den Filtern ist nur ein Ansatz, der noch etwas weiter durchdacht werden muss, gerade wenn du auch andere Datenquellen verwenden möchtest (sonst kann man das einfach direkt in den Where-Teil des Queries übernehmen).

        Es gibt auch noch Service Data Objects (SDO), das ist in der Theorie genau das was du brauchst. In der Praxis ist es aber leider weit von der Fertigstellung entfernt, und das Interface ist auch nicht so einheitlich / standardisiert, wie es theoretisch sein sollte.
        hopka.net!

        Kommentar


        • #5
          sorry!
          Aber ich finde z.b.s SQL Objectorientiert genug, und hat fast alle mögliche Fälle abgedeckt.
          der SQL parser macht nichts anderes, als datenbank-interne functionen aufzuruffen, die nichts anderes als die Methoden von Euren abstrackten Classen darstellen.
          Um die Datenhaltung und Datenbeschafung bei verschiedenen Datenbank- systemen zu ermöglichen, hat ADO sehr grosse Schritt gemacht.

          Ich glaube, dass wenn du mehr in diese richtung gehst, und mit sql zugriff
          auf dateisystem, pdf documente, xml-dateien wie z.b.s http://www.sqlxml.org/ das machen, und html-documente wie z.b.s
          http://www.phpclasses.org/browse/package/3086.html
          , als auch auf die Objectlisten und Serialisierte Objecte
          dann hättest du deine Abstrakte Schicht, die deine universelle Schnittstelle darstellt.
          Außerdem wir müssen nicht vergessen, dass wir hier nicht über c++ oder Java sprechen, sondern um eine PHPWebanwendung, bei der jede Abstrakte Schicht zeit und performance kostet und solche Implementierungen würde ich nicht in php, sondern in Quellcode von PHP auf C -Ebene machen.

          das ist in keinem Fall die Kritik, sondern ein Vorschlag auf den man ruhig pfeifen darf
          Slava
          bituniverse.com

          Kommentar


          • #6
            Da hast du natürlich auch wieder recht. Aber ich denke, dass man zu Gunsten einer ordentlichen Anwendungsarchitektur auf ein paar Millisekunden Ausführungsgeschwindigkeit verzichten kann. Aber du hast recht mit deiner Aussage, dass SQL quasi schon eine Abstraktion darstellt. Guter Einwurf. Werde dem mal etwas nachgehen...

            Kommentar

            Lädt...
            X