2011-08-27 64 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