MySQL - Relational/intermediary 表和 JOIN 查询?

MySQL - Relational/intermediary tables and JOIN queries?

一直在阅读这篇文章(很久了!),但看不清楚图片。

首先,如果我有两个具有多对多关系的 table(例如食谱和配料),并且我创建了一个 intermediary/relational table,我该如何编写SQL 查询以查找所有包含香蕉的食谱?

其次,如果我可以在不创建第三个 table 的情况下使用 JOIN 查询找到相同的信息,为什么我会有第三个关系 table?

非常感谢清晰、有用的解释,谢谢。

how do I write an SQL query to to find all recipes with, say, bananas in them?

你可以这样做:

select distinct r.id, r.name
from recipe r
join recipe_ingredient ri on ri.id_recipe = r.id
join ingredient i on i.id = ri.id_ingredient
where i.name = 'banana'

Second, why would I have this third relational table if I can find the same information using JOIN queries without the third tables creation?

因为一个食谱可以有许多种成分,并且一种成分可以与许多种食谱相关,所以这两者之间的关系tables 不是 1:n,而是 n:m。因此,你需要一个中级table,如下图:

create table recipe (
  id int primary key not null,
  name varchar(20)
);

create table ingredient (
  id int primary key not null,
  name varchar(20)
);

create table recipe_ingredient (
  id int primary key not null,
  id_recipe int not null,
  id_ingredient int not null,
  quantity double not null,
  foreign key fk1 (id_recipe) references recipe (id),
  foreign key fk2 (id_ingredient) references ingredient (id)
);

如果一种成分总是出现在一个食谱中,那么结构会更简单,正如您所想的那样。这个更简单的结构可能看起来像:

create table recipe (
  id int primary key not null,
  name varchar(20)
);

create table ingredient (
  id int primary key not null,
  name varchar(20),
  id_recipe int not null,
  foreign key fk3 (id_recipe) references recipe (id) 
);

像这样的模型在这种情况下并不实用。你最终会多次使用相同的成分。例如,如果蛋糕使用 "flour" 而面包使用 "flour",那么 "flour" 最终会在成分 table 中出现两次。不是个好主意。