繁体   English   中英

数据库设计问题-尝试避免循环引用

[英]Database design issue - trying to avoid circular reference

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

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

因此,前端用户界面必须能够允许经理纯粹选择订单中想要的产品,然后向她展示一份面包师列表,供订单中的每种产品选择。

换句话说, Orders_has_Products还应该包含对BakersProducts.bpID的引用。 我敢肯定,如果我这样做,那么我将创建对Products的循环引用(某种形式)。

在此处输入图片说明

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

谢谢!

这不是循环引用,因为

  • Order_has_products参考产品
  • Order_has_products参考BakersProducts
  • 贝克产品参考产品

例如,如果

  • Order_has_products参考产品
  • 产品参考贝克产品
  • BakersProducts参考Order_has_products

除此之外,循环引用在数据库中是相对正常的(即,具有经理字段的“雇员”表,其中经理本身就是雇员,是一个表的循环引用)

您的设计具有简单的冗余性,因为在Order_has_products表中两次引用了一种产品-一次直接从Products表中引用,一次通过相关的BakersProducts记录引用。 可能会出现不同步的情况,但是,由于您说过业务规则是在面包师之前选择产品,所以没关系。

我会包括productID,即使是相反的情况也是如此,因为在加快查询速度时,略微的非规范化会大有帮助,因为否则,您将不得不扫描BakersProducts表,即使是类似的问题,例如“周三有百吉饼吗?

我认为这是从业务流程的角度来看的:您将申请订单混在一起。

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

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

解决此问题的一种方法就是简单地消除Products表,然后将productName移到BakersProducts表中。

如果您不希望面包师携带相同的产品(如果产品是面包师所独有的),那么这基本上是有效的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM