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