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

简介:

一、概念

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

对象既有数据又有行为。

活动记录使用直截了当的方法。把数据訪问逻辑置于领域对象中。

 

二、实现简单活动记录

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

Php代码  收藏代码
  1. <?php  
  2. /** 
  3.  * 行数据入口类 
  4.  */  
  5. class OrderGateway {  
  6.     /*定义元数据映射*/  
  7.     private $_name;  
  8.     private $_id;  
  9.    
  10.     public function __construct($id$name) {  
  11.         $this->setId($id);  
  12.         $this->setName($name);  
  13.     }  
  14.    
  15.     public function getName() {  
  16.         return $this->_name;  
  17.     }  
  18.    
  19.     public function setName($name) {  
  20.         $this->_name = $name;  
  21.     }  
  22.    
  23.     public function getId() {  
  24.         return $this->_id;  
  25.     }  
  26.    
  27.     public function setId($id) {  
  28.         $this->_id = $id;  
  29.     }  
  30.    
  31.     /** 
  32.      * 入口类自身拥有更新操作 
  33.      */  
  34.     public function update() {  
  35.         $data = array('id' => $this->_id, 'name' => $this->_name);  
  36.    
  37.         $sql = "UPDATE order SET ";  
  38.         foreach ($data as $field => $value) {  
  39.             $sql .= "`" . $field . "` = '" . $value . "',";  
  40.         }  
  41.         $sql = substr($sql, 0, -1);  
  42.         $sql .= " WHERE id = " . $this->_id;  
  43.         return DB::query($sql);  
  44.     }  
  45.    
  46.     /** 
  47.      * 入口类自身拥有插入操作 
  48.      */  
  49.     public function insert() {  
  50.         $data = array('name' => $this->_name);  
  51.    
  52.         $sql = "INSERT INTO order ";  
  53.         $sql .= "(`" . implode("`,`"array_keys($data)) . "`)";  
  54.         $sql .= " VALUES('" . implode("','"array_values($data)) . "')";  
  55.    
  56.         return DB::query($sql);  
  57.     }  
  58.    
  59.     public static function load($rs) {  
  60.         /* 此处可加上缓存 */  
  61.         return new OrderGateway($rs['id'] ? $rs['id'] : NULL, $rs['name']);  
  62.     }  
  63.    
  64. }  
  65.   
  66. /** 
  67.  * 上面内容与行数据入口一样 
  68.  * 此类为领域逻辑,这里新建个类,不採用static 
  69.  */  
  70. class OrderAccess {  
  71.     public function find($id) {  
  72.         $sql = "SELECT * FROM order WHERE id = " . $id;  
  73.         $rs = DB::query($sql);  
  74.    
  75.         return OrderGateway::load($rs);//这里返回的行对象  
  76.     }  
  77.   
  78.     public function insert($data){  
  79.         OrderGateway::load($data)->insert();  
  80.     }  
  81.   
  82.     public function updateName($id,$name){  
  83.         $rs = array('id' => $id,'name' => $name);  
  84.         OrderGateway::load($rs)->update();  
  85.     }   
  86.   
  87.     public function findAll() {  
  88.         $sql = "SELECT * FROM order";  
  89.         $rs = DB::query($sql);  
  90.    
  91.         $result = array();  
  92.         if (is_array($rs)) {  
  93.             foreach ($rs as $row) {  
  94.                 $result[] = OrderGateway::load($row);  
  95.             }  
  96.         }  
  97.    
  98.         return $result;  
  99.     }  
  100.    
  101. }  
  102.    
  103. class DB {  
  104.    
  105.     /** 
  106.      * 这仅仅是一个运行SQL的演示方法 
  107.      * @param string $sql   须要运行的SQL 
  108.      */  
  109.     public static function query($sql) {  
  110.         echo "运行SQL: "$sql" <br />";  
  111.     }  
  112. }  
  113.    
  114. /** 
  115.  * client调用 
  116.  */  
  117. class Client {  
  118.     public static function main() {  
  119.         header("Content-type:text/html; charset=utf-8");  
  120.    
  121.         $access = new OrderAccess();  
  122.         $order = $access->find(1);  
  123.         echo $order->getName();  
  124.   
  125.         $access->insert(array('name' => 'xxxxx'));  
  126.         $access->update(1,'xxxxx');  
  127.     }  
  128. }  
  129.    
  130. Client::main();  
  131. ?

    >  

 

三、执行机制

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

 

●此模式没有隐藏关系数据库的存在这个事实,因此通常使用此模式的同一时候差点儿不用其它对象关系映射模式。

 

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

 

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

 

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

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

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

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

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

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

