> > Generally I try to minimise the layers/tiers/abstraction between
> > the front-end and the database - for me OO/SQL abstraction is something
> > akin to 'GOTO considered harmful'.
>
HI Mark,
I'm not sure about a monolithic SQL factory module like the one
you describe. Generally, each SQL statement is unique so I've never been
able to find re-use benefits here. Also passing parameters to SQL Factory
methods involves another change of scope/layer which I think is not
necessary.
In our system, a programmer maintaining the system will look to
the object first and find the SQL bang in the middle - which I think has
better re-use/maintenance implications than hidden away in a back closet
that's packed full of stuff (i.e., all the SQL).
One way I minimise the layers between DB and the front-end is to
make sure all fields share the same name as in the database - someone has
already mentioned this technique.
This follows the design tenet - a unit of data should have only
one name throughout the entire system.
Perl has a great feature: 'slippery typing' (as opposed to Java's
strong). This enables me to pass a database row hash -> to an object
constructor -> to a controller -> to a view.
In my case the view is typically a HTML template holding tokens of
the form: {{database-field-name}}.
For example, when a search occurs on Turbo10 the following happens:
* Engine Object - contains SQL - returns a DBI row hash
* Hit Object - is constructed with this DBI row hash
* BrowserMessenger Object - formats Hit in Javascript for tranmission to
browser using a Template
* Template Object - uses the same field names from the DBI row
hash to replace tokens
In this way, I try to minimise the interfaces going from the
database to the browser - and the SQL stays inside the objects that use
it.
Does anybody else want to confess to something similar? (-;
Nigel
> I think there's room for middle ground here between mapping OO directly
> to SQL and having SQL in heredocs in your code. What we tend to use is a
> object that works almost as a SQL factory. We never have SQL directly in
> our code, but rather all this is placed inside a seperate module.that
> knows a few things about itself - e,g, what database and table we're
> using for this run. This can be then used to spit out SQL or run the
> query and return the results.
>
> The key aspect is that anytime you feel you need to write some SQL you
> should feel free to add more SQL to this module - not limit yourself to
> waht's already avalible.
>
> The advantage of this is that we get better reuse in out of our SQL when
> we need the same function called from many places, and we can reuse the
> same SQL on similar tables/databases for different runs. Another
> advantage is that should we ever want to change the database all our SQL
> is in a few modules and we can make sure that we change all our SQL.
>
> Mark.
>
>
--
Nigel Hamilton
Turbo10 Metasearch Engine
email: [EMAIL PROTECTED]
tel: +44 (0) 207 987 5460
fax: +44 (0) 207 987 5468
________________________________________________________________________________
http://turbo10.com Search Deeper. Browse Faster.