0

我有一个Product对象,它还聚合了一些“对象数组”属性、类别、颜色、大小等。现在我有一个数据库,其中包含针对每个对象的表...... 产品、属性、类别、颜色、大小等。现在我的检索产品列表的查询有 7-8 个连接,因为我的数据库有一些其他表,其中包含产品及其相关实体的多对多关系。

一切皆好。现在,当我从 PDO 检索数据并需要填充我的产品及其所有聚合对象时,问题就来了。我需要制作许多嵌套循环来填充我的 Product 对象数组,这是一项相当繁琐的活动,而且似乎也不是一个好的编程实践(直观地)。

我不想使用任何 ORM,因为我认为 ORM 对于这些连接数量非常低效。

处理这种情况的最佳做法是什么。

非常感谢您的宝贵时间。

编辑:(基于 KIKO Software 评论)

我的大多数产品检索查询的 Where 子句将包含与其聚合实体相关的条件,并且正如我之前所写的,我也有一些多对多关系。所以这意味着即使我进行延迟加载,我也已经在使用数据库资源。那么,在那种情况下,如果我加载结果的一个子集,那么急切加载会是更好的选择吗?如果是这样,我原来的问题还是一样;我不能摆脱太多嵌套循环来加载聚合对象吗?

谢谢

4

1 回答 1

0

你应该在你的产品对象中拥有 get 和 set 方法,比如属性、类别、颜色和大小。我通常所做的只是在实际需要时才检索这些对象。因此,仅当您使用 get 例程时。通过这种方式,您可以非常快速地创建一个新的产品对象,因为它不会因检索所有数组而减慢速度,尤其是当您甚至不使用它们时。

正如您在评论中指出的那样,这称为延迟加载:您只检索所需的内容。

我看不出急切加载数据库数据的充分理由。换句话说:尽快加载所有内容。唯一的原因可能是您是否可以比延迟加载数据更快,并且您知道您可能需要所有数据。

我认为,在 PDO 中,您无法加快从不同表中检索多行的速度(除了正常的数据库优化之外)。fetchAll()可能比 略快fetch(),但这将是微不足道的。所以最好的策略仍然是延迟加载

然而,有几种方法可以实现延迟加载。每当调用 get 方法时,您只能检索请求的行,或者您可以一次性从关联的平板电脑中检索所有需要的行。当要检索大量行并且您可能只需要其中的几行时,第一种方法效率更高。当要检索的行不多并且您可能无论如何都需要其中的大部分时,第二种方法是最佳选择。

因此使用的具体方法取决于您的需要,但在所有情况下延迟加载可能是最佳实践。

于 2015-04-04T18:28:17.427 回答