Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Datenbanken, Server, Betriebssysteme und sonstige Programmiersprachen > Anwendungsdesign / Softwarearchitektur > Grundlegende Überlegungen zur Umsetzung eines umfangreichen Models
Antwort
 
Themen-Optionen
Alt 29.10.2006, 09:35   Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Grundlegende Überlegungen zur Umsetzung eines umfangreichen Models

Guten Morgen,
nun, wie ich ja schon hier öfter erzählt habe arbeite ich derzeit an einem etwas größeren, aber privaten, Projekt. Da meine "Software" auch irgendwann mal an die Öffentlichkeit gehen soll, habe ich mich aus Kompatibilitätsgründen für ein etwas ausführlicheres Model entschieden (mein Script basiert auf dem MVC-Prinzip). Vorweg: Auf ein bestehendes ModelFramework o.ä. möchte ich nicht zurückgreifen.

Derzeit habe ich nur ein Model, MySQL, jedoch ist dies noch lange nicht in die Richtung programmiet, in die ich das später haben möchte.
Letztendlich gibt es verschiedene (persistente) Datenströme die ich abfragen können möchte, wie beispielsweise pgSQL, msSQL, (access?), mySQL und auch XML. Ich mache mir seit einiger Zeit Gedanken darüber, wie ich denn die Schnittstelle realisieren könnte. In einer kleinen PHP-Testdatei, in der ich derzeit etwas rund um das Thema Model rumspiele, habe ich schon mal einen kleinen Wrapper aufbereitet (wie immer, aus Kompatibilitätsgründen noch als PHP4).
PHP-Code:
<?php
class Model {
        
/**
         * Returns an instance of the model object
         *
         * @return resource
         */
        
function getModelInstance() {
                
$sWrapper Model::getWrapper();
                switch(
$sWrapper) {
                        case 
'MySQL':
                                return new 
MySQLWrapper;
                                break;

                        case 
'XML':
                                return new 
XmlWrapper;
                                break;

                        case 
'PgSQL':
                                return new 
PgSQLWrapper;
                                break;
                }
        }

        
/**
         * Returns the used wrapper, e.g. MySQL, pgSQL, XML ..
         *
         * @return string
         */
        
function getWrapper() {
                
// return Configuration::getSelectedModel();
                
return 'MySQL';
        }
}
?>
Die Klasse ist weder vollständig, noch dokumentiert, noch sonstetwas, sie dient mir ja nur dazu, etwas lauffähiges in meiner Testdatei zu haben.

Eine Instanz erstelle ich mir dann hiermit:
PHP-Code:
<?php
$oModel 
Model::getModelInstance();
?>
Ich hoffe zumindest, das meine Gedankenansätze bis hier hin richtig sind
Einfache Abfragen, wie etwa diese, habe ich auch schon umgesetzt:
PHP-Code:
<?php
MySQLWrapper 
-> loadDataset('usertable',
                            array(
'username''allowsHtmlEmails''emailAddress'),
                            array(
'status' => 'moderator',
                                  
'allowsEmailNotices',
                                  
'modSection' => array(
                                          
'forum''chat'
                                          
),
                                  
'isActivated' => '1'));

