【问题标题】:Data Access Layer, Best Practices数据访问层,最佳实践
【发布时间】:2011-02-21 13:16:52
【问题描述】:

我正在寻找有关在我的基于 PHP 的 Web 应用程序中重构数据访问层 (DAL) 的最佳方式的意见。我遵循 MVC 模式:PHP/HTML/CSS/等。前端的视图,中间的 PHP 控制器/服务,以及位于模型中关系数据库顶部的 PHP DAL。很标准的东西。一切正常,但我的 DAL 变得越来越大(codesmell?)并且变得有点笨拙。

我的 DAL 包含与我的数据库接口的几乎所有逻辑,并且充满了如下所示的功能:

function getUser($user_id) {
   $statement = "select id, name from users where user_id=:user_id";
   PDO builds statement and fetchs results as an array
   return $array_of_results_generated_by_PDO_fetch_method;
}

注意事项:

  • 我的控制器中的逻辑仅使用 DAL 中的上述功能与模型交互
  • 我没有使用框架(我是 PHP是模板的观点 语言,没有必要 通过框架注入复杂性)
  • 我一般使用 PHP 作为程序 语言并倾向于回避 它的 OOP 方法(我喜欢 OOP 发展,但更愿意保留它 PHP 的复杂性)

当您的 DAL 达到这一点时,您采取了哪些方法?我有基本的设计问题吗?我是否只需将我的 DAL 切成多个较小的文件(逻辑上划分它)?谢谢。

【问题讨论】:

  • 您的 DAL 是否使用一个类/文件?还是您将其拆分为多个模型?那么用户模型中只有以用户为中心的信息等?
  • @ircmaxell,它在一个文件中是最新的。我没有使用 OOP 方法,所以它只是一个很大的函数列表。

标签: php database model-view-controller architecture


【解决方案1】:

就您的架构而言,数据库中的每个表(通常)都应该有自己的模型(PHP 类),如果您不这样做,那么我会说您有代码味道。

如果您将每个表都作为模型,那么我不会担心每个类中的代码量。有“胖模型”和“瘦控制器”很好。

如果您想精简一些代码,您可以使用轻量级数据对象包装器,例如 PEAR 的 DB_DataObject。几个 DB_DataObject 模型的示例:


$user = new User;
$user->get($user_id);

$user = new User;
$user->name = 'foo';
$user->find();
while($user->fetch()) {
...
}

使用像 DB_DataObject 这样的东西的好处是你抽象掉了很多低级别的 PDO 东西,你的类实现将更多地关注你的业务逻辑。

【讨论】:

  • 感谢您的回答。我目前没有为每个表构建模型,而是在程序上使用 PHP。这解释了我的胖 DAL。 OOP 方法会自然地将我的 DAL 函数拆分为单独的模型,看起来 PEAR 的 DB_DataObject 可以使该过程相当容易。谢谢。
【解决方案2】:

也许与所提出的实际问题有点离题,但您可能对 Toon Koppelaars 的一系列演讲感兴趣,他是一位非常称职的 Oracle DB 小伙子,关于软件架构,已知(或者应该说,未知)为“The赫尔辛基宣言”。

http://thehelsinkideclaration.blogspot.com/2009/03/helsinki-declaration-observation-1.html

它触及到了你的问题真正涉及的主题,也许有点横向,但无论如何都非常重要。

【讨论】:

  • 我阅读了链接。有趣的!解释了为什么我有这么大的 DAL(很多这项工作曾经被卸载到 DBMS)。感谢您的链接。
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 2017-02-26
  • 2015-09-10
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多