我已经在食品配方数据库工作了一段时间,我已经积累了一些关于我的设计的问题。这是我的第一个项目,所以如果你看到一些奇怪的东西,请指出。这就是我所熟悉的内容:
下表是" decilitre,升,打"等词汇的列表。等
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;
每种成分都属于"蔬菜,乳制品和#34;
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;
现在提出问题: 像自来水这样的成分不属于品牌或特定价格。有时折扣价和折扣日期也不会存储,因为它在那个时间点不可用。
你会怎么处理?设计中的错误是什么?我应该存储类似" undefined"的值。我应该允许这些字段为空吗?在价格方面,大多数产品(99%及以上)可能都有价格。
还有一个问题是,最便宜的成分可能是5升容器,只需要2分。但我可以忍受这种情况,因为似乎有点难以弥补它的压力。
感谢任何意见/建议!
答案 0 :(得分:1)
水的价格是已知的(至少在第一世界),所以我会使用$ 0.00而不是NULL。由于您没有基于此列加入另一个表,因此混合使用值和NULL没有问题。
ingredient_brand更难,因为您确实希望基于此列加入。确实没有品牌,所以我使用NULL(因此需要OUTER JOIN)。
至于批量购买,您可以在其个人资料中为用户提供允许的选项(“如果我可以保存x%...”)。在批量购买之前,您可能还想弄清楚产品是否具有较长的保质期。
祝你好运。