Meinungen zu neuem(?) ORM-Ansatz gesucht
am 26.01.2007 13:14:11 von Axel TietjeHallo zusammen,
ich habe eine PHP-Applikation (fast fertig) programmiert, die dazu dient,
PHP-Objekte in einer Datenbank zu speichern, zu suchen und auszulesen.
Ãhnliche Zeile verfolgen z.B.
PHPDoctrine (http://www.phpdoctrine.com/)
Propel (http://propel.phpdb.org/trac/)
EZPDO (http://www.ezpdo.net/)
und andere mehr. Die haben mir aber nicht besonders gut gefallen ;-)
Ich verfolge u.a. diese Ziele:
- Möglichst einfach zu verwenden
- Klassendefinitionen ohne Vererbung wie z.B. class Autor extends ActiveRecord
- keine Konfigurationsdatei / XML-Dateien / 'Stage-Phase' oder so
- zusätzliche Funktionen für Event-Handling optional in den Klassen selbst
- Klassenattribute haben keinen festen Typ z.B.
$o1 = new ClassX;
$o2 = new ClassX;
$o1->foo = 'bar';
$o2->foo = 100;
- Speicherung von n-dim Arrays. z.B.
$o1->arr[0][â¦]['x'] = 'foo';
$o1->arr[0][â¦]['y'] = 123;
Mein Ansatz sieht in der Anwendung so aus:
/**
* Klasse laden, mit DB verbinden
*/
require_once 'ODB.php';
$om = ODB::singleton(array('DSN'=>'mysql://user:pass@localhost/tes t'));
/**
* Wir haben 2 Klassen, die in der DB gespeichert werden sollen.
* - klassisches Autor-Buch-Bespiel,
* - ohne viele Kommentare, damit's nicht zu lang wird
*/
class Autor {
public $name = '';
public $buecher = array();
// Beipiel für einen Event-Handler
public function onDelete () {
// mach was sinnvolles...
}
}
class Buch {
public $titel = '';
public $isbn = '';
}
/**
* Buch und Autor erzeugen
*/
$b = new Buch;
$b->titel = 'Die Buddenbrooks';
$b->isbn = '3596294312';
$a = new Autor;
$a->name = "Thomas Mann";
// Buch dem Autoren zuweisen
array_push($a->buecher, $b);
/**
* Speichern
* $b wird mit gespeichert, da in $a enthalten,
* alternativ: $om->store($a, $b);
*/
$om->store($a);
/**
* Suchen (Parser / Caches sind noch nicht fertig)
* "Query by example" ist nicht vorgesehen
*/
$res = $om->query("
SELECT Autor.name,
Buch.titel
FROM Autor, Buch
WHERE Autor.Buch:buecher[*].isbn = '3596294312'");
/**
* Ergebnisse ausgeben (API noch nicht endgültig)
*/
while ($res->fetchInto($obj)) {
echo "{$obj->Autor->name} hat '{$obj->Buch->titel}' geschrieben.\n";
}
// oder: Autoren aus DB lesen
$res->reset();
while ($res->fetchInto($obj)) {
$a = $om->fetch($obj->Autor);
}
// oder: Autor per ID auslesen:
$a = $om->fetch(1);
?>
Kurzer "Benchmark" auf einem Athlon 64 3000+ mit 2GB RAM,
MySQL 5.0 mit InnoDB Tabellen und PHP 5, ohne Caches:
Einfügen von 20000 Autoren (s.o.): 2,24 s
Einfügen von 20000 Büchern (s.o.): 2,63 s
SELECT-Query aus Beispiel oben *): 0,34 s
Auslesen der Daten von 1000 Autoren: 0,01 s
Rückgabe als 1000 PHP-Objekte: 0,07 s
*) SELECT-Query ohne Cache manuell auf der Konsole,
da der Query-Parser noch nicht fertig ist
Was haltet ihr davon?
Ich bitte um eure Meinungen / Vorschläge zu diesem Projekt... Danke!
Axel.