简单介绍一下表数据网关(TDG)的实现:您将创建单独的TDG类,其中包含用于带有具体表的CRUD操作的SQL。因此,您的模型不是直接与数据源(例如数据库)进行通信,而是通过那些抽象的模型-TDG类进行通信。因此,这只是进行另一个抽象级别的一种方法,并且只是与数据库进行通信的包装器-获取和修改数据。 IMHO TDG类不应包含成员,而只能包含方法。这是一个可视化TDG pattern用法的好模式。使用TDG方法时,应将SQL从模型类移至数据源(TDG)类。我通过TDG类从数据库检索到的所有数据都存储在我的模型成员中。
现在,主动记录的实现又如何呢?如果我将数据访问权限和模型类合并为一个模型类,那么我将实现事件记录吗?我找不到明显的区别,也找不到这些模式在PHP中的外观以及彼此之间的区别。
通常,我只有一个单例数据库类,然后为每个数据库表分配单独的模型类。每个模型类都有CRUD +几个自定义(计数,平均等)操作。有些类具有用于持久保存CRUD或自定义操作的结果的成员-可以根据需要完成。可以将此方法标识为事件记录吗?另外,如果我将SQL从模型类移动到TDG类,这将是表数据网关吗?
最佳答案
从http://martinfowler.com/eaaCatalog/index.html
明显的主要区别在于,TDG封装了对表的访问权,仅返回行数据,而AR封装了对表的行的访问权,并向其中添加了业务逻辑。
除非您具有非常低的阻抗失配,否则最好使用TDG,因为使用AR,您的业务/域对象会遵循数据库中的结构,而我们通常不应该如何建模域对象。行可能知道如何保持自身,但人不应该知道。从长远来看,将持久性逻辑和域逻辑分开是更可维护的。
关于您的Singleton DB对象,请查看Is there a use-case for singletons with database access in PHP?。