2011-08-27 4 views
0

다음 상황에서 가장 잘 작동하도록 테이블의 레이아웃을 설계하려고합니다.MySQL 함수 테이블을 만드시겠습니까?

나는 나이별로 판매되는 제품을 가지고 있습니다. 나이는이 제품이이 사람을 위해 존재하고 최소 및 최대 사람이 살 수 있는지를 결정합니다. 다음과 같이 는 지금은 테이블을 디자인했다 :

CREATE TABLE `tblProductsVsAge` (
    `id`     int(255) AUTO_INCREMENT NOT NULL, 
    `product_id`   bigint(255) NOT NULL, 
    `age_min`   int(255) NOT NULL, 
    `age_max`   int(255) NOT NULL, 
    `quantity_min`  decimal(8) NOT NULL, 
    `quantity_max`  decimal(8) NOT NULL, 
    /* Keys */ 
    PRIMARY KEY (`id`) 
) ENGINE = InnoDB; 

이 작동하고 작동,하지만 난 것처럼이 아니 최선의 최적화 된 구조를 생각합니다. 아이디어가 있으십니까?

제품을 언급하는 것을 잊었을 때 제품의 범위가 다양 할 수 있습니다. 예를 들어 연령 25 세 최대 35 본의 양이 12 될 28 분 같은 제품 ID를 위해 우리는 당신의 구조 8.

답변

0
  • 사용 tinyint unsigned 질문에 나이의 아무도 이후 age_max 및 age_min 255 (최고 부호 TINYINT)를 전달합니다.
  • quantity_max에는 smallint unsigned을 사용하고> 255 및 < = 65535 (최고 unsigned smallint) 인 경우 quantity_min을 사용하십시오.
  • quantity_max에 mediumint unsigned을 사용하고 65535보다 큰 값> < = 16777215 (가장 높은 부호없는 중간 값) 인 경우 quantity_min을 사용하십시오.
  • amount_max에 int unsigned을 사용하고 16777215보다 큰 값과 < = 4294967295 (가장 높은 부호없는 int) 인 경우 quantity_min을 사용하십시오. (때로는 큰 생각 해요!)

나의 추천 :

여기
CREATE TABLE `tblProductsVsAge` ( 
    `product_id`   int NOT NULL, 
    `age_min`   tinyint unsigned NOT NULL, 
    `age_max`   tinyint unsigned NOT NULL, 
    `quantity_min`  smallint unsigned NOT NULL, 
    `quantity_max`  smallint unsigned NOT NULL, 
    /* Keys */ 
    PRIMARY KEY (`product_id`, `age_min`) 
) ENGINE = InnoDB; 

테이블에 이미 데이터가있는 경우 고려해야 할 무언가이다 :이 테이블의 컬럼되어 정의를 추천 mysql을 요청할 수 .

SELECT * FROM tblProductsVsAge PROCEDURE ANALYSE(); 

이 지침 PROCEDURE ANALYSE()은 MySQL의 데이터를 표시 할 수 있지만, 각 컬럼의 값을 검사하고 자신의 추천을 마련하지가 발생합니다

은 간단하게이 쿼리를 실행합니다. 때로는 권장 사항이 너무 세분합니다. 예를 들어, age_min이 10 대 범위 인 경우 tinyint 대신 ENUM ('13 ','14 ','15 ','16 ','17 ', 18', '19')을 권장 할 수 있습니다. PROCEDURE ANALYZE()가 완료된 후에도 열 정의에 대한 최종 호출을 계속 수행합니다.

0
CREATE TABLE `tblProductsVsAge` (
    `product_id`   int NOT NULL, 
    `age_min`   smallint NOT NULL, 
    `age_max`   smallint NOT NULL, 
    `quantity_min`  smallint NOT NULL, 
    `quantity_max`  smallint NOT NULL, 
    /* Keys */ 
    PRIMARY KEY (`product_id`, `age_min`) 
) ENGINE = InnoDB; 

변경에, 60 세의 양을 36 세이있을 수 있습니다 : , 모든 테이블 후 제품 테이블보다 많은 행을 얻을 수 있습니다 -

  • id

    아마 (당신이 정말 필요하지 않은 경우) 필요하지 않습니다,하지만 당신은 할 product_id 필요하면 다음 bigint 다음 id은 동일한 유형을 가져야한다
  • 유형이 변경됨 product_idint에, 나는 당신이 32767의 최대 값을 가질 수 smallint들, (가 충분하지 않습니다 경우 mediumint 또는 int 사용) 개 이상의 2147483647 개 제품,
  • agequantity을해야합니다 생각하지 않습니다. decimal이 주어 product_id과 그것을하지 않습니다 int/bigint 정의 product_id = {some_id} AND min_age > {user_age}

(255) 같은 검색을 위해 빠른 검색을 할 (id, age_min)에, 당신이 정확한 정밀도 또는 bigint보다 큰 숫자를 필요로 할 때를 위해

  • 인덱스를위한 것입니다 255 자리 길이 - 문자열 표현에 대한 힌트 일뿐입니다. 숫자 유형에 대한

    MySQL의 설명서 : http://dev.mysql.com/doc/refman/5.5/en/numeric-types.html

  • 관련 문제