架构模式中的Active Record和Data Mapper
架构模式中的Active Record和Data Mapper
概念
- 在简单应用中,领域模型是一种和数据库结构一致的简单结构,对应每个数据库表都有一个领域类,在这种情况下,有必要让每个对象负责数据库的存取过程,这也就是Active Record(活动记录)。
- 领域对象直接鱼数据库表进行交互,这带来了一个问题,随着领域逻辑变的更加复杂,它就慢慢转变成一个大的领域模型,简单的Active Record已经不能满足要求了。
- 领域类和表一对一匹配也开始随着把领域逻辑放入更小的类而失效。关系数据库无法处理继承,因此使用策略模式等面相对象模式非常困难。
- 一种更好的办法是把数据库和数据库完全独立,让间接层完全领域对象和数据库表之间的映射,这个映射类也称作Data Mapper(数据映射器)。这个映射类处理数据库和领域模型之间所有的存取操作,并且允许双方都能独立变化。
- 如果领域逻辑非常简单并且类和表十分一致,使用简单的Active Record就足够了。如果领域逻辑比较复杂,长线项目,Data Mapper则可能是需要的。
ORM中的Active Record和Data Mapper
- Ruby和Laravel的ORM都采取了Active Record的模式,因此它们ORM可能像下面这样:
$user = new User;
$user->username = 'philipbrown';
$user->save();
- 再来看使用Data Mapper的ORM是怎样的:
$user = new User;
$user->username = 'philipbrown';
EntityManager::persist($user);
- 现在我们察看到了它们最基本的区别:在Active Record中,领域对象有一个save()方法,领域对象通常会继承一个ActiveRecord的基类来实现。而在Data Mapper模式中,领域对象不存在save()方法,持久化操作由一个中间类来实现。
架构模式中的Active Record和Data Mapper的更多相关文章
- yii中使用active record进行关联显示
model中: view中:
- Rails中重写Active Record字段属性
系统重构或升级时偶尔会碰到需要重写某个字段的情况,例如: 1. 读取user的name字段时,实际返回name_new字段 class User < ActiveRecord::Base def ...
- ORM Active Record Data Mapper
What's the difference between Active Record and Data Mapper? https://www.culttt.com/2014/06/18/whats ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- ASP.NET MVC架构模式
一.是什么? MVC,即(Model-View-Controller,模型—视图—控制器模式),和三层类似,用于表示一种软件架构模式.在这种模式下,将系统的实现分为模型Model,视图View,控制器 ...
- 架构模式数据源模式之:表数据入口(Table Data Gateway)、行数据入口(Row Data Gateway)、活动记录(Active Record)
一:表数据入口(Table Data Gateway) 表数据入口提供了用于访问单个表或者视图(也包含了联表查询)的所有SQL,通常一个表一个类.其它代码通过它来实现对数据库的交互.基于这个特点,表数 ...
- Android开源库--ActiveAndroid(active record模式的ORM数据库框架)
Github地址:https://github.com/pardom/ActiveAndroid 前言 我一般在Android开发中,几乎用不到SQLlite,因为一些小数据就直接使用Preferen ...
- 小书MybatisPlus第5篇-Active Record模式精讲
本文为一个系列中的第五节,前四节访问如下地址: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小书Mybatis ...
- Active Record 数据库模式-增删改查操作
选择数据 下面的函数帮助你构建 SQL SELECT语句. 备注:如果你正在使用 PHP5,你可以在复杂情况下使用链式语法.本页面底部有具体描述. $this->db->get(); 运行 ...
随机推荐
- sql查询分类和所有子类
select * from [JianDu].[dbo].[ZuZhiJiGou] where id = 64 --查询节点 union allSELECT TOP 1000 a.* FROM [Ji ...
- JavaScript模块化演变 CommonJs,AMD, CMD, UMD(一)
原文链接:https://www.jianshu.com/p/33d53cce8237 原文系列2链接:https://www.jianshu.com/p/ad427d8879cb 前端完全手册: h ...
- MySQL 核心三剑客 —— 索引、锁、事务
一.常见存储引擎 1.1 InnoDB InnoDB 是 MySQL 5.5 之后默认的存储引擎,它具有高可靠.高性能的特点,主要具备以下优势: DML 操作完全遵循 ACID 模型,支持事务,支持崩 ...
- JVM探秘:内存溢出
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 在 Java 虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生OutO ...
- spring boot 整合freemaker
前端最好使用vue.js 这里是freemaker 整合spring boot 1.编写pom文件: <dependencies> <dependency> <group ...
- Kubernetes资源与对象简述
资料 k8s基本对象概念 背景 资源和对象 Kubernetes 中的所有内容都被抽象为"资源",如 Pod.Service.Node 等都是资源."对象" ...
- git submodule 管理子项目
使用场景 拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用 git submodule 去完成. 常用命令 git clone <repo ...
- 抽象工厂模式(C++)
#include <iostream> using namespace std; class Fruit { public: ; }; class AbstractFactory { pu ...
- must appear in the GROUP BY clause or be used in an aggregate function
今天在分组统计的时候pgsql报错 must appear in the GROUP BY clause or be used in an aggregate function,在mysql里面是可以 ...
- Scala实践14
1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...