将列链接和添加到数据库表、数据库设计的简单而正确的方法

Posted

技术标签:

【中文标题】将列链接和添加到数据库表、数据库设计的简单而正确的方法【英文标题】:Simple and right way to link and add columns to database tables, database design 【发布时间】:2012-01-24 09:13:51 【问题描述】:

我有以下表格。

产品具有以下属性:

ProductID 产品名称 ProductPrice

配方具有以下属性:

配方ID ProductID ingredientID productAsIngredientID ingredientAmount

成分具有以下属性:

ingredientID 成分名称 ingredientUnitType

上表的样本数据库:

产品:

|   ProductID    |    ProductName    |   ProductPrice   | 

       12             Bun                     1.5
       15             Ham Burger              5
       13             Chicken Burger          7

成分:

|    ingredientID    |      ingredientName         |   ingredientUnitType   |          

         1                   Salt                           gm
         2                   Yeast                          gm
         3                   Refined Wheat Flour            gm
         4                   Milk                           ml
         5                   Chicken Meat                   gm
         6                   Onion                          gm
         7                   Tomatoes                       gm 

食谱:

| RecipeID | ProductID | ingredientID  |  productAsIngredientID  |  ingredientAmount  |

     1          13                               12                         1
     2          13           5                                             20
     3          13           6                                              7
     4          13           7                                             10
     5          12           1                                              5
     6          12           2                                              2
     7          12           3                                             10
     8          .            .
     9          .            .

在Recipe Table中,ProductID不能等于productAsIngredientID在同一行。但在表 Recipe 中,productID 和 productAsIngredientID 都链接到 Product.ProductID。

但是,将以上两个表与 productID 链接起来存在问题。如果我链接它们,它们都不能有空值或任何不在成分或产品表中的值。

我使用 Microsoft Access (MDB) 作为数据库 请建议我一个正确的方法来完成这项工作。我如何将产品项目本身作为一种成分本身进行组织。

【问题讨论】:

简短回答:谷歌“多对多关系访问”,因为您可能需要几个“链接表”,其中包含来自其他表的 Id 列。 IE。表 Product_to_recipe 具有列 RecipeIdProductId 等其他多对多关系。然后,您将在查询时加入查询中的所有表。 SELECT * FROM Recipe INNER JOIN Product_to_recipe ON Recipe.RecipeId = Product_to_recipe.RecipeId 这将为您提供与食谱相关的所有产品。 这是bill of materials (BOM)吗?另外,您是否在寻找满足您要求的现有软件(“购买,不要构建”)? @onedaywhen:错误的答案!谢谢你的建议 【参考方案1】:

您要问的是如何在表之间创建多对多关系。

这是通过一个单独的“链接表”完成的,其中包含来自其他两个表的 ID(在您的情况下,我们将在成分链接表中添加另一列,即数量。

所以架构看起来像这样(我更喜欢没有表名作为前缀的属性):

产品

身份证 产品名称 价格 单位

成分

身份证 成分名称 单位

食谱

身份证 配方名称

配方产品

RecipeId(外键:Recipe.Id) ProductId(外键:Product.Id) 金额

配方成分

RecipeId(外键:Recipe.Id) IngredientId(外键:Ingredient.Id) 金额

这就是我通常会如何布局架构,但我对 Access 不是很熟悉。

这是我从访问查询向导中获得的,用于获取食谱的所有成分

SELECT Ingredient.IngredientName, RecipeIngredients.Amount, Ingredient.Unit
FROM Ingredient 
INNER JOIN RecipeIngredients 
ON Ingredient.[ID] = RecipeIngredients.[IngredientId] 
WHERE RecipeIngredients.RecipeId = 1;

不是最好的 SQL,我想有人可以提供一种更智能的方法来获取配方的产品和成分。

productAsIngredientId 应该不是必需的,因为当产品是配方的一部分时,它就是一种成分,对吧?否则,您需要将表名更改为更合乎逻辑的名称。

【讨论】:

关于“产品”和“成分”分离的好点——面包可能是一种成分,但面粉也是一种产品——你按磅计算。更复杂的是,海报实际上是在解决错误的问题,真正的问题是“食谱”也可以是“配料”,因为“肉酱”和“bechemal 酱”都是经典千层面的配料。 @JamesAnderson:面包是一种产品,可能是一种成分,但面粉不是一种产品,它显然位于成分表上。是的,食谱也可以是一种成分,在这里,整个食谱都在产品中。例如。包子的配方在于产品包子 对了解整体情况非常有帮助,即系统将用于什么?如果您希望一个食谱成为另一个食谱的一部分,您可能需要另一个名为 RecipeRecipes 或类似名称的链接表(无论命名对您来说都有意义)。但是我猜,根据上下文,您宁愿将包含其他食谱的食谱命名为其他名称,例如菜单、菜肴或其他名称,从而创建另一个名为 Dish 的表,但这取决于使用您的应用程序。 我想 OP 的目标是购物清单,所以 bun 可能是您购买或制作的东西,类似 Bechamel 酱。产品可能会运行“SoSo Co 制作的酱汁足够好”和“查看 Bechamel 制作自己的食谱”。也许 StackExchange 烹饪需要一个代码部分:) @Remou:你是对的。包子是客户购买的东西(作为产品),也是我们添加到其他产品中的东西,例如火腿汉堡(作为成分)

以上是关于将列链接和添加到数据库表、数据库设计的简单而正确的方法的主要内容,如果未能解决你的问题,请参考以下文章

将列添加到 RDD Spark 1.2.1

MariaDB 将列动态添加到现有表

将列添加到数据框列表并进行增量添加/循环通过 df 进行简单添加

将列 ID 添加到现有表

将列更改为常规列而不是外键

如何将列添加到 Azure 演示 iOS 应用程序的简易表(待办事项列表)