OO Design von Tabellen

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

  • OO Design von Tabellen

    Hey,

    ich versuche gerade meine Datenbankfunktionalität und die jeweiligen Felder in Klassen zu Kapseln. Dazu auch meine erste Frage.


    Welche Variante haltet ihr für sinnvoller und vor allem warum:

    Ich erstelle eine abstrakte Klasse "Datenbank". In dieser werden die Kernfunktionen wie Insert, Update, Verbindungsaufbau usw. gekapselt. Von dieser Klasse leitet ich dann jeweils die Tabellenklasse ab. Zum Beisspiel bekommt die Tabelle "User" die Klasse "User" zugeordnet. In dieser Klasse wird dann auch die Validierung der Daten und sonstiges Usermanagment gekapselt.

    Oder ich benutze eine andere Methode. Ich leite die Klasse "User" nicht von "Datenbank" ab, sondern übergebe per Konstruktor eine Referenz dieser Klasse an "User". Wenn ich auf 5-6 verschiedene Tabellen zugreife, erspare ich mir schon einiges an
    Overhead.(So mache ich es z. B. mit der Validierungsklasse).

    Was ist eure Meinung?



    Meine zweites kleines Brainstorming ist, eine gute Kapselung der SELECT Abfragen hinzubekommen. Ich möchte erreichen, dass sämtliche Abfragen nicht direkt mit der DB kommunizieren, sondern immer über eine Schnittstelle(siehe Oben, z. B. Klasse User).


    Ein einfacher Lösungsansatz wäre sicherlich folgender

    PHP-Code:
    function select($query="")
    {
        
    mysql_query("SELECT * FROM user " $query);


    Allerdings werden hierbei immer alle Felder zurück gegeben, was nicht gerade sehr elegant ist. Darüber hinaus wird die Methode sicherlich nur statisch genutzt werden können(was aber nicht unbedingt ein Nachteil ist).


    Was ist eure Meinung dazu? Macht es überhaupt Sinn, die DB-Zugriffe zentral zu Kapseln?

    Vielen Dank im Voraus!

  • #2
    also ...

    wenn du eine db-class hast, nutze sie auch richtig.

    d.h. alle queries werden komplett an die db.class geschickt.
    sowas wie ....
    PHP-Code:
    function select($query="")
    {
        
    mysql_query("SELECT * FROM user " $query);

    ... ist eher suboptimal.

    was das vererben betrifft, so hast du eignetlich schon die bessere variante mit den referenzen gewählt. das spart dir wirklich eine menge. ob es noch was besseres gibt, kann dir bestimmt ein ander sagen.

    deine classen solltest du auf jedenfall thematisch organisieren.

    -> database (handlich mit der db)
    -> usermanagement (ansprechen der tabellen user* via db-class)
    -> guestbook (ansprechen der tabellen gb* via db-class)

    du siehst also, dass man tabellen, die zu einem thema gehören, auch aus der entsprechenden class ansprechen sollte. es bringt ja nicht wirlkich was, wenn du für jede tabelle eine eigene class machst.

    wenn du eine der o.g. classes weiter unterteilen willst, so ist dies nur sinnvoll, wenn auch sinnvolle objecte das ergebnis der teilung sind.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Danke Abraxax.

      Original geschrieben von Abraxax


      wenn du eine db-class hast, nutze sie auch richtig.

      d.h. alle queries werden komplett an die db.class geschickt.
      sowas wie ....
      PHP-Code:
      function select($query="")
      {
          
      mysql_query("SELECT * FROM user " $query);

      mein Fehler, war nur der Veranschaulichung wegen.


      Das mit der thematischen Organisation klingt auch auf jeden Fall besser. Der andere Gedanke kam von den Oracle Forms / Java her.

      Kommentar


      • #4
        vererbung heißt immer spezialisierung

        wenn du ne db-klasse hast und davon ne klasse fürs usermanagement ableitest is das keine spezialisierung mehr sondern einfach nur deshlab, weil du zu faul warst ne referenz zu übergebn und dir auch beim aufrufen der methen der db-klasse tipparbeit sparen wolltest
        Code:
        $user->connect(...);
        is ja kürzer als
        Code:
        $user->db->connect(...);
        spezialisierung wäre meiner meinung nach ein allgemeine klasse für alle datnebnaken und dann ne klasse mysql, ne klasse oracle, ...
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          wo wir gerade bei Klassen und Strukturierung sind:

          Wenn man mit templates arbeitet, wo sollte man eigentlich die Zuweisung der Variablen machen?

          z. B.: ne Klasse mit einer Methode, welche mir die Posts zurückgeben sollte:
          PHP-Code:
          class MyGuestbook{
              ....
              function 
          getPosts($site){
                  
              }
              ...

          und einer normalen Datei guestbook.php
          PHP-Code:
          guestbook = new MyGuestbook;
          guestbook->getPosts(1); 
          Sollte ich jetzt die Zuweisung des Template-Arrays für die Posts in der Klasse MyGuestbook machen, oder in der guestbook.php?

          Der Einfachheit halber, wäre es leichter es direkt in der Klasse MyGuestbook zu machen. Allerdings wenn man von anderen Klassen ausgeht, die oft in verschiedenen Dateien angesprochen werden, wäre es ja wegen der Übersichtlichkeit der Templates nicht so gut es in der Klasse zu machen? Oder?

          Was wäre Eurer Meinung nach sinnvoller?

          Gruss

          Kommentar


          • #6
            richtig. denn die gästebuch-klasse hat nichts mit dem templates zu tun.

            also darfst du dort nur daten bereitstellen. mehr nicht.

            das sind nämlich zwei paar schuhe.
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              danke für die schnelle antwort

              also am besten dann

              PHP-Code:
              function & getPosts($site){
                 
              $posts = array();
                
              //Datensätze werden in $posts gespeichert
                 
              return $posts;

              Oder gibts es eine noch bessere Lösung?

              Gruss

              Kommentar


              • #8
                so würde ich es auch machen...

                zumindest, wenn ich die posts nicht noch woanders in der class brauchen könnte. aber von der regionalen variable auf eine classen-var im bedarfsfall zu switchen, sollte ja kein thema sein.
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  Danke! Hat mir super geholfen meine Gedanken etwas aufzuräumen!

                  Gruss

                  Kommentar


                  • #10
                    keine ursache..
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Ich hoffe ich fang nicht an zu nerven...

                      Aber ich versuch jetzt mal mein Lösungsansatz etwas genauer zu Beschreiben(und zwar mittels Quelltext und Datenstruktur, dasss andere geling mir nicht so). So ungefähr sieht meine derzeitige Idee für eine Mitarbeiterklasse aus. Im Kern dieser Klasse wird die Tabelle Mitarbeiter gekapselt, sowie der Zugriff auf alle anderen Miarbeiter bezogenen Daten(Also nicht für jede Tabelle eine eigene Klasse, sondern nur für die Kerntabelle).

                      Da ich sehr oft in diesem Projekt oft alle Mitarbeiter_id's und Namen benötige(für Dropdown Felder), hatte ich diese Abfrage bisher in einer ausgelagerten Funktion. Wäre es vielleicht sinnvoll, dass mit in die Klasse aufzunehmen(sozusagen statisch)?? Da dies aber keinen dirketen Bezug zu einem Mitarbeiter hat, habe ich es erst ausgelagert gelassen.

                      Was meint Ihr dazu? Wie könnte man dies verbessern? Ich helft mir echt ungemein, da mir sehr viele Lösungsansätze durch meinen Kopf schwirren und ich irgendwie nicht den richtigen finde.

                      Vielen Dank und Gruss


                      Datenstruktur:

                      mitarbeiter
                      --------------
                      - mitarbeiter_id(pk)
                      - name
                      - weitere Stammdaten

                      rechte
                      ---------
                      - recht_id
                      - beschreibung


                      mitarbeiter_rechte
                      -------------------
                      - recht_id(pk)
                      - mitarbeiter_id(pk)

                      staedte
                      --------
                      - stadt_id(pk)
                      - stadt_name

                      mitarbeiter_staedte
                      -------------------
                      - stadt_id(pk)
                      - mitarbeiter_id(pk)

                      PHP-Code:
                      class Mitarbeiter
                      {
                          var 
                      $iId 0;
                          var 
                      $sName;
                          
                      //weitere Stammdaten,sowie set/get Methoden aus Platzgründen entfernt.
                          
                      var $aRechte = array();
                          
                      //Bei den Staedten das selbe wie mit den Rechten.

                          
                      var $oDb;
                          var 
                      $oValidate;

                          function 
                      Mitarbeiter(& $db, & $validate)
                          {
                              
                      $oDb = & $db;
                              
                      $oValidate = & $validate;
                          }
                          function 
                      setId($id)
                          {
                              if (!
                      $this->oValidate->isValidId($id))
                                  return 
                      false;
                              
                      $this->iId $id;
                              return 
                      true;
                          }
                          function 
                      setName($name)
                          {
                              if (!
                      $this->oValidate->noSpecialChars($name))
                                  return 
                      false;
                              
                      $this->sName $name;
                              return 
                      true;
                          }
                          function 
                      getId()
                          {
                              return 
                      $this->sName;
                          }
                          function 
                      getName()
                          {
                              return 
                      $this->sName;
                          }
                          function 
                      setRechte(& $rechte)
                          {
                              if (!
                      is_array($rechte))
                                  return 
                      false;
                              
                      //Überprüfung der Daten noch mittels $oValidate und Generierung des SQL Statements...
                              
                      return $this->db->Execute($sSql);
                          }
                          function & 
                      getRechte($id)
                          {
                              return 
                      //array der Ergebnismenge der Rechte
                          
                      }  
                          function 
                      insert()
                          {
                              
                      //Prüfung ob alle Pflichtfelder gefüllt sind...
                              
                      return $this->db->Execute(/*Membervariablen*/);
                          }
                          function 
                      delete()
                          {
                              
                      //Löschung aller Mitarbeiterdaten per Transaktion
                          
                      }


                      Kommentar


                      • #12
                        ich habe mit das jetzt noch sooo genau angesehen... aber ALLES, und das alles ohne ausnahme, gehört in die class rein, was mit dem mitarbeitern zu tun hat.

                        schaue dir mal happy's UM an.

                        sowas wie die übergabe eines anderen objects sollte damit nicht von notwendigkeit sein und auch unnötig werden.

                        auch solltest du hier noch ein & vor den funktionnamen setzen.

                        function [color=red]&[/color]Mitarbeiter(& $db, & $validate)
                        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                        Kommentar

                        Lädt...
                        X