Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库设计问题-试图避免循环引用_Mysql_Database Design_Circular Reference - Fatal编程技术网

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

Mysql 数据库设计问题-试图避免循环引用,mysql,database-design,circular-reference,Mysql,Database Design,Circular Reference,我已经做了一天一点了,试图找出如何为我为一位拥有面包店的朋友开发的应用程序最好地建模数据库MySQL。假设如下: 许多外部面包师生产许多产品 BakersProducts由某些员工每两周更新一次,他们要么致电bakers询问产品价格,要么面包师通过自己的价格表传真,然后员工通过前端UI更新价格表。 经理应该能够根据预期的产品生成订单。 因此,前端UI必须能够允许经理在订单中选择她想要的产品,然后向她提供一份面包师列表,供她为订单中的每种产品选择 换句话说,Orders\u has\u Produ

我已经做了一天一点了,试图找出如何为我为一位拥有面包店的朋友开发的应用程序最好地建模数据库MySQL。假设如下:

许多外部面包师生产许多产品 BakersProducts由某些员工每两周更新一次,他们要么致电bakers询问产品价格,要么面包师通过自己的价格表传真,然后员工通过前端UI更新价格表。 经理应该能够根据预期的产品生成订单。 因此,前端UI必须能够允许经理在订单中选择她想要的产品,然后向她提供一份面包师列表,供她为订单中的每种产品选择

换句话说,Orders\u has\u Products还应包含对BakersProducts.bpID的引用。我确信,如果我这样做,那么我会创建一个类似于产品的循环引用

我确信我的做法是错误的,我非常感谢任何人的建议,告诉我如何调整我的设计,以适应所选的产品价格,即包括BakersProducts.bpID


谢谢大家!

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

如果你不希望面包师携带相同的产品,如果这些产品是面包师独有的,那么这基本上是有效的


如果您确实希望面包师提供相同的产品,那么您可能希望离开单独的产品表,但我会将其更改为Order\u has\u Products.bpID,而不是Order\u has\u Products.bpID。如果/当您需要访问该表中可能包含的productName或其他与产品相关的元数据时,您可以在BakersProducts和Products之间进行连接。

解决此问题的一种方法是删除Products表,然后将productName移到BakersProducts表中

如果你不希望面包师携带相同的产品,如果这些产品是面包师独有的,那么这基本上是有效的


如果您确实希望面包师提供相同的产品,那么您可能希望离开单独的产品表,但我会将其更改为Order\u has\u Products.bpID,而不是Order\u has\u Products.bpID。如果/当您需要访问该表中可能包含的productName或其他与产品相关的元数据时,您可以在BakersProducts和Products之间进行连接。

这不是循环引用,因为

订单有产品参考产品 订单中有产品参考和烘焙产品 BakersProducts参考产品 循环引用将是,例如

订单有产品参考产品 产品参考面包师产品 BakersProducts参考订单 除此之外,循环引用在数据库中是相对正常的,即带有manager字段的Employees表,其中manager本身就是Employees,而Employees是单表循环引用

您的设计有一个简单的冗余,因为一个产品在Order_has_products表中引用了两次——一次直接从products表引用,一次通过相关的BakersProducts记录引用。不同步是有可能的,但是,既然你说商业规则是在面包师之前选择产品,那就没关系了


我会包括productID,即使它是另一种方式,因为在加速查询时,一点非规范化可以大有帮助,因为否则你将不得不扫描BakersProducts表,即使是简单的问题,比如“我们星期三有面包圈吗?”

这不是循环引用,因为

订单有产品参考产品 订单中有产品参考和烘焙产品 BakersProducts参考产品 循环引用将是,例如

订单有产品参考产品 产品参考面包师产品 BakersProducts参考订单 除此之外,循环引用在数据库中是相对正常的,即带有manager字段的Employees表,其中manager本身就是Employees,而Employees是单表循环引用

您的设计有一个简单的冗余,因为一个产品在Order_has_products表中引用了两次——一次直接从products表引用,一次通过相关的BakersProducts记录引用。不同步是有可能的,但是,既然你说商业规则是在面包师之前选择产品,那就没关系了


我会包括productID,即使它是另一种方式,因为在加速查询时,一点非规范化可能会大有帮助,因为否则你将不得不扫描BakersProducts表,即使是简单的问题,比如“我们星期三有面包圈吗?”

我认为这是一个商业专业人士的错误 cess的立场:你的请购单和订单混在一起了

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


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

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

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


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

thanx Jeffrey,您很正确!我错误地试图将请购单与订单合并。因此,理想情况下,我应该有一个中间请购表来显示所需的产品,然后在此基础上,让我的订单表引用BakersProducts。bpID?@magz:现在我想一想,BakersProducts行实际上更像是一个项目报价,而不是PLU或SKU,当然不仅仅是面包师和产品之间的一张交叉桌子。它的真正主键应该是bakerId、productId、bpDate,而bpID是代理键。从订单行项目而不是订单本身引用bpID是指示该行项目所基于的报价的好方法。或者,删除bpID并在引用订单时使用整个3字段复合键,以便快速链接到Baker和Product。@Jeffrey:thanx!是的,bpID是一个代理,因为我不能在另一个表中引用复合键bakerID、productID、bpDate。你介意我在DBDesigner中快速地把它敲起来,看看这对我有什么影响吗?如果你不介意的话,我可能还有一个问题要问你。@Jeffrey:你对Bakers产品的设想是正确的。@Jeffrey:看看这项修正案[.我决定包括一个请购单表,因为它提供了一个很好的平台,可以在UI端生成一个比较视图,使经理能够根据最佳交易生成订单。你预见到这种设计有任何问题吗?thanx Jeffrey,你说得对!我错误地尝试将请购单与订单合并。因此,理想情况下,我应该有一个中间请购表显示所需的产品,然后在此基础上,让我的订单表引用BakersProducts。bpID?@magz:现在我想起来,BakersProducts行实际上更像是一个项目报价,而不是PLU或SKU,当然也不仅仅是Bakers和产品之间的交叉表。它真正的主键是sh应该是bakerId、productId、bpDate,而bpID是代理键。从订单行项目而不是订单本身引用bpID是指示行项目基于哪个报价的好方法。或者,在从订单引用时,删除bpID并使用整个3字段复合键,以便快速链接到Baker和Pr产品也是。@Jeffrey:thanx!是的,bpID是一个代理,因为我不能在另一个表中引用复合键bakerID、productID、bpDate。你介意我在DBDesigner中快速地把它敲出来,看看这对我有什么影响吗?如果你不介意的话,我可能会有一个基于此的附加问题。@Jeffrey:“面包师产品的设想是什么?”杰弗里:看看这项修正案[.我决定包括一个请购单表,因为它提供了一个很好的平台,可以在UI端生成一个比较视图,使经理能够根据最佳交易生成订单。您是否预见到这种设计会有任何问题?好的,thanx用于澄清“循环参考”问题。我只是想象这个场景是一个循环参考since一个产品将通过不止一条途径获得订单。我认为Jeffrey的上述回答有助于将订单请求与实际订单分开。好的,thanx用于澄清“循环参考”问题。我只是将此场景想象为循环参考,因为一个产品将通过不止一条途径获得订单。我认为我相信Jeffrey的上述回答有助于将订单请求与实际订单分开。我不太明白这里的循环引用。我不太明白circ 这里有参考资料。