【问题标题】:How to efficiently store sql in a PHP application? [closed]如何在 PHP 应用程序中有效地存储 sql? [关闭]
【发布时间】:2016-04-15 23:15:12
【问题描述】:

我有一个应用程序,它有很多在多个地方重复使用的查询。存储这些最有效的方法是什么?我的直觉是将它们存储在一个类的数组中,即:

$sql['report 1'] = "SELECT this FROM that WHERE expression";
$sql['report 2'] = "SELECT this FROM that WHERE expression2";

等等

另一位参与此项目的开发人员使用 switch case 完成了这项工作:

switch($query){
    case 'report 1': 
        $sql = "SELECT this FROM that WHERE expression1";
        break;
    case 'report 2':
        $sql = "SELECT this FROM that WHERE expression2";
        break;
 }
 $result = runquery($sql);

我的另一个想法是每个报告都应该是一个独立的函数:

function report1(){
    // run the query here
    return result;
}
function report2(){
    // run the query here
    return $result;
}

我更喜欢数组方法,因为它看起来代码更简洁,但是由于查询量很大,这在内存使用方面是不是很浪费?不是所有查询最终都存储在内存中吗?

switch case 方法似乎有点笨拙。这些方法的优缺点是什么?有没有一种方法可以突出“最好的方法”来做到这一点?或者也许是我没有考虑过的另一种方法?

【问题讨论】:

  • 不要“存储” SQL 查询。在一个地方定义它们并调用该函数。
  • 老实说,我也有很多查询可以运行,但我不会将它们保存在任何地方。我正在用 querybuilder 类编写它们。例如。 $sql = querybuilder::newInstance()->table('settings')->select("*"); //returns the PDOStatement object。这似乎是在浪费磁盘空间,但是如果您想从该表中获取更多指定或不同的数据,您现在会添加另一个函数吗?我只会在上面的列表中添加更多方法(或者其他开发人员只会扩展 sql 字符串)。老实说,我看不到使用数组、开关或函数只返回 sql 数据的优点。
  • 我同意@juergen。最好的方法是创建一个存储库类,其中包含如下方法:public function getReport1(),其中包含 SQL 查询并获取结果。然后很容易将存储库类与依赖注入等交换以测试/更改存储。

标签: php mysql function switch-statement memory-efficient


【解决方案1】:

我很久以前就遇到过这个问题。促使我们解决这个问题的痛点是,我们看到代码中散布着大量重复的 SQL 查询。

我们有自己的本土 MVC 框架,我们有用于数据库访问的简单包装类,但我们经常在多个模型类中发现相同的 SQL 查询。

我们当时认为没有必要将 SQL 分解为数据访问层中的单独函数 - 这样会更简洁,但会在架构中引入一个全新的“层”,以及那个额外的层复杂性是不必要的。我们也不想将模型类重新设计得更细化——我们承受着很大的时间压力,团队认为基本结构并没有造成任何痛苦——只是重复的 SQL 查询伤害。

我们的解决方案非常基本。我们为每个查询创建了一个包含变量的 PHP 文件(它不是您描述的数组,每个查询只有一个变量)。我们使用大写符号约定来表示它是“常量”。我们在 SQL 文件中随意添加 cmets,并使用命名约定来帮助开发人员理解意图,而不是机制。比如:

$REPORT1_GET_THIS_FOR_EXPRESSION = "SELECT this FROM that WHERE expression";
$REPORT2_GET_THIS_FOR_EXPRESSION2 = "SELECT this FROM that WHERE expression2";

我们在所有模型类中都包含了这个 PHP 文件。是的,它会占用内存,但并不像您注意到的那样 - 事实上,内存使用量可能较低,因为在运行时这些相同的字符串不会在其他源文件中重复。

这对于我们的(小型)项目来说效果很好,大约有 3 名开发人员在同一个房间里一起工作。我们的老板重视上市时间而不是可维护性或可扩展性,这非常有效。代码是可读的,我们可以在一个地方更改 SQL 查询并修复许多错误。

我不会使用“switch”语句解决方案。每个 SQL 语句是 3 行代码(而不是一行代码),并且涉及一个可能出错的逻辑语句(cyclomatic complexity 将通过屋顶)。根据我的经验,更少的代码几乎总是更好...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多