2010-12-02 101 views
1

我一直在使用Zend的MVC结构一段时间了,但到目前为止,我的模型已被限制为只反映我个人的数据库表。当涉及到编写模型以反映更复杂的结构(例如多对多关系数据库)时,我不确定该从哪里去。有没有人知道如何处理设计更复杂的模型的任何良好的资源/教程(最好是在线,但书本建议也赞赏)?设计比简单的Db表模型更复杂的模型

回答

0

听起来你准备好抽象的另一层。这里的一个3层系统:

  1. 数据层:实际上触摸分贝
  2. 业务逻辑层:刚进行操作上的数据,换乘到/从1)和3)
  3. 应用/控制器层:接受输入,在做任何事情时都会询问业务逻辑,而不会直接触及“unsanitized”数据层。

请注意,此分层架构不在您的演示文稿框架的其余部分。你仍然应该有一个模板系统,你的应用程序层将实现它;业务层和数据层只处理数据。这种技术集中了业务逻辑,并允许您尽可能地用尽可能少的努力换出其他层。 (不容易,但只是很容易。)

请参阅here关于扩展只是略微超出您当前的方法的一些信息。有关业务逻辑层的一些策略,请参阅here。他们不谈论单独的数据层,但这仍然是我的建议。

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

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; 
?>