// ergibt:
/*
SELECT
    `a.username ,`a.allowsHtmlEmails ,`a.emailAddress`
FROM
    `usertable` AS a
WHERE
    `status` = 'moderator' AND
    `allowsEmailNotices` = '1' AND
    `modSection` = 'forum' OR `modSection` = 'chat' AND
    `isActivated` = '1'
*/
?>
Es ist natürlich wahnsinnig umständlich, sämtliche SELECT / FROM / WHERE / JOIN Statements unterzubringen. Immerhin stelle ich mir solche Aufrufre recht umständlich vor, geschweige denn die Umsetzung in mySQL-Code:
PHP-Code:
<?php
// MySQLWrapper -> loadDataset(tables, columns, whereStatements)
MySQLWrapper -> loadDataset(
                  array(
'userpictures' => 'up',
                        
'usertable' => array(
                            
'JOIN' => 'LEFT',
                            
'SHORTCUT' => 'u')
                       ),

                  array(
                      array(
'pictureID''picturePath'),
                      array(
'userID''userName')
                       ),

                  array(
                      array(
'pictureIsActivated' => '1'),
                      array(
'userHasPicture' => '1')
                 );
?>
Meine konkreten Fragen sind also, liege ich auf dem richtigen Weg und wenn nein, was kann ich besser / anders / performanter machen?
Wie realisiere ich solche komplizierten JOIN-Abfragen?
Und wie kann ich Abfragen mit >, < bzw != Operatoren durchführen?

Ich bedanke mich im Vorraus für die Hilfe

//edit
Anstößigen Thread http://forum.developers-guide.net/showthread.php?t=4630 habe ich mir natürlich durchgelesen, aber da das THema eher Richtung propel abdriftet, habe ich hier mein extra Thread erstellt
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (29.10.2006 um 09:47 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.10.2006, 14:02   Nach oben    #2
axo
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Chr!s Beitrag anzeigen
Meine konkreten Fragen sind also, liege ich auf dem richtigen Weg und wenn nein, was kann ich besser / anders / performanter machen?
nein, du liegst nicht auf dem richtigen weg. implizite konfiguration durch arrays, schwächste typisierung etc. führen bei jedem auch nur mittelgroßen projekt zu größtem chaos. je größer ein projekt, desto mehr werden strenge typisierung und explizite methodennamen wichtig.

besser machen?
* propel oder einen ähnlichen code-generator verwenden, spart redundante arbeit und fehler. bis zu CRUD ist alles immer das gleiche.
* nicht derart dynamisch arbeiten: niemand wird die blöden tabellenspalten umbenennen wollen und erwarten, dass dein code immer noch läuft. wenn man deine software installieren soll, kannst du ruhig erwarten, eine leere datenbank zur verfügung zu haben. ansonsten kannst du mit einem tabellen-präfix arbeiten. mehr nicht. mit einer derartigen indirektion bekommst du nur probleme. hast du schonmal mit den PEAR-factories gearbeitet? das schlimmste, was man haben kann.

* no magic numbers, no magic strings: statt createDatabaseHandle('mySQL') solltest du eher createMySQLDatabaseHandle() verwenden. ersteres findet dir im fehlerfall kein debugger, beim zweiteren hilft dir jede IDE beim entwickeln.

Zitat:
//edit
Anstößigen Thread http://forum.developers-guide.net/showthread.php?t=4630 habe ich mir natürlich durchgelesen, aber da das THema eher Richtung propel abdriftet, habe ich hier mein extra Thread erstellt
die lösung für dein problem ist aber ebenfalls ein code-generator oder was ähnliches. du könntest dir z.b. auch mal genau anschauen, wie propel das "Query Object" (in ihrem fall heißst das ding "Criteria") zusammengestellt hat, und evtl. kannst du dir eine eigene Query Object-struktur bauen, die ähnlich oder besser arbeitet.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.10.2006, 14:40   Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
die lösung für dein problem ist aber ebenfalls ein code-generator oder was ähnliches.
Könntest du (oder jemand anderes) vielleicht mir mal etwas näher erklären, wie so ein code-generator funktionieren soll, bzw was ich mir darunter vorstellen muss? Ich kann nämlich nichts mit dem Begriff anfangen..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.10.2006, 15:08   Nach oben    #4
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

Du definierst dein Model als zB. xml und der Codegenerator erzeugt daraus den PHP Code.
Byrel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.10.2006, 17:51   Nach oben    #5
axo
Gast
 
Beiträge: n/a
Standard

... und erzeugt daraus optimalerweise php-code, der als objekt-relationales mapping die CRUD (create, update, delete)-funktionalität in generierter form übernimmt, optimalerweise die eingabeformulare generiert und so weiter. du könntest aber auch einfach mal bei http://propel.phpdb.org vorbeischauen und dich weiter informieren.

grüße
axo
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.10.2006, 13:10   Nach oben    #6
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

Ich würde auch davon abraten, dass selber zu bauen, weil Dir offensichtlich das Wissen fehlt, wie das eigentlich funktionieren soll.
Das fängt damit an, dass das was Du Model nennst (in deinem Code), kein Model im Sinne eines MVC ist, sondern nur eine Daten(bank)-Abstraktion. Model-Frameworks wie ActiveRecord liefern erst dann ein Model, wenn man per ORM Klassen an die Daten bindet, so dass die herauskommenden Objekte "business logic" enthalten und das Model sind.

Ausserdem setzt Du mit deinem bisherigen Ansatz auf der völlig falschen Ebene an, Du versuchst einfach nur, SQL nachzubauen. Das mag auf Basis einer Kombinator-Basierten DSL durchaus Sinn machen, für diese verschachtelten Arrays hab ich aber wenig Hoffnung, v.a. wenn Du jetzt noch keine Ahnung hast, wie das am Ende aussehen soll, wird das nicht endlos erweiterbar sein und einfach im Chaos enden.

Wenn Du weisst worum es geht, und am besten mal mehr als einen Ansatz für Model- oder Datenpersistenz-Frameworks gesehen hast, kannst Du sowas selber machen.

Zitat:
verschiedene ... Datenströme ..., wie beispielsweise pgSQL, msSQL, (access?), mySQL und auch XML.
Daten ja, Ströme nein.
Waq ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 Aus


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:47 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44