NYCPHP Meetup

NYPHP.org

[nycphp-talk] Database, table, and column naming schemes

Dan Cech dcech at phpwerx.net
Tue Oct 6 14:06:46 EDT 2009


tedd wrote:
> At 12:43 PM -0400 10/6/09, Dan Cech wrote:
>> Kristina Anderson wrote:
>>>  Exactly, the table would contain probably nothing more than a primary
>>>  key autonumber field, the user id and account id in each row.
>>
>> Why do you need a separate primary key?  The relationship is defined by
>> user id and account id.
>>
>> CREATE TABLE some_rel (
>>   user_id int(11) not null,
>>   account_id int(11) not null,
>>   some_attribute varchar(255),
>>   PRIMARY KEY (user_id,account_id)
>> );
>>
>> I added the attribute column to illustrate that you can still identify
>> the row like:
>>
>> SELECT some_attribute FROM some_rel WHERE user_id=X AND account_id=Y
>>
>> HTH,
>>
>> Dan
> 
> Dan:
> 
> That's a good point, but I still like having a "separate from data"
> auto_increment index for all records. Besides adding one field to a
> record, can you see any harm in that?
> 
> Cheers,
> 
> tedd

You also end up maintaining separate indexes to support the lookups you
actually want to do:

Say you want to be able to do lookups in both directions, like:

SELECT account_id FROM some_rel WHERE user_id=X

and

SELECT user_id FROM some_rel WHERE account_id=Y

The most efficient system for doing this is:

CREATE TABLE some_rel (
  user_id int(11) not null,
  account_id int(11) not null,
  PRIMARY KEY (user_id,account_id),
  KEY account_id (account_id)
);

The primary key is used for lookups by user_id, and the second key for
lookups via account_id.

If you add an auto_increment column, you then have to do:

CREATE TABLE some_rel (
  some_rel_id int(11) not null auto_increment,
  user_id int(11) not null,
  account_id int(11) not null,
  PRIMARY KEY (some_rel_id),
  UNIQUE KEY user_id (user_id,account_id),
  KEY account_id (account_id)
);

You need a unique index on user_id,account_id to enforce the
relationship rule.

The account_id lookup cannot leverage the primary key, so you either
have to add the user_id field to that index or accept that it's going to
have to read the primary key and look up the user_ids from the table itself.

Dan



More information about the talk mailing list