[Catalyst] Pager and Cache

Mitch Jackson perimus at gmail.com
Wed May 21 20:17:32 BST 2008

>> For a simple common example, a page from a long list of users.  To use
>> $last_id_plus_1, I would first need a numeric id on my user table
>> (unlikely, as the username is already a unique identifier so adding an
>> autoincrement INT would be pointless
> been bitten by this many times. I add INTs as row ids no matter how unique
> i think any data will be. Because sometimes... well, you know how it goes.
> what if i have to change the username?

I've used this approach before, but it's definately not One-Size-Fits-All.
You make a good point.  It is possible to change a username in that
case, by issuing an update statement to each table.  This is not so
bad, as long as it is a rare occurence.

>> and break normalization
> why would that be ?
As I understand it: Creating a new unique identifier when you already
have one, especially for it's own sake, breaks normalization.  If
usernames must be unqiue there's your identifier.  Normalized doesn't
always mean most efficient.

> Moreover, if the username is your FK in any table, you're
> wasting tons of space and possibly memory if the server is set right.
It's true that an INT is more efficiently indexed than a CHAR by the
DBMS, so that looks more efficient on the surface.  However, this can
be introducing more inefficiency than is immediately obvious.

An example out of an application I maintain, reports are generated off
sales records.  These reports may be filtered and sorted by
salesperson(FK username) or other username fields, and the PHB may
want to see a table of rows including the salesperson, assigned
customer service agent, perhaps underwriting agent or sales manager
for each row.

In this case, if I were to use an INT instead of a username for these
fields, I would have to join the users table 4 times for each row to
display the usernames!  Now the slight efficiency gained using an INT
user_id has become an efficiency problem when working with reports
where the username need be known.

Here again is an example that breaks the $id_plus_1 paging approach.
If we sort by salesperson,date there is no usable $Last_PK_ID_+1 magic
value to find the right page for this query.   Or, if one can be
somehow engineered, it will be a lot of work proprietary to only this
one report, and the code will be more complex and harder to understand
and modify when the maintenance coder comes around.

/Mitchell K. Jackson

More information about the Catalyst mailing list