【问题标题】:How does an implementation of Table Data Gateway differs from Active Record?表数据网关的实现与 Active Record 有何不同?
【发布时间】:2012-01-01 15:33:15
【问题描述】:

简单地说一下表数据网关 (TDG) 实现:您创建单独的 TDG 类,其中包含用于使用具体表的 CRUD 操作的 SQL。因此,您的模型不是直接与数据源(例如数据库)进行通信,而是通过那些抽象的 TDG 类进行通信。所以,它只是一种进行另一层抽象的方法,它只是一个与数据库通信的包装器——获取和修改数据。恕我直言,TDG 类不应包含成员,仅包含方法。这是一个很好的架构,可以可视化TDG pattern 的使用。使用 TDG 方法时,应将 SQL 从模型类移至数据源 (TDG) 类。我通过 TDG 类从 DB 中检索到的所有数据都存储在我的模型成员中。

现在,如何实现活动记录?如果我将数据访问和我的模型类合并到一个模型类中,那么我会实现活动记录吗?我无法找到明确的区别或这些模式在 PHP 中的外观以及彼此之间的差异。

通常,我有一个单例数据库类,然后为每个数据库表单独的模型类。每个模型类都有 CRUD + 几个自定义(计数、平均等)操作。某些类具有用于持久化 CRUD 或自定义操作的结果的成员 - 这是根据需要完成的。这种方法可以被识别为活动记录吗?另外,如果我将 SQL 从我的模型类移动到 TDG 类,这会是表数据网关吗?

【问题讨论】:

    标签: php design-patterns activerecord


    【解决方案1】:

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

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

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

    明显的主要区别在于 TDG 封装了对 table 的访问并且只返回行数据,而 AR 封装了对表中 row 的访问 and 为其添加业务逻辑。

    除非您的阻抗失配非常低,否则最好使用 TDG,因为使用 AR,您的业务/领域对象遵循数据库中的结构,而我们通常不知道您的领域对象应该如何建模。 A Row 可能知道如何坚持自己,但 Person 不应该知道。将持久化逻辑和域逻辑分开,从长远来看更易于维护。

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

    【讨论】:

    • 谢谢。在实现 TDG 时我可能有哪些类型的方法(和 SQL 查询)?我不应该把业务逻辑,但什么可能被认为是业务逻辑的东西?例如,我可以在 TDG 类中使用这样的方法(和 SQL 查询),例如 selectAllRows、批量更新(传递数据数组)、selectAllPersonsByLastName、countAll、SelectAvg 等吗?恕我直言,他们都应该在 TDG 类中。业务逻辑是否意味着从 TDG 类派生的 SQL 结果集进行的任何额外计算?
    • @Centurion 一个 TDG 可能包含与表相关的所有 SQL 查询:插入、更新、选择(持久性逻辑)。它不应包含处理查询结果(业务逻辑)的代码。把它放在Domain ModelTable Module
    • 明白了 :) 但我还有一个问题。一个表模块类映射到一个表,所以恕我直言,这样的表模块类可能被视为模型(在 MVC 上下文中交谈时)?那么域模型呢,什么应该被认为是模型呢?一组用于具体控制器的类?
    • 另外,我刚刚开始思考第三种模式——数据映射器。恕我直言,这种模式与 TDG 非常相似,因为两种方式,SQL 内容都驻留在数据源类中(在 TDG“Person Gateway”中,在 DM“Person Mapper”中)和模型类(“Person”)中的业务逻辑。你怎么看区别?
    • @Centurion 抱歉,但解释各种架构模式超出了评论的范围。它会占用太多的单词。简而言之,模型是不是视图或控制器的一切。域模型和数据库访问只是模型内部的层。 Data Mapper 使用 TDG 但不是 TDG。 DataMappers 将行数据映射到域对象。查看我之前关于此主题的一些答案:stackoverflow.com/search?q=data+mapper+user%3A208809
    猜你喜欢
    • 2011-11-19
    • 2018-12-10
    • 1970-01-01
    • 2010-10-24
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多