mysql - 关于 MySQL 和多对多填充关联实体的建议

标签 mysql many-to-many associative-table

我正在设计一个包含食谱及其配料列表的数据库,现在我正在处理将各个配料链接到它们各自的食谱的过程。但是,我在决定如何填充关联实体表的最佳行动方案时遇到了麻烦。

我有 3 张 table ,

CREATE TABLE Ingredient
(
ingredientID int PRIMARY KEY AUTO_INCREMENT,
ING VARCHAR(100)
);

CREATE TABLE Recipe
(
recipeID int PRIMARY KEY AUTO_INCREMENT,
recipeTitle VARCHAR(200),
prepText VARCHAR(10000),
cuisineType VARCHAR(100)
);

CREATE TABLE recipeIng
(
recipeID int,
ingredientID int,
PRIMARY KEY (recipeID, ingredientID)
);

成分表由包含 200 多种成分的 XML 文件填充,每种成分自动分配一个从 1 开始的不同 ID。

食谱表由另一个 XML 文件填充,其中包含食谱标题、准备方法和菜肴类型。

recipeIng 表是我遇到的问题,我认为必须手动填充它。即手动将所有成分与其食谱相匹配。像这样:

INSERT INTO recipeIng
VALUES(1, 1);
INSERT INTO recipeIng
VALUES(1, 2);
INSERT INTO recipeIng
VALUES(1,3);
INSERT INTO recipeIng
VALUES(1, 4);

“1”是第一个配方的 ID,“1”、“2”等是单个成分 ID。

但是我不确定这是否是填充表格的最佳方法,任何建议都会有所帮助。

注意:与使用中的填充此查询的方法结合使用时效果很好。

SELECT r.recipeTitle
FROM Recipe r
INNER JOIN recipeIng e ON e.recipeID=r.recipeID
INNER JOIN Ingredient i ON i.ingredientID = e.ingredientID
WHERE 'brown sugar' IN (i.ING);

最佳答案

通过查看您最后的问题,我认为这种方法至少比在其中一个表中使用逗号分隔的 ID 列表要好。有一个逗号分隔值的列表会 f.e.限制您的连接数,具体取决于您对存储值列表的字段的配置。

您在这里展示的方式也是我在关系数据库中设计 mn-relations 的方式。这也是您使用 MySQL Designer 等工具获得的结果,因此我认为这是存储多对多关系的最佳方式。

除了这篇文章,我还没有真正找到太多关于这个的文档,这篇文章链接在维基百科页面上的多对多关系:http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php

关于mysql - 关于 MySQL 和多对多填充关联实体的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14603410/

相关文章:

mysql - 使用嵌套的 WHERE 子句?

sql-server-2008 - SQL 服务器 : Many to Many

mysql - 在 MySql 中过滤子查询的结果

ruby-on-rails - 在 Ruby on Rails 中的多对多关系中,如何使用父表表单中的数据在连接表中创建记录?

SQL关联实体问题

mysql - MySQL 5.6 的 Laravel 性能问题

php - 从数据库中获取下一个最高值和下一个最低值

mysql - Rails 左连接并包含不存在的左表记录

mysql - 插入具有关联实体的多行

database - SQLAlchemy 测试数据到关联对象