Re: Database Tables Relation Issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jan 30, 2009 at 8:37 AM, Andrew Ballard <aballard@xxxxxxxxx> wrote:

> On Fri, Jan 30, 2009 at 3:38 AM, Nitsan Bin-Nun <nitsan@xxxxxxxxxxxx>
> wrote:
> > Hi there,
> >
> > I'm working on something similar to mailing list in which every
> registered
> > user has the ability to create a mailing list and join others mailing
> lists.
> >
> > My users table is something like that (in short):
> >
> > CREATE TABLE IF NOT EXISTS `users` (
> >    `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
> >    `email` VARCHAR( 255 ) NOT NULL,
> >    `password` CHAR( 64 ) NOT NULL,
> >    UNIQUE (`email`)
> > );
> >
> > And my mailinglists table is as following:
> > CREATE TABLE IF NOT EXISTS `lists` (
> >    `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
> >    `creator_id` INT( 11 ) UNSIGNED NOT NULL,
> >    `name` VARCHAR( 255 ) NOT NULL,
> >    `description` TEXT NOT NULL
> > );
> >
> > I must have relation between the users table and the lists table, but I'm
> > not sure what is the best way to implement it.
> >
> > I have thought of using comma-separated ID's in special field in the
> lists
> > table of the users who have joined that specific list, but I have also
> > thought of doing the same at the users table, then I had another solution
> > which is to create new table:
> >
> > create table `relations` (
> >  `listid` int(11),
> >  `userid` int (11)
> > );
> >
> > Which will contain the relations.
> >
> > I want it to be optimised so when I'm fetching the mailinglists that a
> > specific user is registered (by user id) to and when I'm fetching the
> users
> > in specific mailinglist (by mailinglist id) it will be the fastest.
> >
> > The question itself is kinda newbie but I have to make sure it is as
> > scalable as much because in few weeks it will have 10-20 unique
> visitors/DAY
> > ;)
> >
> > --
> > ?>
> > Nitsan Bin-Nun
> > Web Applications Developer
> > nitsan@xxxxxxxxxxxx
> > 972-52-5722039
> >
>
> I will second the other replies and say use the relation table. I
> would only add that your relation table definition should include a
> two-column primary key on both listid and userid, as this will ensure
> that each user can be subscribed to a list no more than one time.
>
> CREATE TABLE `relations` (
>    `listid` int(11) UNSIGNED NOT NULL,
>    `userid` int(11) UNSIGNED NOT NULL,
>    PRIMARY KEY `PK_relations` ( `listid`, `userid`)
> );
>
>
> Another nice thing about this relations table is that you can later
> expand it to include other things, such as defining the relationship
> of a user to a list (moderator, administrator, subscriber, etc.) if
> that becomes necessary.
>
> Andrew
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
> Third table is the way to go. From a performance perspective, with a packed
field (values delimited in some way) you would likely be doing a LEFT LIKE
or FULL LIKE (%value or %value%) statement which causes full tables scans
since the index can't be used. That is much slower than querying a simple
table with single values where the index can be used.

-- 

Bastien

Cat, the other other white meat

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux