Meinungen zu neuem(?) ORM-Ansatz gesucht

Meinungen zu neuem(?) ORM-Ansatz gesucht

am 26.01.2007 13:14:11 von Axel Tietje

Hallo 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.