Thank you. Michael. I do remember reading that (now that you got me to re-read that part of the manual. "The manual is your friend. The manual is your friend. The...") but I have never used that feature so it didn't come to mind as I was writing. Apologies to all for not pre-checking myself (not enough caffeine yet today, I guess.)
Again, thanks! 8-D Shawn Green Database Administrator Unimin Corporation - Spruce Pine Michael Stassen <[EMAIL PROTECTED]> wrote on 09/02/2004 10:54:32 AM: > Shawn, > > I'm not certain you are saying otherwise (or simply recommending against > it), but I want to point out that mysql can handle separate auto_increment > series for each client_id with MyISAM or BDB tables. You set up the table > like this: > > CREATE TABLE messages (client_id UNSIGNED INT NOT NULL, > msg_id UNSIGNED BIGINT NOT NULL AUTO_INCREMENT, > PRIMARY KEY (client_id, msg_id), > other columns ... > > MySQL will keep a separate count for each client_id. Of course, this has > the disadvantage you pointed out of requiring 2 columns to reference rows. > > See <http://dev.mysql.com/doc/mysql/en/example-AUTO_INCREMENT.html> > for details. > > Michael > > > [EMAIL PROTECTED] wrote: > > > No, you aren't asking too much of MySQL in most of your questions but in > > another question, you are. Let me explain. > > > > PRIMARY KEYs are nothing more than UNIQUE INDEXES on a table. How many > > columns it takes to uniquely identify any row of information depends on > > your data structure. Many people use an auto_incrementing INT (or BIGINT) > > column to artificially generate uniqueness. That means that their PRIMARY > > KEYS only require one column. Others have the requirements that certain > > combinations of columns cannot appear more than once in a table. They > > designate all of those columns as their PRIMARY KEY. Here's an example > > that combines elements of both (for the sake of this sample, this is NOT a > > normalized data structure but it will be highly indexed) > > > > CREATE TABLE us_buildings ( > > ID int not null auto_increment. > > State varchar(30) not null, > > City varchar(30) not null, > > County varchar(30) not null, > > Road varchar(45) not null, > > AddressNum int not null, > > AddressSuffix varchar(15) > > PRIMARY KEY (AddressNum, Road, City, State, AddressSuffix, County) > > UNIQUE (ID), > > Key(Road, City, State, AddressNum), > > Key(State, County, City) > > Key(County, State, City) > > ) > > > > This table is structured to ensure that any single structure in the US can > > be uniquely identified by it's position (AddressNum + AddressSuffix) along > > a road. The multiple-column PRIMARY KEY is used to prevent duplication and > > also serves as an index. The UNIQUE index on the ID column prevents anyone > > from changing the column into a duplicate value. That makes this column a > > good column to reference from another table (maybe a table like "resident" > > or "surveylog") without needing to duplicate all of the textual > > information it takes to identify the structure. The additional indexes are > > defined so that common searches on combinations of certain values will > > execute quickly. In a properly designed data structure, each element of > > that table would have their own table and this "fact table" would be using > > only the ID values of the other tables. That change (normalization) will > > make a HUGE difference in both storage requirements and index performance > > of this example as the database engine will retrieve numeric values > > directly from the index without the need for an additional seek (or two) > > to read the value from the table data and you will have nothing but > > numeric indexes on this table. > > > > In your case, you can still use an auto_incrementing ID value as a > > reference value and your PRIMARY KEY can be composed of a combination of > > (client_ID, client_msg_num) but you will have to mange your per-client > > message numbers manually. It would be rather difficult to build into any > > database a management system that automates the process of creating an > > auto_incrementing value based on the unique combination of values in one > > or several columns. > > > > Just before you insert a new message, you would need to check for the > > MAX(client_msg_num) for the client_id creating the message and assign the > > new message the next larger number. You would use transactions (InnoDB) or > > table locking (all table types) to prevent a second instance of your > > application from doing the exact same thing at the exact same time (if you > > don't serialize your access to your message numbers, you could > > accidentally issue duplicate numbers). Some DBAs would design a second > > table that stores the most recently used message number for each client_ID > > (I have used both techniques). Which method works best for you will depend > > on your benchmark testing. > > > > I hope you see that MySQL does most of the work for what you want to do > > but not quite all of it. > > > > Shawn Green > > Database Administrator > > Unimin Corporation - Spruce Pine > > > > > > > > Justin French <[EMAIL PROTECTED]> wrote on 09/02/2004 12:31:57 > > AM: > > > > > >>Hi all, > >> > >>I'm designing a hosted application that many clients will access. I've > >>got all sites running off one PHP code base quite nicely, and now I'm > >>hoping to reduce the multiple databases down to just one shared DB. > >> > >>(Note: at this stage, all accounts are fictional, so there's no legacy > >>data to worry about). > >> > >>So instead of each account have it's own database and autonomous > >>tables, I'd like all accounts to share one database. This will: > >> > >>- make updates easy > >>- allow each account to be "group aware" > >>- allow a parent website easy access to all account data > >> > >>I've added client_id columns to all tables, and things are working > >>fine, with the following exception... > >> > >>I'm worried about the primary keys (IDs) for each table growing to an > >>unmanageable size pretty quick... 50 accounts * 500 forum posts = 25000 > >>IDs pretty quickly. 50 sites * 5000 members = 250,000 members. > >> > >>I'm sure this isn't much of a technical/performance issue (with proper > >>indexing), but it's just strikes me as a little strange that the first > >>news post for an account could have an ID of '502846', rather than '1'. > >> > >>So, I was hoping I might be missing something in regards to primary > >>keys... > >> > >>Can a primary key (or unique key) be established on two columns (eg > >>primary key = client_id + post id)? > >>Can an auto-increment column only increment in relation to the client > >>id? > >> > >>Or am I expecting *way* too much out of MySQL and relational data > >>design? > >> > >>--- > >>Justin French >