Response intermixed: 

"[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote on 10/21/2005 09:19:41 AM:

> Thanks Shawn.
> See  comments:
> 
> [EMAIL PROTECTED] wrote:
> 
> >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:
> >
<snip>
> >>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.
> > 
> >
> This is why I made color columns this way.
> Product 07V0128: Neutrals - White(30n)Heathers - Ash (93h), Sport 
> Grey (95h)Colors - Gold (24c), Navy (32c), Forest Green (33c), Black 
> (36c), Orange (37c), Red (40c), Royal (51c), Lt Blue (69c), Purple 
> (81c), Maroon (83c)
> Product 07V0205: Neutrals: **White, Natural. Lights: *Ash, Graphite, 
> **Light Steel. Darks - **Black, Bluestone, Cardinal, Copper, Daffodil 
> Yellow, Denim Blue, Gold, Gold Nugget, Kelly Green, Light Blue, Lime, 
> Moss, *Navy, Orange, Pink, Pebble, Pine, Purple, *Red
> Product 07V0560: Apricot, Burnt Orange, Butter, Cedar, Celery, Chalky 
> Blue, Chalky Mint, Chalky Purple, Charcoal, Cigar, Columbia Blue, 
> Crimson, Dandelion, Denim, Dijon, Dorm Green, Forest, Grasshopper, Hot 
> Red, Indigo, Kelly, Key Lime, Latte, Lime, Mustard, Nantucke
> Since, there is NO RULE for colors, this is a only solution, right?

There are rules for colors. Your suppliers give you a list of all of the 
combinations of colors for each product, right? That's a rule: "Product Y 
comes in Midnight Blue, Aqua, and Cobalt". Any other color would be wrong, 
correct? 

Whenever you start making "lists" in text fields, you have the opportunity 
to normalize those lists into their own tables. Sure, it adds a layer of 
design but it's a more flexible design as you can create a product-color 
association table that contains start dates and end dates for special 
color runs or that contains a pointer to your inventory tables so that 
when a particular color runs out of stock, you can stop listing it on your 
site. As a rough example:

CREATE TABLE color_product {
        color_id,
        product_id,
        inventory_sku,
        startdate,
        enddate, 
);

Every color value (including all unique color combinations) for any 
product are listed once (in their own table), product are listed once (in 
their own table) and there is an entry in color_product for each 
combination of product to color. The startdate and enddate columns could 
be used for automatically expiring listings like black/orange around 
Halloween or red/green/white around Christmas. That way when the holiday 
season is over, you can stop listing it automatically based simply on the 
current date (no manual deletions) .


> >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.
> > 
> >
> Looks like I'm doing wrong for a loooong time :)
> Ok, then. Do I have to Index prod_status or it's not necessary?

It's useful information and because you probably use it in EVERY query, 
adding it as a secondary column to each of your other indexes is probably 
a good idea.

> Could you please give me more info on "Consider using it as part of a 
> compound index instead"?
> 

A compound index is simply an index that uses more than one column. If you 
find that you are always making queries like

SELECT ....
FROM ...
WHERE category_id = xxx AND status=1

Then creating a compound index on (category_id, status) makes that query 
(any any other query that uses those combinations of fields) more 
responsive because the index is more selective (better cardinality). As an 
added bonus it would also acts as a simple index for the column 
category_id. And, another bonus, if you are looking for all numeric data 
and all of the data you want actually takes part in an index, the 
optimizer will skip reading the actual table file and return the data for 
the query from the index file. This is called a "covering index" for your 
query.  The restriction on all numeric data may be lifted with recent 
developments, I haven't keep up with that aspect fo the design changes 
(sorry!).

To summarize: If you define a 3-column key that looks like (A, B, C) that 
definition performs as an index for the following combinations of terms: A 
(by itself), A and B at the same time, A and B and C at the same time. Any 
index (PRIMARY KEY, KEY, or UNIQUE) provides this functionality. That is 
why I keep trying to point out that certain KEYs (indexes) that you define 
are redundant because you, for example, listed a column first in a 
compound PK then created a separate simple key on just that column. The PK 
will do both jobs. No need to use the space to re-index that column by 
itself. 

<snip>
> 
> >Shawn Green
> >Database Administrator
> >Unimin Corporation - Spruce Pine
> > 
> >
> Thanks Shawn!
> 
> -afan
> 
> 

Any time!

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to