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

Reply via email to