`

数据源架构模式之活动记录

阅读更多

hello!架构

一、概念

活动记录(Active Record):一个对象,它包装数据库表或视图中某一行,封装数据库访问,并在这些数据上增加了领域逻辑。

对象既有数据又有行为。活动记录使用直截了当的方法,把数据访问逻辑置于领域对象中。

 

二、实现简单活动记录

活动记录在php许多框架中都有应用,如cakephp。

<?php
/**
 * 行数据入口类
 */
class OrderGateway {
    /*定义元数据映射*/
    private $_name;
    private $_id;
 
    public function __construct($id, $name) {
        $this->setId($id);
        $this->setName($name);
    }
 
    public function getName() {
        return $this->_name;
    }
 
    public function setName($name) {
        $this->_name = $name;
    }
 
    public function getId() {
        return $this->_id;
    }
 
    public function setId($id) {
        $this->_id = $id;
    }
 
    /**
     * 入口类自身拥有更新操作
     */
    public function update() {
        $data = array('id' => $this->_id, 'name' => $this->_name);
 
        $sql = "UPDATE order SET ";
        foreach ($data as $field => $value) {
            $sql .= "`" . $field . "` = '" . $value . "',";
        }
        $sql = substr($sql, 0, -1);
        $sql .= " WHERE id = " . $this->_id;
        return DB::query($sql);
    }
 
    /**
     * 入口类自身拥有插入操作
     */
    public function insert() {
        $data = array('name' => $this->_name);
 
        $sql = "INSERT INTO order ";
        $sql .= "(`" . implode("`,`", array_keys($data)) . "`)";
        $sql .= " VALUES('" . implode("','", array_values($data)) . "')";
 
        return DB::query($sql);
    }
 
    public static function load($rs) {
        /* 此处可加上缓存 */
        return new OrderGateway($rs['id'] ? $rs['id'] : NULL, $rs['name']);
    }
 
}

/**
 * 上面内容与行数据入口一样
 * 此类为领域逻辑,这里新建个类,不采用static
 */
class OrderAccess {
    public function find($id) {
        $sql = "SELECT * FROM order WHERE id = " . $id;
        $rs = DB::query($sql);
 
        return OrderGateway::load($rs);//这里返回的行对象
    }

    public function insert($data){
        OrderGateway::load($data)->insert();
    }

    public function updateName($id,$name){
        $rs = array('id' => $id,'name' => $name);
        OrderGateway::load($rs)->update();
    } 

    public function findAll() {
        $sql = "SELECT * FROM order";
        $rs = DB::query($sql);
 
        $result = array();
        if (is_array($rs)) {
            foreach ($rs as $row) {
                $result[] = OrderGateway::load($row);
            }
        }
 
        return $result;
    }
 
}
 
class DB {
 
    /**
     * 这只是一个执行SQL的演示方法
     * @param string $sql   需要执行的SQL
     */
    public static function query($sql) {
        echo "执行SQL: ", $sql, " <br />";
    }
}
 
/**
 * 客户端调用
 */
class Client {
    public static function main() {
        header("Content-type:text/html; charset=utf-8");
 
        $access = new OrderAccess();
        $order = $access->find(1);
        echo $order->getName();

        $access->insert(array('name' => 'xxxxx'));
        $access->update(1,'xxxxx');
    }
}
 
Client::main();
?>

 

三、运行机制

●活动记录的本质是一个领域模型,每条活动记录负责向数据库保存数据,从数据库加载数据以及处理作用于数据之上的领域逻辑。

 

●此模式没有隐藏关系数据库的存在这个事实,因此通常使用此模式的同时几乎不用其他对象关系映射模式。

 

●活动记录和行数据入口十分相似,之前也多次提及。行数据入口仅有数据库访问而活动记录既有数据源逻辑又有领域逻辑。

 

●由于活动记录和数据库间的紧耦合,在这个模式中常用静态查找方法(例子采用的是新建类,这样更便于测试)。

 

●活动记录通常具有如下方法:

1、由SQL结果集中的一行构造一个活动记录实例(例中的OrderAccess->find方法

2、为将来对表的插入构造一个新的实例

3、用静态查找方法来包装常用的SQL查询和返回活动记录(例子采用新建类)

4、更新数据库并将活动记录中的数据插入数据库(例中的OrderAccess->update方法

5、获取和设置域(例中的OrderGateway getName setName方法)

6、实现部分业务逻辑

 

四、使用场景 

1、领域模型

活动记录适用于不太复杂的领域逻辑,如CRRD等。仅当活动记录对象和数据库中表直接对应,才比较有效。如果业务逻辑复杂,就会想到使用对象的直接关系、集合和继承等。它们都难以映射到活动记录。

 

2、事务脚本

活动记录可以减少事务脚本代码重复的痛苦。

 

3、表模块(不考虑)

 

 

 

4
3
分享到:
评论

相关推荐

    PHP数据源架构模式之表入口模式实例分析

    数据源架构模式是设计应用程序时用于管理数据库交互的一种策略,它们旨在提高代码的可维护性和可重用性。表入口模式是这四种主要模式之一,它提供了一个对象来集中处理与特定数据库表相关的所有操作。 首先,我们来...

    大数据产品中的异构数据源整合

    淘宝作为全球领先的电商平台,每天面临着海量的数据处理需求,其数据源的异构性尤为突出,包括但不限于用户行为数据、商品信息、交易记录、第三方数据等,这就对数据整合提出了极高的要求。 #### 大数据产品技术...

    数据采集架构所需组件

    数据采集架构是现代大数据处理系统中的关键...通过这样的架构,我们可以有效地从各种数据源采集、处理和分析数据,为决策制定提供有力的支持。在实际应用中,还需要根据具体业务需求对每个组件进行细致的调整和优化。

    dataSourceArchitecturalPatterns:该项目是根据软件工程实验室课程中关于数据源架构模式的演示创建的

    数据源架构模式由 Wdnei Ribeiro da Paixão 创建该项目是根据软件工程实验室学科中数据源架构模式的演示创建的。 此处介绍的数据访问模式由 Martin Fowler 定义,它们是: *数据表网关*行数据网关*活动记录*数据...

    软件架构设计之常用架构模式.doc

    软件架构设计之常用架构模式 软件架构设计是软件设计中一个非常重要的部分,它直接关系到软件的可维护性、可扩展性、可靠性等。常用的架构模式有多种,以下是其中一些常用的架构模式: 1. 分层架构:分层架构是...

    [原创]从数据仓库到数据湖——浅谈数据架构演进1

    数据仓库架构通常包括以下几个层次:源系统、数据接入层、数据存储层、数据处理层和应用层。源系统包含各种业务系统的原始数据;数据接入层负责数据的抽取和预处理;数据存储层则分为数据仓库和数据 mart,前者存储...

    软考系统架构师考试重点精要44页 (2).pdf

    1.数据仓库基本功能层:包括数据源、数据准备区、数据仓库结构、数据集市或知识挖掘库等。 2.数据仓库管理层:包括数据仓库的数据管理和数据仓库的元数据管理等。 3.数据仓库环境支持层:包括数据仓库数据传输层...

    数据架构大型集团公司数据架构总体设计方案.docx

    - **数据采集**:收集原始数据的过程,涉及各种数据源,如传感器、日志文件等。 - **数据处理**:对原始数据进行清洗、转换和加载(ETL)的过程,以提高数据质量和可用性。 - **数据分析**:利用统计学方法和机器...

    Maven项目springMVC_Mybatis多数据源_Jersey_Task

    这可以有效地实现数据库的隔离,提高系统的性能和稳定性,例如,一个数据源用于存储用户信息,另一个用于交易记录。 【Jersey】 Jersey是Java RESTful Web服务(JAX-RS)的实现,用于创建和消费RESTful API。它提供...

    java 山寨qq 聊天工具(基于mvc三层架构,附 mvc架构模式pdf说明文档)支持开源

    这个项目不仅包含了服务器端(chat_server)和客户端(chat_client)的源代码,还附带了一份关于MVC架构模式的PDF说明文档,方便开发者深入理解其工作原理。 MVC架构模式是软件工程中的一种经典设计模式,广泛应用...

    支持不同数据源之间数据同步

    标题“支持不同数据源之间数据同步”表明我们讨论的核心技术是数据集成,它允许从一个或多个数据源提取数据,并将其实时或批量地更新到其他数据存储系统中。这在业务分析、数据仓库、数据湖以及跨系统的数据一致性...

    spring+springmvc+mybatis多数据源

    3. 监控和日志:对每个数据源的使用情况进行监控,记录操作日志,以便于故障排查和性能优化。 4. 安全性:确保敏感的数据库连接信息安全存储,遵循最小权限原则分配数据库访问权限。 总之,“spring+springmvc+...

    大数据架构和模式.docx

    - **数据源**: 数据可以从多种渠道获得,包括Web和社交媒体、传感器数据、人工输入等。 - **数据使用者**: 包括业务分析师、数据科学家、决策支持系统等。 **2. 分类的意义** - **优化处理**: 不同类型的数据...

    JAVA软件架构设计模式

    在Java中,Adapter类常用于视图组件或数据源的对接。 7. **桥接模式**:将抽象部分与实现部分分离,使它们可以独立变化。在Java图形用户界面设计中,可以利用此模式实现平台无关性。 8. **策略模式**:定义一系列...

    大数据架构和模式42.docx

    4. **数据源**:数据的来源多种多样,包括但不限于Web和社交媒体、机器生成数据(如传感器数据)、人类生成数据(如电子邮件和办公文档)等。 5. **数据使用者**:了解数据最终会被哪些人或系统使用也非常重要,这...

    数据仓库架构师面试题.docx

    5. **数据仓库架构**设计时要考虑诸多因素,例如采用星型或雪花型模式构建维度表,处理缓慢变化维度,管理多值维度和层级结构,以及加载事实表。此外,还要处理事实表的代理键、聚集以及确保数据的质量和一致性。 ...

    三层架构工厂模式

    三层架构是一种常见的软件...同时,工厂模式使得在切换不同的数据源时,只需要更改工厂类的实现,而无需修改业务逻辑层和表示层的代码。这种设计模式的结合在大型项目中尤为常见,能有效提高软件的健壮性和可维护性。

Global site tag (gtag.js) - Google Analytics