6、实现部分业务逻辑

 

四、使用场景 

1、领域模型

活动记录适用于不太复杂的领域逻辑,如CRRD等。

仅当活动记录对象和数据库中表直接相应,才比較有效。假设业务逻辑复杂,就会想到使用对象的直接关系、集合和继承等。

它们都难以映射到活动记录。

 

2、事务脚本

活动记录能够降低事务脚本代码反复的痛苦。

 

3、表模块(不考虑)









本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5093629.html,如需转载请自行联系原作者


相关文章
|
2月前
|
存储 BI Shell
Doris基础-架构、数据模型、数据划分
Apache Doris 是一款高性能、实时分析型数据库,基于MPP架构,支持高并发查询与复杂分析。其前身是百度的Palo项目,现为Apache顶级项目。Doris适用于报表分析、数据仓库构建、日志检索等场景,具备存算一体与存算分离两种架构,灵活适应不同业务需求。它提供主键、明细和聚合三种数据模型,便于高效处理更新、存储与统计汇总操作,广泛应用于大数据分析领域。
331 2
|
22天前
|
数据采集 缓存 前端开发
如何开发门店业绩上报管理系统中的商品数据板块?(附架构图+流程图+代码参考)
本文深入讲解门店业绩上报系统中商品数据板块的设计与实现,涵盖商品类别、信息、档案等内容,详细阐述技术架构、业务流程、数据库设计及开发技巧,并提供完整代码示例,助力企业构建稳定、可扩展的商品数据系统。
|
2月前
|
SQL 缓存 前端开发
如何开发进销存系统中的基础数据板块?(附架构图+流程图+代码参考)
进销存系统是企业管理采购、销售与库存的核心工具,能有效提升运营效率。其中,“基础数据板块”作为系统基石,决定了后续业务的准确性与扩展性。本文详解产品与仓库模块的设计实现,涵盖功能概述、表结构设计、前后端代码示例及数据流架构,助力企业构建高效稳定的数字化管理体系。
|
1月前
|
数据采集 监控 数据可视化
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研
本案例讲述了在豆瓣电影数据采集过程中,面对数据量激增和限制机制带来的挑战,如何通过引入爬虫代理、分布式架构与异步IO等技术手段,实现采集系统的优化与扩展,最终支撑起百万级请求的稳定抓取。
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研
|
22天前
|
缓存 前端开发 BI
如何开发门店业绩上报管理系统中的门店数据板块?(附架构图+流程图+代码参考)
门店业绩上报管理是将门店营业、动销、人效等数据按标准化流程上报至企业中台或BI系统,用于考核、分析和决策。其核心在于构建“数据底座”,涵盖门店信息管理、数据采集、校验、汇总与对接。实现时需解决数据脏、上报慢、分析无据等问题。本文详解了实现路径,包括系统架构、数据模型、业务流程、开发要点、三大代码块(数据库、后端、前端)及FAQ,助你构建高效门店数据管理体系。
|
1月前
|
SQL 数据采集 数据处理
终于有人把数据架构讲清楚了!
本文深入浅出地解析了数据架构的核心逻辑,涵盖其定义、作用、设计方法及常见误区,助力读者构建贴合业务的数据架构。
|
5月前
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
465 69
|
5月前
|
机器学习/深度学习 传感器 自然语言处理
基于Transformer架构的时间序列数据去噪技术研究
本文介绍了一种基于Transformer架构的时间序列去噪模型。通过生成合成数据训练,模型在不同噪声条件下展现出强去噪能力。文章详细解析了Transformer的输入嵌入、位置编码、自注意力机制及前馈网络等关键组件,并分析实验结果与注意力权重分布。研究为特定任务的模型优化和专业去噪模型开发奠定了基础。
330 14
基于Transformer架构的时间序列数据去噪技术研究
|
机器学习/深度学习 数据采集 人工智能
揭秘!47页文档拆解苹果智能,从架构、数据到训练和优化
【8月更文挑战第23天】苹果公司发布了一份47页的研究文档,深入解析了其在智能基础语言模型领域的探索与突破。文档揭示了苹果在此领域的雄厚实力,并分享了其独特的混合架构设计,该设计融合了Transformer与RNN的优势,显著提高了模型处理序列数据的效能与表现力。然而,这种架构也带来了诸如权重平衡与资源消耗等挑战。苹果利用海量、多样的高质量数据集训练模型,但确保数据质量及处理噪声仍需克服。此外,苹果采取了自监督与无监督学习相结合的高效训练策略,以增强模型的泛化与稳健性,但仍需解决预训练任务选择及超参数调优等问题。
281 66
|
10月前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
275 8

热门文章

最新文章