我已经在这一天了一会儿,试图弄清楚如何最好地为我正在为拥有一家面包店的朋友开发的应用程序建模数据库(MySQL)。假设如下:
Bakers
产生了许多Products
BakersProducts
每两周更新一次工作人员,他们要么打电话给面包师的产品价格,要么面包师通过他们的价格表传真,然后工作人员通过前端用户界面进行更新。因此,前端用户界面必须能够让经理纯粹选择她想要的产品,然后向她提供一份面包师列表,供订单中的每个产品选择。
换句话说,Orders_has_Products
还应包含对BakersProducts.bpID
的引用。我敢肯定,如果我这样做,那么我会创建一个循环引用(排序)到Products
。
我确定我已经错误地采用了这种方式,并且非常感谢任何人的建议,即如何重新构建我的设计以适应所选择的产品价格 - 即。包括BakersProducts.bpID
。
谢谢!
答案 0 :(得分:3)
这不是循环引用,因为
循环引用将是,例如,
除此之外,循环引用在数据库中相对正常(即具有经理字段的Employees表,其中经理本人是雇员是一个表循环引用)
您的设计具有简单的冗余,因为一个产品在Order_has_products表中被引用两次 - 一次直接来自Products表,一次通过相关的BakersProducts记录。有可能会失去同步,但是,既然你说商业规则是产品是在面包师面前选择的,那就很好了。
我会包含productID,即使它是另一种方式,因为在加速查询时,一点点的非规范化可能会有很长的路要走,因为否则你将不得不扫描BakersProducts表,即使对于simle问题,例如'我们星期三有没有百吉饼?'
答案 1 :(得分:2)
我认为混淆是从业务流程的角度来看:您将请购单与订单混合在一起。
请购单有一个所需产品清单,而不必指定每个产品的供应商,而订单则针对特定供应商,针对特定价格查询代码(bpID
似乎代表什么)。一个请购单可能会产生多个订单,如果它分散在多个供应商之间,甚至单个产品可能会将其订单分配到多个供应商,可能是由于供应商数量限制或交付地点。
您可能希望提供一个请购单的视图,该请购单显示从每个请购单行项目生成的订单行项目,但这是用户界面问题。
答案 2 :(得分:1)
解决此问题的一种方法是简单地删除Products表,并将productName移动到BakersProducts表中。
如果您不希望面包师携带相同的产品,如果产品是面包师独有的话,这基本上只会起作用。
如果您确实希望面包师携带相同的产品,那么您可能希望保留单独的Products表,但我没有订购Order_has_Products.Products_productID,而是将其更改为Order_has_Products.bpID。如果/当您需要访问productName(或可能在该表中的其他产品相关元数据)时,您可以在BakersProducts和Products之间进行连接。