配方数据库,设计问题(mysql,innodb)

时间:2012-10-04 08:08:06

标签: mysql database innodb recipe

我已经在食品配方数据库工作了一段时间,我已经积累了一些关于我的设计的问题。这是我的第一个项目,所以如果你看到一些奇怪的东西,请指出。这就是我所熟悉的内容:

下表是" 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分。但我可以忍受这种情况,因为似乎有点难以弥补它的压力。

感谢任何意见/建议!

1 个答案:

答案 0 :(得分:1)

水的价格是已知的(至少在第一世界),所以我会使用$ 0.00而不是NULL。由于您没有基于此列加入另一个表,因此混合使用值和NULL没有问题。

ingredient_brand更难,因为您确实希望基于此列加入。确实没有品牌,所以我使用NULL(因此需要OUTER JOIN)。

至于批量购买,您可以在其个人资料中为用户提供允许的选项(“如果我可以保存x%...”)。在批量购买之前,您可能还想弄清楚产品是否具有较长的保质期。

祝你好运。