设计配方数据库

时间:2015-03-23 17:16:50

标签: sql database sqlite schema

我正在制作一个简单的食谱应用程序,允许用户创建和保存他们的食谱。如果这有任何不同,我正在使用SQLite。

我的数据库知识有点生疏,所以我一直在寻找灵感来设计合适的数据库。

这里的用户似乎指出的一个例子是Barry Williams的以下架构:http://www.databaseanswers.org/data_models/recipes/index.htm 这个db过于详细,所以我决定只使用下面的表格:

Recipe                 (recipe_id(PK), name, description)
Ingredient             (ingredient_id(PK), name)
Recipe_Steps           (recipe_id(PF), step_number(PK), instructions)
Recipe_Step_Ingredients(recipe_id(PF), step_number(PF), ingredient_id(PF), amount) 

根据我的理解,每种成分都与配方中的一个步骤相关联,而我觉得每种成分应该直接与配方相关联,并且步骤可以是配方表的属性,也可以是与直接相关的步骤表中的步骤食谱。这将是我的设计:

Recipe                 (recipe_id(PK), name, description)
Ingredient             (ingredient_id(PK), name)
Recipe_Steps           (recipe_id(PF), step_number(PK), instructions)
Recipe_Ingredients     (recipe_id(PF), ingredient_id(PF), amount) 

先生。威廉姆斯对数据库的了解比我更多,所以我不知道我是否误解了他的架构并将其搞砸了我的版本,或者这是否归结为设计中的个人偏好。

我的架构版本是否正确,如果没有,您能引导我找到合适的答案吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是我用来实现AnyMeal食谱软件的数据库架构:

PRAGMA user_version = 1;
BEGIN;
CREATE TABLE recipes(id INTEGER PRIMARY KEY, title VARCHAR(60) NOT NULL, servings INTEGER NOT NULL, servingsunit VARCHAR(40) NOT NULL);
CREATE TABLE categories(id INTEGER PRIMARY KEY, name VARCHAR(40) UNIQUE NOT NULL);
CREATE TABLE category(recipeid INTEGER NOT NULL, categoryid INTEGER NOT NULL, PRIMARY KEY(recipeid, categoryid), FOREIGN KEY(recipeid) REFERENCES recipes(id), FOREIGN KEY(categoryid) REFERENCES categories(id));
CREATE TABLE ingredients(id INTEGER PRIMARY KEY, name VARCHAR(60) UNIQUE NOT NULL);
CREATE TABLE ingredient(recipeid INTEGER NOT NULL, line INTEGER NOT NULL, amountint INTEGER NOT NULL, amountnum INTEGER NOT NULL, amountdenom INTEGER NOT NULL, amountfloat REAL NOT NULL, unit CHARACTER(2) NOT NULL, ingredientid INTEGER NOT NULL, PRIMARY KEY(recipeid, line), FOREIGN KEY(recipeid) REFERENCES recipes(id), FOREIGN KEY(ingredientid) REFERENCES ingredients(id));
CREATE TABLE instruction(recipeid INTEGER NOT NULL, line INTEGER NOT NULL, txt TEXT NOT NULL, PRIMARY KEY(recipeid, line), FOREIGN KEY(recipeid) REFERENCES recipes(id));
CREATE TABLE ingredientsection(recipeid INTEGER NOT NULL, line INTEGER NOT NULL, title VARCHAR(60) NOT NULL, PRIMARY KEY (recipeid, line), FOREIGN KEY(recipeid) REFERENCES recipes(id));
CREATE TABLE instructionsection(recipeid INTEGER NOT NULL, line INTEGER NOT NULL, title VARCHAR(60) NOT NULL, PRIMARY KEY (recipeid, line), FOREIGN KEY(recipeid) REFERENCES recipes(id));
COMMIT;