Table Data Gateway的实现与Active Record有何不同?

时间:2012-01-01 15:33:16

标签: php design-patterns activerecord

简单介绍一下Table Data Gateway(TDG)实现:您创建了单独的TDG类,其中包含用于具有特定表的CRUD操作的SQL。因此,您的模型不是直接与数据源(例如数据库)通信,而是通过那些抽象的 - TDG类。因此,它只是一种进行另一级抽象的方法,它只是与数据库通信的包装器 - 获取和修改数据。恕我直言TDG类不应包含成员,只能包含方法。这是一个可视化使用TDG pattern的好模式。使用TDG方法时,SQL应该从模型类移动到数据源(TDG)类。我通过TDG类从DB检索的所有数据都存储在我的模型成员中。

现在,活跃的记录实施怎么样?如果我将数据访问和我的模型类合并到一个模型类中,那么我会实现活动记录吗?我无法找到明确的区别或这些模式在PHP中的外观和彼此不同。

通常,我有一个单例数据库类,然后为每个数据库表分离模型类。每个模型类都有CRUD +几个自定义(计数,平均等)操作。有些类具有成员来保持CRUD或自定义操作的结果 - 这是根据需要完成的。这种方法可以被确定为活跃记录吗?另外,如果我将SQL从我的模型类移到TDG类,那么这将是Table Data Gateway吗?

1 个答案:

答案 0 :(得分:14)

来自http://martinfowler.com/eaaCatalog/index.html

  

表数据网关:充当数据库表的网关(466)的对象。一个实例处理表中的所有行。

enter image description here

  

Active Record:一个对象,它在数据库表或视图中包装一行,封装数据库访问,并在该数据上添加域逻辑。

enter image description here

明显的主要区别是TDG包装对的访问并且仅返回行数据,而AR包裹对表的访问 / em>为其添加业务逻辑。

除非您的阻抗不匹配非常低,否则首选TDG是因为对于AR,您的业务/域对象遵循数据库中的结构,我们通常不应该如何对域对象进行建模。 A Row可能知道如何坚持自己,但是一个人不应该知道。从长远来看,分离持久性逻辑和域逻辑更加可维护。

关于您的Singleton DB对象,请查看Is there a use-case for singletons with database access in PHP?