On 18-Jun-2003 NIPP, SCOTT V (SBCSI) wrote:
>       Hello...  I am currently working on a User Account Management
> system.  I am actually a Unix SA who is "moonlighting" at work as a MySQL
> DBA and web developer.  I am learning a lot and enjoying the work, but I
> am
> severely lacking in database design fundamentals.  I have created a
> couple
> very simple databases, but my two newest projects are getting more
> sophisticated.  I was hoping for some DB design help with the following
> example...
> 
>       Let's say that I have users Mary, Joe, Frank, and Dan.  I also have
> servers panther, cheetah, jaguar and lion.  The data for each account
> that I
> want to maintain is UID, GID, home directory, and default shell.
>       In designing a table or tables to handle this example what can I
> make as a primary key?  My idea was to have a table named mary, with a
> row
> for each server, and each column would hold the data such as UID, GID,
> etc.
> This would mean that the primary key for each row would simply be the
> server
> name.
>       By holding all of the data, including server name, in a single
> table, I am not sure how I would define a primary key.  I couldn't use
> the
> user name or server name as there would be duplication.  I suppose I
> could
> use a dummy numeric field that is auto-incrementing, but I am not sure
> how
> good an idea this is.  I think I have read somewhere that you can
> actually
> use a combination of multiple columns as a primary key or index, but this
> is
> something I am obviously not familiar with.
>       One other concern I have is regarding performance.  The database
> work I have done so far has been dealing with relatively miniscule
> amounts
> of data.  This database table however is going to contain information for
> about 80 servers with somewhere around 300 users per server on average.
> This is quite a large number of rows from my very limited experience.  I
> don't want to come up with a poor table design that ends up causing
> problems
> down the line.
> 
>       Well, that's about all I can think of at the moment.  I am sure that
> I will have plenty more questions as this progresses.  Thanks again for
> the
> feedback.
> 

300 * 80 =24,000 rows --this is _NOT_ a lot.

At first, I'd use just one table:

srvr varchar(32) NOT NULL,
login varchar(32) NOT NULL,
uid smallint unsigned NOT NULL DEFAULT 1000,
gid smallint unsigned NOT NULL DEFAULT 1000,
gecos varchar(128),
sh varchar(32) NOT NULL DEFAULT '/bin/sh',
home varchar(64),
 ... more fields ...
primary key (login,srvr))

A next refinement would change the 'srvr' field to:
 srvr tinyint unsigned

and create a 'server' table:

id tinyint unsigned AUTO_INCREMENT, // last octet of ip ?
name varchar(64) NOT NULL,
primary key (id))

That'll make it easy to rename servers.

The table(s) could be populated very easily with a couple of shell, Perl,
and/or awk scripts. 

YP/NIS would come in handy as well. 
You'd loop on each distinct server name --request a ypxfer of the 
passwd map, then suck it into your table.

Regards,
-- 
Don Read                                       [EMAIL PROTECTED]
-- It's always darkest before the dawn. So if you are going to 
   steal the neighbor's newspaper, that's the time to do it.
                            (53kr33t w0rdz: sql table query)


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to