【问题标题】:Where to post-process data retrieved from database在哪里对从数据库检索到的数据进行后处理
【发布时间】:2011-07-15 17:03:27
【问题描述】:

由于性能原因,我们重构了一些快速的“n”脏数据访问 (sql) 实现。 和之前一样,我们一步一步地访问我们的对象。首先是基本数据,而不是用一些相关数据填充它,这些数据可能会用一些其他相关数据填充。

到目前为止,所有数据都在单个 sql 语句中访问,这些语句更复杂,但不是太多 - 有四个连接顶部。

因此,我们检索的数据不是对象格式(实际上是嵌套数组),例如

prop1
prop2 -> prop2a,
         prop2b -> prop2b1
                   prop2b2
prop3 -> prop3a
         prop3b

数据都是“扁平的”,比如

prop1
prop2a
prop2b1
prop2b2
prop3a
prop3b

我的 oo-instincts 告诉我在检索后对这些数据进行预处理,并将其发送到类对象结构中的前端(html、js - 这是我们唯一的客户端),因为它已在重构之前发送。另一方面,性能原因意味着只处理真正需要的量,如果可能的话,让客户做一些工作量。

底线:一般来说,这里的最佳/好的做法是什么?

a) 处理后端的数据准备

b) 将检索到的数据发送到前端并在那里进行处理

c) 尽快切换到 ORM 架构

非常感谢,

罗布森

【问题讨论】:

    标签: php sql database performance orm


    【解决方案1】:

    鉴于我使用了 20 多年的所有应用程序,性能始终为王。您应该始终让 RDBMS 通过使用连接来完成其工作,以及您需要在后端执行的任何操作以仅检索您需要的数据(注意:您可能需要查看“解释计划”或等效项或在表上添加索引以获取最好的表现)。

    无论如何,只检索您需要的数据。通过检索更多数据,您可以“通过网络”添加更多数据,然后必须在前端处理和删除数据。

    至于 ORM - 这是一个经常被遵循的模型,我也坚信使用 ORM 工具,但不要仅仅为了创建对象而创建对象。如果我可以返回 100 行完全符合我需要的数据,而不是返回 100 个相关对象,我更愿意(出于性能原因)返回前者。

    我的投票是 a)。我总是喜欢在后端做尽可能多的工作,因为您将来可能有不同类型的客户端。

    【讨论】:

    • +1 让 RDBMS 完成其工作。如果您无论如何都在编写自己的查询(而不是使用 ORM,我不一定推荐),请查询您需要的内容并调整您的 SQL。四个连接的任意限制无缘无故地让您的生活更加艰难。
    • 谢谢亚瑟。关于您的评论:仅检索您需要的数据。 1)是否有经验法则,何时区分?说数据开销与代码简单性 2)如果您确实需要区分:一般来说,您会在哪里做呢?您更愿意编写单独的查询还是只编写单独的后处理方法?谢谢大福格尔。我们对最大值没有限制。加入查询。 4 只是我们当前的最大值。不过还是谢谢你的警告。我可能倾向于这样的事情:)
    • 通常我可以(如果需要)为每一行检索额外的列(例如,id - 或其他外键)以优化未来的查询,但我从不检索额外的行。就多个查询的复杂查询而言,我会再次选择到某个点的复杂查询。我不认为三路连接很复杂,并且像任何其他代码一样,您可以很好地对其进行注释,并且它变得更容易理解。
    • 感谢您的帮助,亚瑟。再次感谢。
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多