我正在尝试设计表格的布局,以便在以下情况下工作得最好。
我有一个产品是按年龄出售的。年龄决定了该产品是否存在,以及一个人可以购买的最小和最大值。现在,我已经按如下方式设计了表格:
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。
发布于 2011-08-28 06:54:03
tinyint unsigned用于age_max和age_min,因为问题中没有年龄通过255 (最高无符号整数)。smallint unsigned用于quantity_max和quantity_min,如果这些值> 255,则使用<= 65535 (最高无符号小整数)。mediumint unsigned用于quantity_max和quantity_min,如果这些值> 65535,则使用<= 16777215 (对于quantity_max和,如果这些值> 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();指令将导致mysql不显示数据,而是检查每一列的值并提出自己的建议。有时,建议过于细粒度。例如,如果age_min在十几岁的范围内,它可能会推荐枚举(‘13’,'14','15','16','17',18','19')而不是tinyint。在完成过程分析()之后,您仍然对列定义进行最后的调用。
发布于 2011-08-28 06:24:00
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_id为bigint,那么id应该具有相同的类型-毕竟这个表可以获得比您的products表更多的行数,product_id改为int,我认为您的产品不会超过2147483647个,age和quantity是smallints,它可以有最大值32767 (如果还不够,请使用<代码>d16或<代码>d17)。当您需要精确的精度或比bigint,(id, age_min)上的product_id和像product_id = {some_id} AND min_age > {user_age}这样的搜索的搜索速度
int/bigint定义中的(255)并不是255位数字--它只是一个字符串表示的提示。
关于数字类型的MySQL手册:http://dev.mysql.com/doc/refman/5.5/en/numeric-types.html
https://stackoverflow.com/questions/7217682
复制相似问题