Sorry I didn't get back to you earlier today. I have had a busy day. Comments embedded... "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote on 10/20/2005 04:35:30 PM:
> Could you please tell me should this work? > > CREATE TABLE categories ( > cat_id INTEGER(8) UNSIGNED NOT NULL AUTO_INCREMENT, > cat_name VARCHAR(45) NULL, > cat_description TEXT NULL, > cat_parent INTEGER(4) UNSIGNED NULL, > cat_status ENUM('0','1') NULL, > PRIMARY KEY(cat_id) > ) > TYPE=InnoDB; > Good. I would add another INDEX for (cat_parent, cat_id) to speed up subcategory listings. > > CREATE TABLE products ( > prod_id INTEGER(8) UNSIGNED NOT NULL AUTO_INCREMENT, > prod_no VARCHAR(12) NOT NULL, > prod_name VARCHAR(45) NOT NULL, > prod_description TEXT NULL, > prod_colors TEXT NULL, // since there are tons of colors, defined > differently by different suppliers, I had to go this way for color options > prod_includes TEXT NULL, > prod_catalog VARCHAR(45) NULL, > prod_status ENUM('0','1') NOT NULL DEFAULT 0, > prod_supplier VARCHAR(45) NULL, > prod_start_date DATE NULL, > prod_end_date DATE NULL, > PRIMARY KEY(prod_id), > INDEX products_index1(prod_status), > INDEX products_index2(prod_start_date, prod_end_date) > ) > TYPE=InnoDB; Good again. if you don't want your application to parse out a list of colors from the colors field, you will need a table of just colors and another association table between colors and products. Remember that the optimizer won't use an index if it thinks that the index will return over 30% or so of the records in the table. With only two values in it, an index on prod_status (all by itself) will probably never have enough cardinality to be useful. Consider using it as part of a compound index instead. > > > // since one product could be in more then one category, I created > this assoc. table > CREATE TABLE categories_has_products ( > categories_cat_id INTEGER(8) UNSIGNED NOT NULL, > products_prod_id INTEGER(8) UNSIGNED NOT NULL, > PRIMARY KEY(categories_cat_id, products_prod_id), > INDEX categories_has_products_FKIndex1(categories_cat_id), > INDEX categories_has_products_FKIndex2(products_prod_id), > FOREIGN KEY(categories_cat_id) > REFERENCES categories(cat_id) > ON DELETE NO ACTION > ON UPDATE NO ACTION, > FOREIGN KEY(products_prod_id) > REFERENCES products(prod_id) > ON DELETE NO ACTION > ON UPDATE NO ACTION > ) > TYPE=InnoDB; OK, your primary key acts as an index for categories_cat_id and for (categories_cat_id, products_prod_id). The second index on just categories_cat_id is redundant and can be deleted with no side-effects. > > > // table methods represent different kind of imprints on apparels. > same an apparel with different kind of imprint could have a different price. > CREATE TABLE methods ( > met_id INTEGER(4) UNSIGNED NOT NULL AUTO_INCREMENT, > met_name VARCHAR(12) NULL, > PRIMARY KEY(met_id) > ) > TYPE=InnoDB; > So far, you are doing a good job at normalizing. > > > CREATE TABLE prices ( > price_id INTEGER(8) UNSIGNED NOT NULL AUTO_INCREMENT, > products_prod_id INTEGER(8) UNSIGNED NOT NULL, > methods_met_id INTEGER(4) UNSIGNED NOT NULL, > qty INTEGER(8) UNSIGNED NULL, > price DECIMAL(10,2) NULL, > sale_price DECIMAL(10,2) NULL, > PRIMARY KEY(price_id), > INDEX prices_index1(qty), > INDEX prices_FKIndex1(methods_met_id), > INDEX prices_FKIndex2(products_prod_id), > FOREIGN KEY(methods_met_id) > REFERENCES methods(met_id) > ON DELETE NO ACTION > ON UPDATE NO ACTION, > FOREIGN KEY(products_prod_id) > REFERENCES products(prod_id) > ON DELETE NO ACTION > ON UPDATE NO ACTION > ) > TYPE=InnoDB; > > > Only thing that bothers me is start and end dates for sale prices: > shirt: available from today until 4/1/2006 > price: $7.95 > on sale from 11/15/2005 to 1/15/2006 > sale price: $5.95 > > Right now, with "my" solution, administrator has to turn on/off "on > sale". I need to automate this by start and end dates for sale. > Any ideas? > > Thanks for any help. > > -afan > Since each price (a product-method-quantity combination) can have several SALE prices (each with different date ranges) you need to normalize them to their own table. CREATE TABLE sales_prices ( sale_id int auto_increment, price_id int not null, saleprice, startdate, enddate, PK, FK, FK ) That way each Price can have a corresponding sale price for a particular range of dates. When that range expires, the sale price no longer matches your query and you stop showing it on the site. That's how I would solve that particular issue. Shawn Green Database Administrator Unimin Corporation - Spruce Pine