数据源架构模式之表数据入口
2017-07-16 08:54
225 查看
数据源架构模式有四种:表数据之口,行数据入口,活动记录和数据映射器。
在了解它们之前,需对领域模型模式有一定的了解,可先参看
一、概念
表数据入口(Table Data Gateway):充当数据库表访问入口的对象。一个实例处理表中所有的行(有没有想起表模块)。
表数据入口包含了用于访问单个表或视图的所有SQL,如CRUD等,其他代码调用它的方法来实现所有与数据库的交互。
二、实现简单的表数据入口
为方便理解,先给出事例,后面根据事例再作详细的分析。
Php代码
<?php
class DB {
/**
* 这只是一个执行SQL的演示方法
*
* @param string $sql 需要执行的SQL
*/
public function query( $sql ) {
echo "执行SQL: ", $sql, " <br />";
return 1;
}
}
/**
* order表的表数据入口
*/
class OrderGateway extends DB {
/**
* 查询所有指令
*
* @return <type>
*/
public function findAll() {
$sql = "SELECT * FROM order";
return DB::query( $sql );
}
/**
* 根据名字查找指令
*
* @param string $name
* @return bool
*/
public function findByName( $name ) {
$sql = "SELECT * FROM order WHERE `name` = '" . $name . "'";
return DB::query( $sql );
}
/**
* 更新指令数据
*
* @param string $key 关键字
* @param array $data 需要更新的数据
*/
public function update( $id, $data ) {
if ( emptyempty( $id ) || !is_array( $data ) ) {
return FALSE;
}
$sql = "UPDATE order SET ";
foreach ( $data as $field => $value ) {
$sql .= "`" . $field . "` = '" . $value . "',";
}
$sql = substr( $sql, 0, -1 );
$sql .= " WHERE id = " . $id;
return DB::query( $sql );
}
/**
* 插入指令的数据
*
* @param array $data 需要写入的数据
*/
public function insert( $data ) {
if ( !is_array( $data ) ) {
return FALSE;
}
$sql = "INSERT INTO order ";
$sql .= "(`" . implode( "`,`", array_keys( $data ) ) . "`)";
$sql .= " VALUES('" . implode( "','", array_values( $data ) ) . "')";
return DB::query( $sql );
}
}
/**
* 客户端调用
*/
class Client {
public static function main() {
$order = new OrderGateway();
header( "Content-type:text/html; charset=utf-8" );
$data = array( 'order' => 'start');
$order->insert( $data );
$id = 1;
$data['id'] = $id;
$order->update( $id, $data );
$order->findAll();
$order->findByName( 'start' );
}
}
Client::main();
?>
三、运行机制
由事例可以看出表数据入口接口其实很简单,一般包括几个从数据库中获取数据的查找方法以及更新、插入和删除方法,每个方法都将输入参数映射为一个SQL调用并在数据库连接上执行该语句。
从事例查询数据接口可以看到,每个查询都会返回多个数据项,php是允许返回多数据项的,可以把这些项作为一个单行使用,但如果只能返回一个单值,多次查询才能返回多行。这种情况可以采用数据传输对象。
四、使用场景
4.1表模块
表数据入口产生一个记录集数据结构由表模块处理。表模块最好的数据映射就是表数据入口了。
4.2事务脚本
表数据入口特别适用于事务脚本。二者之间的选择归结于如何处理多数据行。对PHP而言这个不是什么问题,对于之前提到有些语言不允许返回多数据项的,可以采用数据传输对象,不过这显然比表数据入口麻烦。
4.3领域模型
通常这两者很少一起使用,可以用表数据入口返回适当的领域对象,问题是这样会使领域对象和入口这间存在双向依赖。相反,数据映射器更好地分离了领域模型和数据库。
在了解它们之前,需对领域模型模式有一定的了解,可先参看
业务逻辑层之事务脚本与领域模型和业务逻辑层之表模块
一、概念
表数据入口(Table Data Gateway):充当数据库表访问入口的对象。一个实例处理表中所有的行(有没有想起表模块)。
表数据入口包含了用于访问单个表或视图的所有SQL,如CRUD等,其他代码调用它的方法来实现所有与数据库的交互。
二、实现简单的表数据入口
为方便理解,先给出事例,后面根据事例再作详细的分析。
Php代码
<?php
class DB {
/**
* 这只是一个执行SQL的演示方法
*
* @param string $sql 需要执行的SQL
*/
public function query( $sql ) {
echo "执行SQL: ", $sql, " <br />";
return 1;
}
}
/**
* order表的表数据入口
*/
class OrderGateway extends DB {
/**
* 查询所有指令
*
* @return <type>
*/
public function findAll() {
$sql = "SELECT * FROM order";
return DB::query( $sql );
}
/**
* 根据名字查找指令
*
* @param string $name
* @return bool
*/
public function findByName( $name ) {
$sql = "SELECT * FROM order WHERE `name` = '" . $name . "'";
return DB::query( $sql );
}
/**
* 更新指令数据
*
* @param string $key 关键字
* @param array $data 需要更新的数据
*/
public function update( $id, $data ) {
if ( emptyempty( $id ) || !is_array( $data ) ) {
return FALSE;
}
$sql = "UPDATE order SET ";
foreach ( $data as $field => $value ) {
$sql .= "`" . $field . "` = '" . $value . "',";
}
$sql = substr( $sql, 0, -1 );
$sql .= " WHERE id = " . $id;
return DB::query( $sql );
}
/**
* 插入指令的数据
*
* @param array $data 需要写入的数据
*/
public function insert( $data ) {
if ( !is_array( $data ) ) {
return FALSE;
}
$sql = "INSERT INTO order ";
$sql .= "(`" . implode( "`,`", array_keys( $data ) ) . "`)";
$sql .= " VALUES('" . implode( "','", array_values( $data ) ) . "')";
return DB::query( $sql );
}
}
/**
* 客户端调用
*/
class Client {
public static function main() {
$order = new OrderGateway();
header( "Content-type:text/html; charset=utf-8" );
$data = array( 'order' => 'start');
$order->insert( $data );
$id = 1;
$data['id'] = $id;
$order->update( $id, $data );
$order->findAll();
$order->findByName( 'start' );
}
}
Client::main();
?>
三、运行机制
由事例可以看出表数据入口接口其实很简单,一般包括几个从数据库中获取数据的查找方法以及更新、插入和删除方法,每个方法都将输入参数映射为一个SQL调用并在数据库连接上执行该语句。
从事例查询数据接口可以看到,每个查询都会返回多个数据项,php是允许返回多数据项的,可以把这些项作为一个单行使用,但如果只能返回一个单值,多次查询才能返回多行。这种情况可以采用数据传输对象。
四、使用场景
4.1表模块
表数据入口产生一个记录集数据结构由表模块处理。表模块最好的数据映射就是表数据入口了。
4.2事务脚本
表数据入口特别适用于事务脚本。二者之间的选择归结于如何处理多数据行。对PHP而言这个不是什么问题,对于之前提到有些语言不允许返回多数据项的,可以采用数据传输对象,不过这显然比表数据入口麻烦。
4.3领域模型
通常这两者很少一起使用,可以用表数据入口返回适当的领域对象,问题是这样会使领域对象和入口这间存在双向依赖。相反,数据映射器更好地分离了领域模型和数据库。
相关文章推荐
- 架构模式数据源模式之:表数据入口(Table Data Gateway)、行数据入口(Row Data Gateway)、活动记录(Active Record)
- 数据源架构模式之表入口模式
- 架构模式数据源模式之:数据映射器(Data Mapper)
- 数据源架构模式之行入口模式
- 数据源架构模式之数据映射器
- 微服务架构下的数据一致性:可靠事件模式
- 大数据架构和模式(二)——如何知道一个大数据解决方案是否适合您的组织
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- XML内嵌架构模式转换为普通数据文件
- Android架构: MVC 模式加载数据 前台显示
- 微服务架构下的数据一致性:可靠事件模式
- 大数据架构和模式(一)——大数据分类和架构简介
- 大数据架构和模式(三)理解大数据解决方案的架构层
- 云计算架构基础之多租户数据架构 (二) 三种模式实现相关的一些模式
- 大数据架构和模式(二)如何知道一个大数据解决方案是否适合您的组织
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- 微服务架构下的数据一致性:概念及相关模式
- EF4.1 企业架构模式 自动映射数据表(转载)
- Android架构: MVC 模式加载数据 前台显示
- 大数据架构和模式(一)——大数据分类和架构简介