我正在学习 SQL,作为学习的一部分,我正在创建一个 ER 图,我将用它来构建数据库。该任务涉及六种不同类型的番茄酱,每种番茄酱都含有不同的成分。我有一个
Product
带列的表格
productID, productName, referenceTomatoType, productSizeMilliliters, productPrice
此外,我还有一个
Ingredients
表,其中包含 ingredientID
和 ingredientName
列。
六种不同类型的番茄酱中的每一种都有其独特的配方,需要通过将产品和成分链接在一起的表在数据库中表示。在第三个表中,我需要包含
IngredientAmount
和 StorageTime
。
我该怎么做?而这三个不同的表之间有什么关系呢?我猜测是一对多的关系,但我不确定。如果这是非常基本的,我很抱歉,但正如我提到的,我对此很陌生。
我尝试使用名为
recipeID
的主键将产品表和成分表与配方表连接起来,同时使用产品表中的 productID
和成分表中的 ingredientID
作为外键,但我不确定这是否正确。我还尝试将 productID
和 ingredientID
作为 recipe
表中的主键,但由于产品包含多种成分,因此将 productID
作为配方表中的主键会导致重复,这我也不确定是否允许。
如果您的产品和成分表具有 M:M 关系,那么您需要在它们之间创建一个交集表,即您创建的成分表
这种类型的表格可以有自己的单个 PK 列,也可以有由 2 个 FK 列组成的复合 PK - 由您选择哪个选项。
对于配方的任何属性,您只需将它们添加为交叉表中的列
哇哦,退一步。实体关系建模不是关于主键,而是关于识别所有相关对象及其相互关系。您有一个产品对象、一个成分对象和一个配方对象。让我们稍微检查一下。在您的情况下,产品是由配方生产的 - 一个配方生产一种产品,而每种产品只有一个配方来生产它。这是一对一的关系。
但是每个配方都涉及多种成分,因此我们在这里缺少一个实体来告诉我们成分如何用于制造产品。我建议您缺少一个食谱步骤实体,其中每个步骤都可以涉及添加特定数量的成分或其他一些操作(例如等待一段时间)。
当你这样做时,你现在就有了一个如下所示的 e-r 模型:
PRODUCTs are made with RECIPEs (1-1)
RECIPEs are made of RECIPE-STEPS (1-many)
RECIPE-STEPs may utilize INGREDIENTs (1-0/1)
现在您可以制作与您的模型相匹配的物理桌子。请注意,由于与 PRODUCT 存在 1-1 关系,您实际上可能不需要 RECIPE 物理表。 RECIPE-STEP 表可以使用 PRODUCT 键加上序列号作为其主键来对步骤进行排序。如果您的数据库支持外键字段中的 NULL,它还可以具有可为空的 INGREDIENT 键作为非键字段,该非键字段可以是 INGREDIENT 表的外键。