1

我已经在食品食谱数据库上工作了一段时间,并且积累了一些关于我的设计的问题。这是我的第一个项目,所以如果你看到一些奇怪的东西,请指出。这是我到目前为止所拥有的:

下表是“分升、升、打”等单词的列表。

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 似乎很难弥补它。

任何输入/建议表示赞赏!

4

1 回答 1

1

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

成分品牌更难,因为您确实想根据此列加入。确实没有品牌,所以我会使用 NULL(因此需要 OUTER JOIN)。

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

祝你好运。

于 2012-10-04T21:04:30.367 回答