我一直在研究食譜食譜數據庫,現在我已經積累了一些關於我的設計的問題。這是我的第一個項目,所以如果你看到一些奇怪的東西,請指出。下面是我有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分升。但我可以忍受,因爲它似乎很難補償它。
任何意見/建議表示讚賞!