将列链接和添加到数据库表、数据库设计的简单而正确的方法
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 具有列 RecipeId 和 ProductId 等其他多对多关系。然后,您将在查询时加入查询中的所有表。 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:你是对的。包子是客户购买的东西(作为产品),也是我们添加到其他产品中的东西,例如火腿汉堡(作为成分)以上是关于将列链接和添加到数据库表、数据库设计的简单而正确的方法的主要内容,如果未能解决你的问题,请参考以下文章