php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.04.2010, 15:48  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard DB-Modell in OOP richtig aufbauen

Ich bin zwar gerade ziemlich verwirrt, versuche aber trotzdem mal mein anliegen einigermaßen auf den Punkt zu bringen.

Ich versuche gerade ein eigenes kleines Framework zu schreiben dass mir einige standartabläufe abnimmt. Nun bin ich an dem Punkt angekommen wo ich mir überlegt habe ob es nicht Sinn macht für die Datenbank ebenfalls einige standartabläufe zu automatisieren. Zum Beispiel die komplizierteren Selects in Methoden zusammenzufassen. Doch wie baut man sowas auf?

Nun zerbreche ich mir darüber schon seit Tagen den Kopf. Wie man sowas aufbaut ohne wieder irgendwann wieder in einer sackgasse zu landen und alles wegwerfen zu müssen (Hatte schonmal eine DB-Klasse die aber irgendwann zu komplex und dadurch aufwendiger als der SQL-String selbst wurde).

Jetzt habe ich mir folgendes überlegt:

1. Erstellung einer klasse die sich um die verbindung und kommunikation zur DB kümmert (PDO-Object, Select-/Insert-Methode etc.).

Soweit alles ok.

2. Für jede DB-Tabelle eine eigene Klasse die die abgefragten Daten auffangen kann und somit einen schlüßigen Zugriff im PHP-Code ermöglicht.

PHP-Code:
class benutzer {

