2012-10-04 59 views
1

我一直在研究食譜食譜數據庫,現在我已經積累了一些關於我的設計的問題。這是我的第一個項目,所以如果你看到一些奇怪的東西,請指出。下面是我有SOFAR:食譜數據庫,設計問題(mysql,innodb)

下表是像「分升,升,打」等

CREATE TABLE amount_type(
    amount_type_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    amount_type VARCHAR(40) NOT NULL, 
    PRIMARY KEY (amount_type_id) 
) 
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci; 

單詞列表下面這個跟蹤食譜名稱,描述的:「好醇」煎餅「,所有說明」將雞蛋,麪粉,牛奶加入煎鍋中「以及食物的數量。

CREATE TABLE recipe(
    recipe_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    description VARCHAR(100) NOT NULL, 
    instruction VARCHAR (250) NOT NULL, 
    amount SMALLINT(10) UNSIGNED NOT NULL, 
    amount_type_id INT(10) UNSIGNED NOT NULL, 
    last_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    FOREIGN KEY (amount_type_id) REFERENCES amount_type (amount_type_id), 
    PRIMARY KEY (recipe_id) 
) 
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci; 

每個成分屬於象 「蔬菜,乳製品產品」 類型

CREATE TABLE ingredient_type(
    ingredient_type_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    type VARCHAR(40) NOT NULL, 
    PRIMARY KEY (ingredient_type_id) 
) 
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci; 

哪個公司生產的成分:

CREATE TABLE ingredient_brand(
    ingredient_brand_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    brand_name VARCHAR(40) NOT NULL, 
    PRIMARY KEY (ingredient_brand_id) 
) 
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci; 

成份名稱,成分的說明中,UNIT_PRICE是每升/千克取決於產品的臨時折扣價格。

CREATE TABLE ingredient(
    ingredient_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    ingredient_type_id INT(10) UNSIGNED NOT NULL, 
    name VARCHAR(40) NOT NULL, 
    description VARCHAR(40) NOT NULL, 
    ingredient_brand_id INT(10) UNSIGNED NOT NULL, 
    unit_price DECIMAL(9,4) UNSIGNED NOT NULL, 
    unit_discount_price DECIMAL(9,4) UNSIGNED NOT NULL, 
    unit_discount_expire_date DATE NOT NULL, 
    last_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    FOREIGN KEY (ingredient_type_id) REFERENCES ingredient_type (ingredient_type_id), 
    FOREIGN KEY (ingredient_brand_id) REFERENCES ingredient_brand (ingredient_brand_id), 
    PRIMARY KEY (ingredient_id) 
) 
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci; 

配方和成分之間的關​​系表,也跟蹤每個配方成分的量。

CREATE TABLE recipe_to_ingredient(
    recipe_id INT(10) UNSIGNED NOT NULL, 
    ingredient_id INT(10) UNSIGNED NOT NULL, 
    amount DECIMAL(9,2) UNSIGNED NOT NULL, 
    amount_type_id INT(10) UNSIGNED NOT NULL, 
    FOREIGN KEY (recipe_id) REFERENCES recipe (recipe_id), 
    FOREIGN KEY (ingredient_id) REFERENCES ingredient (ingredient_id), 
    FOREIGN KEY (amount_type_id) REFERENCES amount_type (amount_type_id), 
    PRIMARY KEY (recipe_id, ingredient_id) 
) 
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci; 

現在的問題: 像自來水一些成分不屬於一個品牌或一個給定的價格。並且有時折扣價格和折扣日期不會被存儲,或者是因爲它在該時間點不可用。

你會如何處理?設計中的錯誤是什麼?我應該存儲一個像「未定義」的值。我應該允許這些字段爲空嗎?談到價格,大多數產品(99%及以上)可能都有價格。

還有一個問題atm最便宜的成分可能是5升容器,當你需要的只有2分升。但我可以忍受,因爲它似乎很難補償它。

任何意見/建議表示讚賞!

回答

1

水的價格是已知的(至少在第一世界),所以我會使用0.00美元而不是NULL。由於您沒有加入到基於此列的另一個表中,因此將值和NULL組合在一起沒有問題。

由於您確實想根據此欄加入,因此ingredient_brand更難。實際上沒有品牌,所以我會使用NULL(因此需要一個OUTER JOIN)。

至於批量購買,您可以給用戶在他們的個人資料中的選項,以允許(「如果我可以節省x%...」)。您也可能想要在批量購買前確定產品是否具有較長的保質期。

祝你好運。