【问题标题】:MySQL Create a function table?MySQL 创建函数表?
【发布时间】:2011-08-28 06:54:03
【问题描述】:

我正在尝试设计表格的布局以使其在以下情况下发挥最佳效果。

我有一个根据年龄销售的产品。年龄决定了该产品是否适合此人,以及可以购买的最小和最大数量。 现在我设计的表格如下:

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。

【问题讨论】:

    标签: mysql database-design relational-database


    【解决方案1】:
    • 使用tinyint unsigned 表示age_max 和age_min,因为问题中没有一个年龄超过255(最高无符号tinyint)。
    • 如果 quantity_max 和 quantity_min 的值 > 255 和 smallint unsigned。
    • 如果 quantity_max 和 quantity_min 的值 > 65535 和 mediumint unsigned。
    • 如果数量 > 16777215 和 int unsigned 用于数量最大值和数量最小值。 (有时,你必须想大事!!!)

    我的建议:

    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 在 teenage 范围内,它可能会推荐 ENUM('13','14','15','16','17',18','19') 而不是 tinyint。在 PROCEDURE ANALYSE() 完成后,您仍然对列定义进行最终调用。

    【讨论】:

      【解决方案2】:
      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_id 更改为 int,我认为您的产品不会超过 2147483647,
      • agequantitysmallints,最大值可以为 32767(如果不够,请使用 mediumintint)。 decimal 适用于需要精确精度或大于 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-26
        • 2011-10-08
        • 2011-05-17
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        相关资源
        最近更新 更多