设置
有多少问题?
就查询而言:类别必须查询其中的所有部分,这些部分必须查询其中包含的所有产品。还不错,但是每个产品都必须查询它的所有产品属性、层定价和标志。因此,在一个类别中添加更多的产品会使查询增加很多倍(因为我目前主要使用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(或者,通常只是在循环中创建新的查询)将每一行中的所有信息合并到它自己的对象中,从而使数据能够更合理地处理。那是石头。在一个查询中调用信息可以消除可能数百个查询的需要,但会在行中创建大量冗余数据,因此不会在简洁的集合中返回(一个/多个)到多个关系数据。那是个困难的地方。
抱歉这么长时间了,想彻底点,哈哈,谢谢!