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

设置

有多少问题?

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答您的问题。 首先,Django 是一个流行的 Python Web 框架,它提供了许多强大的功能,其之一就是 ORM(对象关系映射)。 ORM 允许您使用 Python 对象来处理数据库操作,而不是直接编写 SQL 语句。这样做有很多好处,比如更容易维护和更易于理解。 下面是一些基本的 ORM 操作,用于在 Django 执行增删改操作。 首先,要使用 ORM,您需要在您的 Django 项目创建一个模型。模型是一个 Python 类,它代表了数据库的一个表。 例如,这是一个简单的模型类,它代表了一个名为 `Book` 的表: ``` from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=100) published_date = models.DateField() ``` 接下来,我们可以使用以下代码将一个新的 `Book` 对象插入到数据库: ``` book = Book(title='Django for Beginners', author='William Vincent', published_date='2021-01-01') book.save() ``` 我们可以使用以下代码来更新一个现有的 `Book` 对象: ``` book = Book.objects.get(title='Django for Beginners') book.author = 'William S. Vincent' book.save() ``` 最后,我们可以使用以下代码来删除一个 `Book` 对象: ``` book = Book.objects.get(title='Django for Beginners') book.delete() ``` 这些是最基本的 ORM 操作,但是 Django ORM 还提供了许多其他的高级功能,比如过滤、排序和聚合查询等。如果您想了解更多信息,请查看 Django 的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值