设计比简单的Db Table模型更复杂的模型

时间:2010-12-02 17:54:11

标签: php model-view-controller design-patterns

我一直在使用Zend的MVC结构一段时间,但到目前为止,我的模型仅限于反映我的个人数据库表。在编写模型以反映更复杂的结构(例如,多对多关系数据库)时,我不确定从何处开始。关于如何设计更复杂的模型,是否有人知道任何好的资源/教程(最好是在线,但书籍建议也很受欢迎)?

2 个答案:

答案 0 :(得分:0)

尽管MVC在网络上是一种非常普遍的开发模式,但是当你进入复杂的结构时,我们会遇到一个名为阻抗的设计问题。

阻抗是使用不同功能模型时出现的开销。例如,OOP编程比数据库中使用的普通结构的限制要少得多 - 您可以组合和聚合对象。为了在数据库上执行此操作,您需要一个N:N关系表。

大多数框架中的当前解决方案是在模型中使用has_many和belongs_to属性。这解决了他的问题,但开销出现了(很多对象,大量的简单查询......)。

对于许多开发人员来说,这听起来很疯狂但是:重写你的模型。

这样做可以使组合/聚合工作变得更容易。由于PHP 5.2+支持某些类型转换(对象和数组),您可以使用它来编写模型:

<?php
class Photo extends Model {
  private $id;
  private $src;
  private $description;
}

class Employee extends Model {
  private $id
  private $name;
  private $age;
  private Photo $photo;
}

$x = new Employee(123);
echo $x->photo->description;
?>

答案 1 :(得分:0)

听起来你已准备好进行另一层抽象。这是一个3层系统:

  1. 数据层:实际触及db
  2. 业务逻辑层:仅对数据进行操作,与1)和3)进行交换
  3. 应用程序/控制器层:接受输入,在执行任何操作时询问业务逻辑,从不直接触及“未经过计算的”数据层。
  4. 请注意,此分层体系结构与您的演示文稿框架的其余部分不同。你仍然应该有一个模板系统,你的应用层将实现它;业务和数据层仅处理数据。这种技术集中了业务逻辑,允许您尽可能少地交换其他层。 (这并不容易,但只是简单。)

    请参阅here,了解有关延伸超出当前方法的一些信息。并且,请参阅here了解有关业务逻辑层的一些策略。他们没有谈论单独的数据层,但这仍然是我的建议。

    要详细说明增加的代码可维护性的净效果,使用这个系统,你可以实际更改db(MySQL到Postgre仍然是痛苦的,但可能)并且只需要更改一层代码。此外,这种技术是PHPBB等应用程序如何能够支持多个数据库引擎,但使用尽可能多的相同逻辑和表示代码。它还允许您交换UI并创建另一个与实现所有业务逻辑的业务对象交互的UI,与视图后面的控制器逻辑分开。