SQL数据库多对多或一对多



我是MVC和编码的新手,所以如果我问了一个听起来很愚蠢的问题,请原谅我。我正在尝试创建一个包含食谱和配料的数据库。我在试着弄清楚我该如何建立我的模型。我知道我需要至少三个或四个表通过外键连接。我遇到的困难是在创建配方时,我如何选择这些表中的所有成分?我首先习惯了概念模型。

我在网上看过很多关于一对一关系的解释。一对多或多对多,但出于某种原因,我不知道如何用三张表中的所有食材同时创建一个食谱。需要帮助吗?

这是如何设置多对多表的一个很好的例子。在这个例子中,我们将包括Toast, Roast Chicken和Cake作为食谱。

(公平的警告:我不是厨师。不过我知道怎么做吐司!)

您可以在此数据库<>提琴

我们先从基本的两个表开始——菜谱和配料。

CREATE TABLE Recipes (Recipe_ID int PRIMARY KEY, Recipe_Name nvarchar(50));
INSERT INTO Recipes (Recipe_ID, Recipe_Name) VALUES
(1, 'Toast'),
(2, 'Roast chicken'),
(3, 'Cake');

在Recipes中,我们只有食谱名。在components中,我们只包含可以包含的成分。

CREATE TABLE Ingredients (Ingredient_ID int PRIMARY KEY, Ingredient_Name nvarchar(50));
INSERT INTO Ingredients (Ingredient_ID, Ingredient_Name) VALUES
(1, 'Slice of bread'),
(2, 'Butter'),
(3, 'Whole raw chicken'),
(4, 'Vegetables'),
(5, 'Cake mix'),
(6, 'Water');

那是我们的两张桌子。

第三个是链接它们的多对多表——例如,菜谱"Toast"需要"Slice of bread"one_answers"Butter"。然而,重要的不仅仅是成分,还有量。在这种情况下,我们需要两片面包和一汤匙黄油。

CREATE TABLE Recipe_Ingredients (
Recipe_ID int, Ingredient_ID int, Ingredient_Amount nvarchar(20),
PRIMARY KEY (Recipe_ID, Ingredient_ID));
INSERT INTO Recipe_Ingredients (Recipe_ID, Ingredient_ID, Ingredient_Amount) VALUES
(1, 1, '2'),              -- 2 slices of bread
(1, 2, '1 tablespoon');   -- some butter

在上面的例子中,Recipe_ID 1 (Toast)有2个成分_id 1 (Slice of bread)和1汤匙成分_2 (Butter)。

然后我们可以对烤鸡做同样的事情-加入一只整鸡,1kg/2lbs蔬菜和1汤匙黄油!

INSERT INTO Recipe_Ingredients (Recipe_ID, Ingredient_ID, Ingredient_Amount) VALUES
(2, 3, '1'),              -- 1 whole chicken
(2, 4, '1kg/2lb'),        -- 1kg of veges
(2, 2, '1 tablespoon');   -- and some butter

然后甜点,一些蛋糕。

INSERT INTO Recipe_Ingredients (Recipe_ID, Ingredient_ID, Ingredient_Amount) VALUES
(3, 5, '1 packet'),      -- cake mix
(3, 6, '200ml'),         -- some water
(3, 2, '3 tablespoons'); -- and some butter

要显示菜谱和配料,可以使用多对多表将两个表(菜谱和配料)连接在一起。

SELECT Recipes.Recipe_Name, Ingredients.Ingredient_Name, Recipe_Ingredients.Ingredient_Amount 
FROM Recipes
INNER JOIN Recipe_Ingredients ON Recipes.Recipe_ID = Recipe_Ingredients.Recipe_ID
INNER JOIN Ingredients ON Recipe_Ingredients.Ingredient_ID = Ingredients.Ingredient_ID
ORDER BY Recipes.Recipe_ID, Ingredients.Ingredient_ID;

结果如下

Recipe_Name     Ingredient_Name     Ingredient_Amount
Toast           Slice of bread      2
Toast           Butter              1 tablespoon
Roast chicken   Butter              1 tablespoon
Roast chicken   Whole raw chicken   1
Roast chicken   Vegetables          1kg/2lb
Cake            Butter              3 tablespoon
Cake            Cake mix            1 packet
Cake            Water               200ml

最新更新