`

数据源架构模式之行数据入口

阅读更多

注:看不懂的请勿踩,此文章非针对java,java爱好者可直接略过。

 

一、概念

行数据入口(Row Data Gateway):充当数据源中单条记录入口的对象,每行一个实例。

 

二、简单实现行数据入口

为了方便理解,还是先简单实现:

<?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']);
    }
 
}
 
/**
 * 为了从数据库中读取信息,设置独立的OrderFinder娄。
 */
class OrderFinder {
    public function find($id) {
        $sql = "SELECT * FROM order WHERE id = " . $id;
        $rs = DB::query($sql);
 
        return OrderGateway::load($rs);//这里返回的行对象
    }
 
    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");
 
        /* 写入示例 */
        $data = array('name' => 'start');
        $order = OrderGateway::load($data);
        $order->insert();
 
        /* 更新示例 */
        $data = array('id' => 1, 'name' => 'stop');
        $order = OrderGateway::load($data);
        $order->setName('xxxxxx');
        $order->update();
 
        /* 查询示例 */
        $finder = new OrderFinder();
        $order = $finder->find(1);
        echo $order->getName();
    }
}
 
Client::main();
?>

 

 

三、运行机制

●行数据入口是单条记录极其相似的对象,在该对象中数据库中的每一列为一个域。

 

●行数据入口一般能实现从数据源类型到内存中类型的任意转换。

 

●行数据入口不存在任何领域逻辑,如果存在,则是活动记录。

 

●在实例可看到,为了从数据库中读取信息,设置独立的OrderFinder类。当然这里也可以选择不新建类,采用静态查找方法,但是它不支持需要为不同数据源提供不同查找方法的多态。因此这里最好单独设置查找方法的对象。

 

●行数据入口除了可以用于表外还可以用于视图。需要注意的是视图的更新操作。

 

●在代码中可见“定义元数据映射”,这是一种很好的作法,这样一来,所有的数据库访问代码都可以在自动建立过程中自动生成。

 

 

 

四、使用场景

 

4.1 事务脚本

可以很好地分离数据库访问代码,并且也很容易被不同的事务脚本重用。不过可能会发现业务逻辑在多处脚本中重复出现,这些逻辑可能在行数据入口中有用。不断移动这些逻辑会使行数据入口演变为活动记录,这样减少了业务逻辑的重复。

 

4.2 领域模型

如果要改变数据库的结构但不想改变领域逻辑,采用行数据入口是不错的选择。大多数情况,数据映射器更加适合领域模型。

行数据入口能和数据映射器一起配合使用,尽管这样看起来有点多此一举,不过,当行数据入口从元数据自动生成,而数据映射器由手动实现时,这种方法会很有效。

 

4.3 表模块(不考虑)

 

3
1
分享到:
评论
1 楼 windvix 2014-07-31  
  不错,PHP我的最爱

相关推荐

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

    在本文中,我们将深入探讨PHP中的数据源架构模式,特别是表入口模式。数据源架构模式是设计应用程序时用于管理数据库交互的一种策略,它们旨在提高代码的可维护性和可重用性。表入口模式是这四种主要模式之一,它...

    用设计模式解决多数据源问题

    在多数据源场景下,可以创建一个单例的数据源管理器,用于维护和管理不同的数据库连接,确保在整个应用程序中只有一个统一的入口来访问数据源。 2. 工厂模式:当需要创建多个相似对象,但具体类型在运行时决定时,...

    Spring+SpringMVC+Mybatis动态链接多数据源

    本项目中的“RouterWeb”可能是一个Web应用程序的入口点或者路由处理类,用于根据请求信息选择合适的数据源。通过这个项目,你可以学习到如何在Spring、SpringMVC和Mybatis的环境下实现动态多数据源的配置和管理,这...

    Oracle数据仓库架构.ppt

    综上所述,Oracle数据仓库架构是一个复杂而全面的系统,涵盖了从数据源到用户接口的各个环节。它利用先进的数据库技术、ETL工具、商业智能组件和集群技术,为企业的数据管理和决策支持提供了强大支持。通过优化这些...

    数据仓库体系架构、主要过程与技术介绍

    1. 数据整合层:是整个系统中数据的统一入口,主要负责从异种数据源中提取数据,并进行清洗和转换处理,最终加载到ODS(操作性数据存储区)中。 2. 存储服务层:负责中央数据仓库的抽取、转化、加载(ETL)操作,以及...

    星环科技多模型数据库ArgoDB“一库多用“,构建高性能湖仓集一体平台

    在架构上,ArgoDB 基于存算解耦,实现了多模数据库的“四个统一”:统一的 SQL 编译引擎,支持 SQL 99/2003 标准语法,兼容 TD、Oracle、DB2 等多种方言,对不同模式的数据提供统一接口,将多个操作访问入口变为一个...

    数据中台技术架构设计方案.pptx

    数据中台根据企业的特定业务模式和组织架构,通过具体的产品和服务支撑体系,构建一套持续不断地将数据转化为资产并服务于业务的机制。具体而言: - **机制**:数据中台是一种持续让企业数据发挥作用的机制。 - **...

    数据中台架构及车联网行业应用.pptx

    数据中台建设的目的是打破传统的“数据烟囱”和“数据孤岛”,整合分散的系统和数据源,实现数据资产的高效利用。通过数据中台,企业可以实现数据的统一入口和出口,标准化管理,以及仓库化的数据存储。此外,它还...

    C#三层架构经典源代码

    在一个典型的三层架构应用程序中,应用程序的用户工作站包括提供图形用户界面(GUI)的程序设计和具体的应用程序入口表格或交互式窗口。 事务逻辑处在局域网(LAN)服务器或其他共享主机上,它作为...

    Linux电源管理系统架构和驱动

    ### Linux电源管理系统架构和驱动详解 #### 一、Linux电源管理全局架构 Linux电源管理系统是一项极为复杂的工程,涉及到了从系统级的待机管理、频率电压动态调整到具体设备驱动的电源控制等多个方面。这对于消费...

    用mfc做一个有数据源,有登陆界面的学生管理

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来开发一个具有数据源和登录界面的学生管理系统。MFC 是微软提供的一套面向对象的C++库,它简化了Windows应用程序的开发,提供了丰富的窗口、...

    基于SpringCloud框架核心组件,搭建多数据源管理,多服务管理,多中间件集成,多业务拆分设计的综合框架案例。.zip

    在本项目中,我们主要探讨的是如何利用SpringCloud框架构建一个综合性的微服务架构,它涵盖了多数据源管理、多服务治理、多种中间件集成以及多业务模块的拆分设计。SpringCloud作为Java领域的微服务解决方案,提供了...

    携程第四代架构探秘之运维基础架构升级.docx

    引入了Group概念,构建了App、Server、Pool、Group、Route的数据结构模型,通过CMS作为权威数据源,确保数据的完整性和准确性。同时,采用七层负载均衡(SLB)实现应用访问入口的隔离,支持应用级别的健康检测。最后...

    基于LINQtoSQL的WEB开发三层架构.pdf

    LINQ(Language Integrated Query)是.NET平台中的一种语言集成查询技术,它提供了一种统一的方式来查询不同的数据源,包括内存中的集合、数据库和XML文档等。LINQ to SQL作为LINQ技术的一个组成部分,主要负责对...

    Android应用程序架构.rar

    Repository模式用于统一数据源管理,无论数据来自网络、本地数据库还是文件,都通过Repository接口进行操作。此外,Clean Architecture提倡层次化的结构,将业务逻辑与平台特定代码分离,提高代码的可重用性和可维护...

    crawlergo - 一个使用chrome headless模式进行URL入口收集的动态爬虫.zip

    【标题】:“crawlergo - 一个使用chrome headless模式进行URL入口收集的动态爬虫” 【描述】:这个项目名为“crawlergo”,它是一个利用Chrome的Headless模式进行URL抓取的动态网络爬虫。Headless Chrome允许在...

    smart-lottery抽奖系统基于COLA架构采用DDD领域驱动中四层架构

    COLA(Clean Architecture On Layers,清洁分层架构)是一种软件架构模式,它强调将应用程序分为清晰的层次,每个层次都有明确的责任,以此来提高代码的可读性和可维护性。在COLA架构中,通常分为业务逻辑层、应用...

    rejoiner,从grpc微服务和其他protobuf源生成统一的graphql模式.zip

    而`rejoiner`是一个开源项目,专门用于从gRPC微服务和其他protobuf源生成统一的GraphQL模式,使得在分布式系统中整合多种数据源变得更加便捷。 `rejoiner`的主要目标是解决微服务架构中的数据集成问题。在微服务...

Global site tag (gtag.js) - Google Analytics