2011-01-26 45 views
1

我一直在这一天,有点现在,试图找出如何最好地模拟数据库(MySQL)的一个应用程序,我正在开发一个朋友拥有一间面包店。该假设如下:数据库设计问题 - 试图避免循环引用

  • 许多(外部)Bakers产生许多Products
  • BakersProducts是由某些员工每两周更新无论谁打电话面包师为他们的产品价格,或面包师传真通过他们的价目表自己,这对然后员工通过前端UI进行更新。
  • 经理应该能够根据她产生的订单产生她预计有。

所以前端的UI必须能够让管理者单纯选择,她想在订购的商品,然后用面包师的名单从顺序每一个产品的选择呈现了她。

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

enter image description here

我敢肯定,我已经对这个错误的方式,真的希望任何人的意见,我怎么能调整自己的设计acccommodate所选择的产品价格 - 即。包括BakersProducts.bpID

谢谢!

+0

我不太看这里的循环引用。 – ybakos 2011-12-17 20:41:54

回答

2

我觉得混淆是从业务流程的角度来看:你得到申请夹杂了订单

一个请购单有一个需要的产品列表,而不必指定每个供应商的供应商,而一个订单针对特定的供应商,针对特定的价格查询代码(bpID似乎代表了什么)。一个请购单可能产生多个订单,如果它被分割到多个供应商,甚至一个产品的订单可能会分散到多个供应商,可能是由于供应商数量限制或交货地点。

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

+0

thanx杰弗里,你是发现!我错误地试图合并一个*请求*和一个*命令*。所以理想情况下,我应该有一个中间的`Requisition`表来显示“所需”的产品,然后(基于此),我的`Orders`表引用`BakersProducts.bpID`? – magz 2011-01-26 08:10:36

1

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

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

如果你指望面包师进行同样的产品,那么你可能想离开单独的产品表,但不是有Order_has_Products.Products_productID,我将其更改为Order_has_Products.bpID。如果/当您需要访问productName(或其他与该表格相关的产品相关元数据),则可以在BakersProducts和Products之间进行连接。

3

这不是一个循环引用,因为

  • Order_has_products引用产品
  • Order_has_products引用BakersProducts
  • BakersProducts引用产品

循环引用将是如果,例如,

  • Order_has_products引用产品
  • 产品的引用BakersProducts
  • BakersProducts引用Order_has_products

除了,循环引用是在数据库中相对正常的(即带有管理员字段的员工表,其中经理自己是员工,是一个表的循环参考)

您的设计有一个简单的冗余,因为一个产品在Order_has_products表中被引用两次 - 一次直接从产品表,一次通过相关的BakersProducts记录。可能会出现不同步的情况,但是,由于您声明业务规则是在面包师面前选择产品,因此完全没问题。

即使是相反的方法,我也会包含productID,因为在加速查询时,一些非规范化操作可能会有很长的路要走,因为否则,您将不得不扫描BakersProducts表,即使对于类似的问题, “星期三我们有没有百吉饼?”

+0

好吧,thanx澄清'循环参考'问题。我只是想象这种情况是一个循环引用,因为产品会采用多个订单路线。我认为,尽管杰弗里的上述答案有助于尝试将订单请求与实际订单分开。 – magz 2011-01-26 08:17:17