    private 
$id;
    private 
$vorname;
    private 
$nachname;

}
class 
benutzerrechte {

    private 
$id;
    private 
$bezeichnung;
    private 
$beschreibung;


Soweit ist für mich auch noch alles schlüßig, da aber jeder Benutzer mehrere Rechte haben kann, gibt es natürlich auch eine benutzer_zu_benutzerrechte tabelle die eine n:m beziehung herstellt. Jetzt währe aber folgende klasse aus meiner sicht vollkommen sinnfrei:

PHP-Code:
class benutzer_zu_benutzerrechte {

    private 
$benutzer_id;
    private 
$benutzerrechte_id;


Jetzt überlege ich hin und her und komme auf keinen grünen zweig. Soll ich die Klasse benutzer_zu_benutzerrechte weglassen und stattdessen lieber eine weiteres attribut in der Klasse Benutzer hinzufügen dass dann mit instanzen der Klasse benutzerrechte befüllt wird?

PHP-Code:
class benutzer {

    private 
$id;
    private 
$vorname;
    private 
$nachname;

    private 
$benutzerrechte = array();


Was wenn es dann noch weitere n:m verbindungen nach benutzerrechte gibt?

Daher die Grundsatzfrage, wie stellt man ein DB-Modell sinnvoll in OOP dar? Gibt es dazu Tutorials/lektüren?

Gruß
Squall
Squall ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.04.2010, 15:52  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.991
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Zum Beispiel die komplizierteren Selects in Methoden zusammenzufassen.
Was auch immer das heißen mag - ein Tipp: Fang beim Aufruf an. Wie könnte das elegant aussehen, wenn Du Dir eine einigermaßen komplexe Query ausdenkst und diese mal aus Objekten/mit Objektzugriffen zusammensetzt? Wenn DU einen guten Weg findest, hast Du sozusagen gleich Dein Interface definiert.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 29.04.2010, 09:30  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

Ich weiß nicht ob ich dich richtig verstanden habe aber bei mir kommt dann z.b. dass raus:
PHP-Code:
class benutzer {

    private 
$id;
    private 
$vorname;
    private 
$nachname

    
$benutzerrechte = array();
    
    
findeBenutzerrechte() {
        
$rechte = new benutzerrecht();
        
$rechte $rechte->findeRechteEinesBenutzers($this->id);
    }
    
}

class 
benutzerrecht {

    private 
$id;
    private 
$bezeichnung;
    private 
$beschreibung;
    
    function 
__construct($daten = array()) {
        if(
count($daten) > 0) {
            
$this->id $daten->id;
            
$this->id $daten->bezeichnung;
            
$this->id $daten->beschreibung;
        }
    }
    
    function 
findeRechteEinesBenutzers(benutzer_id) {
        
$sql 'SELECT br.* FROM benutzerrechte AS br JOIN benutzer_zu_benutzerrechte AS bzr ON bzr.benutzerrechte_id=br.id WHERE bzr.benutzer_id =' $benutzer_id;
        
$result $db->query($sql);
        
$ergebnis $resukt->fetchAll();
        
$return = array();
        foreach(
$egebnis as $recht) {
            
$return[] = new benutzerrecht(recht);
        }
        return 
$return;
    }
    

Wenn wir jetzt annehmen dass die benutzerrechte auch zu einer anderen Tabelle eine n:m beziehung hat und diese wiederrum dass selbe, dann bläht sich der Parameter $benutzer->benutzerrechte dermaßen auf und ist voll mit arrays. Ich würde es aber bevorzugen mit Objekten zu arbeiten daher bin ich mir eben nicht sicher ob das der richtige weg ist.
Squall ist offline  
Alt 29.04.2010, 09:44  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Was auch immer das heißen mag.
für mich klingt das ganze nach einem ORM. schau auf dem Links wie dort das ganze zusammengesetzt ist.

Jedoch ich bin persönlich ein freund von eigener SELECT querys, ich denke es ist besser für eine anwendung einfach eine SQL query an den server zu schicken, anstatt die query dir erstmal zusammen zu basteln mit irgendwelchen methoden und danach erst die query an den server zuschicken. da ist halt ein zwischenschritt der eigentlich unnötig ist, meiner meinung nach

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Alt 29.04.2010, 09:52  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Hi,

geht es dir bei diesem Thema um den Aufbau deiner Datenbankklasse, den deiner Abfragen oder nur um die Umsetzung des Datenbankdesigns in Klassen und Objekte?

Chriz hatte mir mal den Tipp gegeben, mit Managern zu arbeiten, die sich um die Kommunikation mit der Datenbank kümmern. Die Datenbankabfragen verbannst du also aus den Klassen Benuzer und Benutzerrechte, um die Abhängigkeiten der Klassen von der Datenbank zu lösen.

Natürlich ist es der Benutzer, der die Rechte hat und darum kannst du ihm diese auch als eine Eigenschaft zuweisen. In deinem Array speicherst du dann die Objekte der Klasse Benutzerrechte. Mit diesen Objekten kannst du dann ja prima weiterarbeiten.

Ein paar weitere Tipps kannst du dir vielleicht noch aus diesem Thema holen: http://www.php.de/php-fortgeschritte...-auslesen.html (Objekt als Attribut eines weiteren Objekts. Wie ordentlich auslesen?).

Gruß
Asipak ist offline  
Alt 29.04.2010, 09:56  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von BlackScorp Beitrag anzeigen
Jedoch ich bin persönlich ein freund von eigener SELECT querys, ich denke es ist besser für eine anwendung einfach eine SQL query an den server zu schicken, anstatt die query dir erstmal zusammen zu basteln mit irgendwelchen methoden und danach erst die query an den server zuschicken.
Wie schon erwähnt:

Zitat:
Zitat von Squall Beitrag anzeigen
Hatte schonmal eine DB-Klasse die aber irgendwann zu komplex und dadurch aufwendiger als der SQL-String selbst wurde
Mir geht es um dass Grundverständnis bei n:m beziehungen. Wie spiegeln sich solche im Code wieder? wo werden die dadurch referenzierten Daten gespeichert? usw.

Edit: Lese mir jetzt erstmal das Thema durch das Asipak gepostet hat.
Squall ist offline  
Alt 29.04.2010, 09:59  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

du könntest ja statt komplizierten querys ein view anlegen mit dem komplizierten query und dann im code die query vereinfachen. ungefair so:

im phpmyadmin folgende query
PHP-Code:
CREATE VIEW user_has_rights AS
SELECT br.* ,bzr.benutzer_id as user_id FROM benutzerrechte AS br JOIN benutzer_zu_benutzerrechte AS bzr ON bzr.benutzerrechte_id=br.id 
dann brauchst du im code nur noch

PHP-Code:
SELECT FROM user_has_rights WHERE user_id $user 
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Alt 29.04.2010, 10:43  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

@Blackscorp
Über Views bin ich bei meinen Recherchen auch gestoßen, allerdings muss ich zugeben das Prinzip dahinter nicht ganz verstanden zu haben und habe es deswegen noch nach hinten geschoben. Vielleicht verstehe ich es ja wenn ich es später nochmal durchlese.

@Asipak
Es geht um die Umsetzung des Datenbankdesigns in Klassen und Objekte und genau diesen Denkanstoß habe ich gebraucht. Das Prinzip mit den Managern hört sich ganz sinnvoll an. Darauß resultiere ich dass zu jeder DB-Tabelle die auch etwas physisches darsetellt, ein Objekt existiert dass sich auch nur mit diesem Objekt befasst und nicht damit wie es befüllt wird. Die Manager kümmern sich dann um die Datenbeschaffung und verarbeitung.

Wenn keiner wiederspricht, bin ich wohl auf dem richtigen weg. Ich werde dann erstmal ein bisschen damit rumspielen und mich dann wieder zurückmelden

Danke erstmal
Squall ist offline  
Alt 29.04.2010, 11:12  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

das prinzip von views, könnte man so verstehen, dass du eine SQL query als eine tabelle abspeicherst, jedoch im code das view wie eine tabelle verwenden kannst. das view bezieht sich jedesmal aus anderen tabellen. d.h im eigentlichen view brauchst du keine daten einzufügen oder bearbeiten, das machste in den tabellen aus dem sich das view bezieht. das view wird auch dann nur die spalten besitzen, die du in der selectanweisung angesprochen hast. alle anderen spalten aus den beziehenden tabellen, werden ignoriert.

noch eine kleine nebensache. verwende InnoDB als engine und verwende Foreign Keys mit ON DELETE/UPDATE CASCADE befehl. ich hatte früher mal probleme dass wenn ich zb ein user gelöscht habe, so musste ich auch aus der tabelle rights die rechte entfernen und alle anderen dinge , die der user gemacht hat und was in die tabelle eingetragen wurde. nun brauche ich den user einfach zu löschen und alles was zu dem user dazugehört, wird automatisch gelöscht. d.h du brauchst dich dann im code nur darum zu kümmern wohin, was reinkommt, die views generieren dir das , was du tatsächlich am ende anzeigen willst, und wenn sich ein datensatz ändert, so wird es mit CASCADE automatisch in allen tabellen mitübernommen.
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Alt 29.04.2010, 13:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.991
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Views verführen allerings zum lazy Umgang mit Tabellen und Joins. Eine Query mit echten JOINS dürfte in den meisten Fällen performanter sein.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
CSS-Datei nicht richtig eingebunden. Paul.Schramenko HTML, Usability und Barrierefreiheit 2 24.04.2010 08:56
Einstieg in die OOP + Frage ob mein Gedankengang richtig ist Rikaan PHP Tipps 2010 5 19.04.2010 13:56
Datenbank richtig aufgebaut? bageleudi Datenbanken 2 31.03.2010 21:01
gleich oop lernen oder erst mal prozedural programmieren? Voltage PHP Tipps 2010 7 22.01.2010 16:46
100% OOP wirklich sinnvoll ? Pehapeh PHP-Fortgeschrittene 31 04.12.2009 11:19
Was bringt OOP wenn Objekte nach jeder Seite sterben? majorbenks PHP Tipps 2009 9 18.11.2009 14:11
Eure Tipps/Hinweise/Empfehlungen zum Thema Modellierung und OOP ChillSn Off-Topic Diskussionen 1 30.09.2009 15:19
parameter von interfaces in klassen richtig mit anwenden? litterauspirna PHP Tipps 2009 27 30.06.2009 20:58
Wer hilft mir bei OOP? echo Beitragsarchiv 27 23.02.2009 16:12
[Erledigt] Javascript-Code in einem document.write richtig durchführen + richtiges Po BartTheDevil89 JavaScript, Ajax und mehr 15 29.11.2008 14:08
Projekt sucht für Teilbereiche Schüler o.ä. für PHP OOP Entwicklung gegen Bezahlung mrmojo Beitragsarchiv 0 20.11.2008 23:41
PNG's werden im IE6 nicht richtig angezeigt! litterauspirna Off-Topic Diskussionen 6 15.09.2008 15:13
Box Modell Problem zwischen Internet Explorer 6 und FireFox DonTermi HTML, Usability und Barrierefreiheit 5 07.12.2006 16:30
[Erledigt] Modularisierung: Wie macht man es richtig? PHP-Fortgeschrittene 1 12.03.2006 16:00
Datenbankverbindung zu Oracle 9.2 aufbauen. PHP Tipps 2004-2 2 26.11.2004 20:21

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/php-einsteiger/67402-db-modell-oop-richtig-aufbauen.html, db modell, datenbank richtig aufbauen, oop modellierung, php db model, oop model, oop db klasse, php oop datenbank klasse, php datenbank oop, php db oop, php db models, squall-modellflugzeug, php oop db, php rechte klasse, oop- tabellen aus datenbank holen, php oop richtig, db class oop php, oop modell, db modell aufbauen, php model db

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:38 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum