Hi Shahar
It's a hairy one for sure! I've seen a lot of XML/config solutions
whereby you 'synch' your class definitions with your database (or
similar) to negate the need for frequent calls to determine the table/
row structure. The current solution in Zend_Db_Table is definitely
wasteful and I think it's where a lot of work is needed.
I had toyed around an idea whereby you could manually describe your
table structure within the class by defining certain properties, thus
overriding the need for the describe() method. If it didn't exist
when the class was instantiated then the default describe methods
could be used and, as you say, it would be great if you could pass an
instance of a cache to a DB adapter so that you could retrieve the
definition locally.
E.g.
MyClass extends Zend_Db_Table
{
protected $_name = 'mytable';
protected $_row = 'MyClass_Row';
protected $_schema = array('id' => array('type' => 'integer',
'null' => false),
'name' => array('type' => 'text',
'null' => true),
'description' => array('type' =>
'text'));
protected $_primary = 'id'; // or could be array('name',
'description') for multi-key tables
}
Obviously a quick'n'dirty idea, but it demonstrates how a developer
could easily maintain their tables and dispense with more weighty
solutions. It could also be possible to point a config file for table
definitions if desired, or to simply pass a $config instance.
The reasoning behind this kind of 'manual' override is that despite
some labour-intensive work by the developer in the first instance
(manually tracking changes to table definitions and ensuring the
class is up-to-date) it removes the need for all sorts of fancy
(=intensive) ways of achieving the same end. If manual definitions
are in place then it also allows for the developer to potentially
create foreign key relationships, triggers, etc in pure PHP rather
than necessarily rely on the DB engine (like MySQL 4.x MyISAM tables).
But if you were more keen to use a 'live' schema then you could leave
the $_schema property undefined and you could retrieve that
information in a similar fashion to the present solution (although
utilising the caching mechanism).
The other instance I saw potential improvements was to allow each
Zend_Db_Table class access to a registry of Db's so that each
individual table instance didn't need to store an internal copy of
the Db connection, bypassing the problems associated with serialised
instances. In many (most?) cases the class really only accesses the
database once to retrieve a row or rowset and then may only
infrequently save back to the database if at all, so it seems
unnecessary to store this supplementary information. At most you'd
want to refer to a table structure from the row/rowset but that'd be it.
Perhaps a Zend_Db_Scheme or Zend_Db_Registry helper class may be of
use here?
Anyhoo, look forward to your findings! Could you post them on the
proposal as well as discussing ideas here so that we can track these
ideas and comments?
Cheers
> Hi,
>
> Maybe I just need to RTFM but this one is a quickie: Is there a
> caching
> solution for Zend_Db_Adapter_xxx::describeTable() ?
>
> That one gets called quite frequently, and is very unlikely to
> change in
> production environemtns. Caching it somehow would be a smart idea.
>
> If nobody has suggestions, I'll do some hacking later and post an
> article about it.
>
> TIA,
>
> Shahar.
--
Simon Mundy | Director | PEPTOLAB
""" " "" """""" "" "" """"""" " "" """"" " """"" " """""" "" "
202/258 Flinders Lane | Melbourne | Victoria | Australia | 3000
Voice +61 (0) 3 9654 4324 | Mobile 0438 046 061 | Fax +61 (0) 3 9654
4124
http://www.peptolab.com