【问题标题】:PHP - Populating aggregated objects - Best PractisePHP - 填充聚合对象 - 最佳实践
【发布时间】:2015-04-04 18:16:45
【问题描述】:

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

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

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

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

非常感谢您的宝贵时间。

编辑:(基于 KIKO Software cmets)

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

谢谢

【问题讨论】:

    标签: php oop orm data-mapping


    【解决方案1】:

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

    正如您在评论中指出的那样,这是调用 lazy-loading:您只检索所需的内容。

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

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

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

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

    【讨论】:

    • 谢谢你的解决方案,我可以看看它是否符合需要。如果我需要急切加载,还有其他解决方法吗?其次,通常是什么原因导致检索过程变慢:从数据库中检索数据或遍历每条记录以填充对象? (如果数据库表大小不太大)
    • 你的第一个问题真的应该在答案中回答,而不是在评论中。至于您的第二个问题:数据库访问比您将检索到的数据存储在 php 对象中所做的任何事情都慢得多。因此,当您不需要访问数据库时,您不应该这样做。许多因素可以加速数据库访问,例如:服务器的位置、服务器的速度、索引、适当的数据规范化等等。仅仅使用连接并没有太大帮助。但每当有疑问时测量它!
    • 我已根据您的 cmets 编辑了我的原始问题。谢谢你给我指路。
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2011-01-25
    • 2023-03-21
    相关资源
    最近更新 更多