我已经在食品食谱数据库上工作了一段时间,并且积累了一些关于我的设计的问题。这是我的第一个项目,所以如果你看到一些奇怪的东西,请指出。这是我到目前为止所拥有的:
下表是“分升、升、打”等单词的列表。
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;
成分名称,成分描述,单位价格是每升/公斤,取决于产品,临时折扣价。
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% 及以上)可能毕竟有价格。
还有一个问题是,当您只需要 2 分升时,最便宜的成分可能是 5 升的容器。但我可以忍受这一点,因为在 atm 似乎很难弥补它。
任何输入/建议表示赞赏!