[英]Database design issue - trying to avoid circular reference
我已经待了一天零一天,试图弄清楚如何为我正在为拥有一家面包店的朋友开发的应用程序最好地对数据库(MySQL)建模。 假设如下:
Bakers
生产许多Products
BakersProducts
由某些员工每两周更新一次,他们要么致电面包师询问产品价格,要么面包师自己通过其价目表传真,然后由职员通过前端UI更新。 因此,前端用户界面必须能够允许经理纯粹选择订单中想要的产品,然后向她展示一份面包师列表,供订单中的每种产品选择。
换句话说, Orders_has_Products
还应该包含对BakersProducts.bpID
的引用。 我敢肯定,如果我这样做,那么我将创建对Products
的循环引用(某种形式)。
我确定我做错了这条路,并且非常感谢任何人的建议,说明我如何重组我的设计以适应所选的产品价格-即。 包括BakersProducts.bpID
。
谢谢!
这不是循环引用,因为
例如,如果
除此之外,循环引用在数据库中是相对正常的(即,具有经理字段的“雇员”表,其中经理本身就是雇员,是一个表的循环引用)
您的设计具有简单的冗余性,因为在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.