当前位置: 首页 > 工具软件 > Just ORM > 使用案例 >

mysql批量查询orm_使用多对多关系(ORM)减少MySQL中的查询

隆璞
2023-12-01

设置

有多少问题?

就查询而言:类别必须查询其中的所有部分,这些部分必须查询其中包含的所有产品。还不错,但是每个产品都必须查询它的所有产品属性、层定价和标志。因此,在一个类别中添加更多的产品会使查询增加很多倍(因为我目前主要使用ORM)。在一个部分中有几百个产品将导致几百个查询。小问题,但这仍然是不好的。

到目前为止。。。

所有的钥匙都有索引。我可以用一个查询(见下面的编辑)提取所有信息,但是,正如您所想象的那样,这将导致每个产品、每个额外的(例如)属性、标志等在多行中分布大量冗余数据。

解决这个问题的方法其实很简单,而我现在对此一无所知,老实说,这是一种解脱。或许不是。我不确定。如果我的任何解释不足以理解这个问题的话,尽管问,我会尽量举一个更好的例子。

(编辑:给出了更好的例子,见下文)

不过,旁注。。。

非常感谢你!

编辑

在这个例子之前,我还应该做两个澄清:(1)也有一些多对多的关系,(2)你可以把我所寻找的比作交叉表查询。

让我们简化一下,假设我们有3个主表:

产品属性(产品属性id、产品id、值)

和1个旋转距骨:

产品通知(通知id、产品id)

因此,根据每个“产品”,我们列出了产品名称和添加的产品日期。但是,我们还需要列出所有的产品属性。每个产品有0个或多个。我们还必须显示产品有哪些通知,其中也有0个或更多。

所以目前,它的工作原理基本上是:

foreach ($products->find_all() as $product) //given that $products is an ORM object

{

echo $product->product_id; //lets just pretend these are surrounded by html

echo $product->product_name;

foreach ($products->product_attributes->find_all() as $attribute)

{

echo $attribute->value;

}

foreach ($products->notifications->find_all() as $notification)

{

echo $notification->notification_label;

}

}

这当然过于简单化了,但这是我所说的原则。这个

已经很好了。

然而

函数的作用是:返回以下行的查询结果:

SELECT product_attributes.* FROM product_attributes WHERE product_id = '#'

,以及类似的通知。它对每个产品都进行这些查询。

因此,虽然这很有效,但它的伸缩性不好,因为它可能会导致数百个查询。

如果我执行一个查询以在一个查询中获取所有数据,请执行以下行操作:

SELECT p.*, pa.*, n.*

FROM products p

LEFT JOIN product_attributes pa ON pa.product_id = p.product_id

LEFT JOIN product_notifications pn ON pn.product_id = p.product_id

LEFT JOIN notifications n ON n.notification_id = pn.notification_id

(再次过于简单化)。这会获取数据本身,但根据产品的每个属性和通知,都会返回一个包含冗余信息的额外行。

product_id, product_name, product_date_added, product_attribute_id, value, notification_id, notification_label

1, My Product, 10/10/10, 1, Color: Red, 1, Add This Product

2, Busy Product, 10/11/10, 2, Color: Blue, 1, Add This Product

2, Busy Product, 10/11/10, 2, Color: Blue, 2, Update This Product

2, Busy Product, 10/11/10, 3, Style: New, 1, Add This Product

2, Busy Product, 10/11/10, 3, Style: New, 2, Update This Product

不用说那是很多多余的信息。每个产品返回的行数将是它拥有的属性数乘以它拥有的通知数。

ORM(或者,通常只是在循环中创建新的查询)将每一行中的所有信息合并到它自己的对象中,从而使数据能够更合理地处理。那是石头。在一个查询中调用信息可以消除可能数百个查询的需要,但会在行中创建大量冗余数据,因此不会在简洁的集合中返回(一个/多个)到多个关系数据。那是个困难的地方。

抱歉这么长时间了,想彻底点,哈哈,谢谢!

 类似资料: