1

我已经研究了一天又一天,试图弄清楚如何为我正在为拥有面包店的朋友开发的应用程序最好地建模数据库(MySQL)。假设如下:

  • 许多(外部)Bakers产生许多Products
  • BakersProducts由某些员工每两周更新一次,他们要么打电话给面包师询问他们的产品价格,要么面包师自己通过他们的价格表传真,然后工作人员通过前端 UI 更新。
  • 经理应该能够根据她预期拥有的产品生成订单。

所以前端 UI 必须能够让经理在订单中纯粹地选择她想要的产品,然后为她呈现一份 Bakers 列表,让她为订单中的每个产品进行选择。

换句话说,Orders_has_Products还应该包括对BakersProducts.bpID. 我敢肯定,如果我这样做,那么我会创建一个循环引用(排序)到Products.

在此处输入图像描述

我确定我走错了路,并且非常感谢任何人关于如何重组我的设计以适应所选产品价格的建议 - 即。包括BakersProducts.bpID.

谢谢!

4

3 回答 3

3

这不是循环引用,因为

  • Order_has_products 参考产品
  • Order_has_products 参考 BakersProducts
  • Bakers产品参考

循环引用将是,例如,

  • Order_has_products 参考产品
  • 产品参考 BakersProducts
  • BakersProducts 参考 Order_has_products

除此之外,循环引用在数据库中是相对正常的(即带有经理字段的雇员表,其中经理是她自己,雇员是一个表循环引用)

你的设计有一个简单的冗余,因为一个产品在 Order_has_products 表中被引用了两次——一次直接来自 Products 表,一次通过相关的 BakersProducts 记录。存在不同步的可能性,但是,由于您说业务规则是在面包师之前选择产品,所以没关系。

即使是相反的方式,我也会包含 productID,因为在加快查询速度时,一点点非规范化可能会有很长的路要走,否则你将不得不扫描 BakersProducts 表,即使是简单的问题,比如,“我们有没有星期三有百吉饼吗?

于 2011-01-26T07:58:47.573 回答
2

我认为这种混淆是从业务流程的角度来看的:您将请购单订单混淆了。

申请具有所需产品的列表,而不必指定每个产品的供应商,而订单针对特定的供应商,用于特定的价格查询代码(bpID似乎代表什么)。如果一个请购单在多个供应商之间拆分,它可能会产生多个订单,甚至一个产品也可能在多个供应商之间拆分其订单,这可能是由于供应商数量限制或交付地点的原因。

您可能希望提供一个申请视图,该视图显示从每个申请行项目生成的订单行项目,但这是一个用户界面问题。

于 2011-01-26T07:59:17.417 回答
1

解决这个问题的一种方法是简单地删除 Products 表,并将 productName 移动到 BakersProducts 表中。

如果您不希望面包师携带相同的产品,如果产品对面包师来说是独一无二的,这基本上只会起作用。

如果您确实希望面包师携带相同的产品,那么您可能希望保留单独的 Products 表,但我会将其更改为 Order_has_Products.bpID,而不是 Order_has_Products.Products_productID。如果/当您需要访问 productName(或其他可能在该表中的产品相关元数据)时,您可以在 BakersProducts 和 Products 之间进行连接。

于 2011-01-26T07:58:27.620 回答