【问题标题】:Web apps: Separate SQL completely from the codeWeb 应用程序:将 SQL 与代码完全分离
【发布时间】:2013-08-17 08:47:49
【问题描述】:

这是一个设计问题,我一直在思考这个问题。

我想在独立文件或内存位置中分离 SQL 查询(以便更快地访问)。

查询将像这样存储:

SELECT .... WHERE col = ?

当需要查询时,从它的位置获取它。

一个(不太可维护的)示例替代方案是:

$sql = "select ..... where col=". prevent_injection($val) ." and ....";

好处:

  • 查询完全分离:Web 开发人员和 DBA 可以根据自己的角色专门工作
  • 更简洁的查询

缺点:

  • 需要在每个方面进行一些协调?意味着,这在一个大团队中无论如何都是必要的
  • 在运行时获取 SQL 可能会减慢速度,但可以使用缓存

对此方法有何反馈?

【问题讨论】:

  • 拥有大型 SQL 系统的大型组织将所有内容都编码到存储过程中,从而为数据库提供完整的接口。不允许出于任何目的在该系统之外进行访问。
  • 对这个过程的查询不一样
  • 这不是像 EF 和 ActiveRecord 这样的 ORM 吗?即他们抽象出 SQL。此外,一旦您超越单个选择语句,即 CTE、连接和子选择,这将如何扩展。我怀疑你依赖于 RDBMS 查询分析器。 DBA 和 SQL 开发人员确实有其不同的角色,DBA 可以针对您的应用程序优化数据库基础架构,无论是添加更快的磁盘、fs 还是更多的 CPU。 SQL 开发人员应了解索引、架构设计和安全性的最佳实践。

标签: php sql architecture


【解决方案1】:

您应该了解一下 MVC(模型视图控制器)架构模式。它将让您实现您的目标:数据、逻辑和表示的分离。

在 MVC 中,您的模型将处理所有与 SQL 相关的逻辑,因此其他两层将永远不必处理查询。

看看实现 MVC 模式的 PHP 框架,它们将大大简化将此模式应用到您的项目中。我个人最喜欢的是Laravel 4,但还有很多其他的,例如FuelPHPCodeIgniterCakePHP 等。

这些框架中的大多数还具有缓存机制作为奖励,它们能够利用其他方式来加速您的 Web 应用程序:例如 Redis 和 Memcache。

【讨论】:

【解决方案2】:

通常我使用两种方法来防止 SQL 注入。

像 propel 这样的 ORM,它自己处理所有的 SQL 注入问题。你不需要关心细节。并且有几个 MVC 框架正在使用 ORM。

PHP 数据对象(又名:PDO)扩展。您可以编写如下代码。它还自己处理所有的 SQL 注入问题

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); $stmt->执行();

根据你想要的好处,我建议你可以使用 PDO 进行清晰的 SQL 并保持轻量级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多