I believe this is where I will make a fool of myself, but I will give it a shot anyway.

1. Yes, we scratch built the system in house.
2. Your correct, if we make a change to the schema of the database we have to represent that change in data model. If we remove something from the database and don't reflect that change in the data model the system complains. However, this seems like a very small price to pay. The data model is the representation of all the objects in the system. If I want to know what is in an object, I go to the data model and check its relationships and attributes. The methods for each object are not in data model, they are defined in the 3. Our system is not zero configuration. If you want access to something in the db you have to put it in the data model. We also have to configure all our db brokers.
In our system all we have to do is load the parent  object:

$Hans = new Person();
$Hans->SetId($PersonID);
$Hans->Populate();

I now have access to all the objects that $Hans knows about. If I want to update Hans:

$Hans->Name = 'Sue';
$Hans->Update();

If the Person object knows about the address object and the address object knows about the location object (which is all defined in the data model) I access them by:

$Lattude =  $Hans->HomeAddress->Location->Latitude;

It should be noted that we have ways of defining a name for a relationship in an object. So, we might call the address relationship for the person object HomeAddress and only select home addresses when we call $Hans->HomeAddress. If we called $Hans->Address, if we defined it, we might get back a set of all of Hans' addresses. In which case we have an iterator to go over them. $Hans->Address[0], $Hans->Address[1], ect.

The ORM fetches the relations and data automatically. If we eager loaded it, it will already be in the object, if we didn't eager load it, the system makes the sql calls to find it just in time. We define on a per relationship level if we are going to eager load or not. As you can imagine, eager loading is expensive.

I am truly not the expert here, I am not even sure how it all works on the inside. I leave it to those smarter then me to work it out. What I can tell you is that it currently works for us.

The blog post by Ted Neward is a very interesting read. Now I am going to pay attention to where we fall victim to his assertions.

Hans
http://www.cyberxdesigns.com


   Is this a system you've built in-house?

I've certainly seen places where ORM was as much of a problem as it was a solution. On the other hand, I've done more than my share of maintainance on applications where sql code is distributed throughout the application, and (worse) applications where people developed a database layer which encapsulated bad practices and bad assumptions about the problem domain.

One basic trouble with ORM is that it violates the principle of "don't repeat yourself;" you have to maintain a database schema ~and~ an object hiearchy. Change one, and you have to change the other. Another problem is that there is a semantic mismatch between objects and sql -- there are three ways to represent inheritance relations in sql, and all three are unsatisfactory in some way.

I've been working lately with a minimalist "active record" that introspects the database, and lets you write something like

$table=$db->{my_table}
$row=$table->fetch($id);
$row->{count_value}=77;
$row->update();

it saves a lot of fumbling with 'addslashes' or '?' parameters, thus eliminating a common kind of repetitive coding. It doesn't try to map database 'rows' to anything else, but it can still automate certain aspects, such as timestamping changes to rows, and keeping an archive of who changed what when. I've been trying to develop something that does 20% of the work and eliminates 80% of the pain of writing "plain old" applications with lots of SQL. So far the system is zero-configuration, although I'm sure I'll add features to it someday that require some configuration -- for instance, I do see an easy way to implement a certain kind of inheritance.

ORM systems do get interesting, however, in architectures that really take advantage of the objects. For instance, if you can design your objects so that aspects cut across them, you can build really powerful systems quick.



_______________________________________________
New York PHP Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

NYPHPCon 2006 Presentations Online
http://www.nyphpcon.com

Show Your Participation in New York PHP
http://www.nyphp.org/show_participation.php




--
Hans C. Kaspersetz
Cyber X Designs

Office: 201-558-7929
Mobile: 201-681-4156
[EMAIL PROTECTED]
http://www.cyberxdesigns.com

_______________________________________________
New York PHP Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

NYPHPCon 2006 Presentations Online
http://www.nyphpcon.com

Show Your Participation in New York PHP
http://www.nyphp.org/show_participation.php

Reply via email to