`

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

阅读更多

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
分享到:
评论

相关推荐

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

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

    大数据整理——数据集成.pdf

    基于中间模式的数据集成系统架构 虚拟集成系统主要使⽤中间模式建⽴全局数据的逻辑视图,为异构数据源提供⾼层次的数据访问服务。 数据库:提供数据,独⽴性强 封装器: 负责把上层⽤户的查询转发到数据源,并把...

    大数据平台常用组件-常见的大数据平台架构设计思路.pdf

    六、元数据-⼤数据体系基⽯ 元数据是打通数据源、数据仓库、数据应⽤,记录了数据从产⽣到消费的完整链路。元数据包含静态的表、列、分区信息(也就是 MetaStore)。动态的任务、表依赖映射关系;数据仓库的模型定义...

    Qt实现C/S架构的银行管理系统,C++源代码,优秀毕业设计系统!

    1.运用QT框架写C/S架构的银行管理系统,编程语言C++,整个系统开发环境在Linux下进行 2.服务器端用的linux平台下的epoll作为服务器模型,Mysql数据库实现数据存储; 3.设计模式主要用了单例模式、抽象工厂以及对象的...

    高级软件架构师复习提纲

    //从源端复制数据到目标端,并检测和解决自上一次复制以来出现的任何更新冲突 //由位于源和目标之间、方向相反的两个复制链接组成的复制构造块 64、 下面哪些应用可以被称为Smart :A:能够利用本地资源 A:智能安装...

    深入浅出设计模式(中文版)

    书籍目录 目录 第1章基本概念 1 1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 ...1.4GoF设计模式的分类 4 ...6.3用模式生成程序架构 316 附录1自测题 321 附录2自测题答案 331 参考文献 337

    深入浅出设计模式(中文版电子版)

    真正电子版 不是扫描的 可以转为word或者txt 书籍目录 目录 第1章基本概念 1 1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 ...6.3用模式生成程序架构 316 附录1自测题 321 附录2自测题答案 331

    基于stm32、树莓派,后端使用Java的SpringBoot架构,以微信小程序作为用户控制端的智能家居控制系统,含完整源代码

    |-- driverCL(命令,传输数据,状态,模式等记录文件目录) |-- himasterlearn(无监督机器学习demo目录) |--test.py (机器学习demo) |--train.py (训练文件) |-- libs(库文件目录) |-- Raspberry |-- x64 |...

    大数据产业链概述.docx

    大数据产业链包括一切与大数据的产生与集聚(数据源)、组织与管理(存储)、分析与发现(技术)、交易、应用与衍生产业相关的所有活动。大数据产业链按照数据价值实现流程,包括数据源、大数据硬件支撑层、大数据...

    多功能.NET代码自动生成器(含存储过程)

    1、 适用于.net项目,基于MVC架构模式 2、 按照数据库结构生成基础开发类库 3、 数据库支持SQL2000和SQL2005两个版本 4、 类库为分层框架工厂模式,依次分为:数据库交互层(SqlHelper)、业务实体层(Model)、数据...

    多功能.NET代码自动生成器2.0版(2010年最新修改)

    1、 适用于.net项目,基于MVC架构模式 2、 按照数据库结构生成基础开发类库 3、 数据库支持SQL2000和SQL2005两个版本 4、 类库为分层框架工厂模式,依次分为:数据库交互层(SqlHelper)、业务实体层(Model)、数据...

    狂龙客户端与Oracle服务器时间同步神器v1.0中文安装版

    狂龙客户端与Oracle服务器时间同步神器,工作中发现一些系统数据时间记录不一致的情况,造成基础数据源出问题,并影响了单位、个人一些报表或导出数据的准确性,如何造成的呢?经过实践发现部分客户端的系统时间出现...

    探索CQRS和事件源(微软云)

    3.5系统架构17探索CQRS和事件源目录3.6模式和概念17 3.6.1系统验证21 3.6.2交易边界22 3.6.3并发处理22 3.6.4Aggregates和Aggregate Roots22 3.7实现细节23 3.7.1高层架构23 3.7.2写者模型28 3.7.3使用Windows Azure...

    狂龙客户端与Oracle服务器时间同步神器v1.0

    [狂龙客户端与Oracle服务器时间同步神器]:工作中发现一些系统数据时间记录不一致的情况,造成基础数据源出问题,并影响了单位、个人一些报表或导出数据的准确性,如何造成的呢?经过实践发现部分客户端的系统时间...

    基于jbpm与activiti的工作流平台技术架构介绍

    ◦数据源管理 可以设置多种数据源,为在线表单设计及展示提供数据来源 ◦资源管理 管理系统的所有资源,包括URL,业务方法等,提供给安全管理进行极限配置 ◦流水号管理 用于产生业务的一些处理流水单号 ◦数据字典...

    asp.net知识库

    ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 Ibatisnet 提供的CacheModel ASP.NET 2.0中小心Profile命名冲突 使用ASP.NET 2.0 ...

    二十三种设计模式【PDF版】

    很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. ...

    source-architect-example:一个用于开发基于Web的应用程序的源代码架构示例-one source code

    源架构师示例 一个用于开发基于Web的应用程序的源代码体系结构示例。 设计负责人 功能分离:后端,前端和核心 面向业务的微服务 面向对象的程序设计 后端遵循“模型-服务-控制器”设计模式 前端遵循组件设计 首选可...

    JSP学生网上选课系统设计(源代码+论文+答辩PPT).rar

    这些源码可能是按照多层架构模式组织,包括表现层、业务逻辑层和数据访问层,以支持系统的可维护性和扩展性。配套的论文文档则从理论的角度对整个系统的设计思路、功能需求、系统架构、数据库设计、接口实现、测试...

Global site tag (gtag.js) - Google Analytics