PHP-填充聚合对象-最佳实践


PHP - Populating aggregated objects - Best Practise

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

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

我不想使用任何ORM,因为在我看来,ORM对于这些数量的联接来说效率非常低

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

非常感谢您抽出时间。

编辑:(基于KIKO软件评论)

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

感谢

您应该在产品对象中为proterties、categories、颜色和大小等对象获取并设置方法。我通常只会在实际需要的时候检索这些对象。所以只有当你使用get程序时。通过这种方式,您可以非常快速地创建一个新的产品对象,因为它不会因为检索所有数组而减慢速度,尤其是当您甚至没有使用它们时。

正如您在评论中指出的,这就是所谓的懒惰加载:您只检索所需的内容。

我看不出急于加载数据库数据的充分理由。换句话说:尽快加载所有内容。唯一的原因可能是,如果你能比懒惰加载数据更快地完成这项工作,并且你知道你可能需要所有的数据。

我认为,在PDO中,除了正常的数据库优化之外,没有什么可以加快从不同表中检索几行的速度。fetchAll()可能比fetch()稍快,但这将是边际的。因此,最佳策略仍然是延迟加载

但是,有几种方法可以实现延迟加载。无论何时调用get方法,都只能检索请求的行,或者可以一次性从关联的tablet中检索所有需要的行。当有很多行要检索,而您可能只需要其中的几行时,第一种方法更有效。当没有那么多要检索的行并且您可能无论如何都需要其中的大多数行时,第二种方法是最佳选择。

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