2011-08-27 63 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,我们可能有36岁至60,从3量8.

回答

0
  • 使用tinyint unsigned以来在没有任何问题的青睐age_max和age_min通过255(最高无符号TINYINT)。
  • 如果这些值> 255和< = 65535(最高无符号smallint),则为quantity_max和quantity_min使用smallint unsigned
  • 对于quantity_max和quantity_min使用mediumint unsigned,如果这些值> 65535和< = 16777215(最高的unsigned mediumint)。
  • 对于quantity_max和quantity_min,使用int unsigned,如果这些值> 16777215和< = 4294967295(最高无符号整数)。 (有时候,你得想想大!)

我的建议:

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处于青少年范围内,则可以推荐ENUM('13','14','15','16','17',18','19')而不是tinyint。 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; 

变更您结构:

  • id可能是不需要的(除非你真的需要它),但是这时如果你需要product_idbigint然后id应具有相同的类型 - 所有这些表后,可以比你的产品表中获取更多的行,
  • 我改变了类型od product_idint,我不认为你将有超过2147483647个产品,
  • agequantitysmallint s,它可以有32767的最大值(使用mediumintint如果这还不够)。 decimal适用于当你需要精确的精度或大于bigint更大的数字,
  • 指数(id, age_min)以做出更加快速搜索给出product_id,并在int/bigint定义,就像product_id = {some_id} AND min_age > {user_age}

(255)搜索并不能使它长度为255位 - 这只是字符串表示的提示。上数值类型

MySQL手册:http://dev.mysql.com/doc/refman/5.5/en/numeric-types.html