>  기사  >  백엔드 개발  >  데이터 소스 아키텍처 모델 라인 데이터 입력

데이터 소스 아키텍처 모델 라인 데이터 입력

巴扎黑
巴扎黑원래의
2016-11-12 10:55:381627검색

참고: 이해가 안 되시면 읽지 마세요. 이 글은 Java에 대한 내용이 아니므로 Java를 좋아하시는 분들은 건너뛰셔도 됩니다.

1. 개념

행 데이터 게이트웨이: 행당 인스턴스가 하나씩 있는 데이터 소스의 단일 레코드에 대한 진입점 역할을 하는 개체입니다.

2. 행 데이터 입력의 간단한 구현

이해를 돕기 위해 먼저 간단히 구현해 보겠습니다.

<?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(&#39;id&#39; => $this->_id, &#39;name&#39; => $this->_name);
 
        $sql = "UPDATE order SET ";
        foreach ($data as $field => $value) {
            $sql .= "`" . $field . "` = &#39;" . $value . "&#39;,";
        }
        $sql = substr($sql, 0, -1);
        $sql .= " WHERE id = " . $this->_id;
        return DB::query($sql);
    }
 
    /**
     * 入口类自身拥有插入操作
     */
    public function insert() {
        $data = array(&#39;name&#39; => $this->_name);
 
        $sql = "INSERT INTO order ";
        $sql .= "(`" . implode("`,`", array_keys($data)) . "`)";
        $sql .= " VALUES(&#39;" . implode("&#39;,&#39;", array_values($data)) . "&#39;)";
 
        return DB::query($sql);
    }
 
    public static function load($rs) {
        /* 此处可加上缓存 */
        return new OrderGateway($rs[&#39;id&#39;] ? $rs[&#39;id&#39;] : NULL, $rs[&#39;name&#39;]);
    }
 
}
 
/**
 * 为了从数据库中读取信息,设置独立的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(&#39;name&#39; => &#39;start&#39;);
        $order = OrderGateway::load($data);
        $order->insert();
 
        /* 更新示例 */
        $data = array(&#39;id&#39; => 1, &#39;name&#39; => &#39;stop&#39;);
        $order = OrderGateway::load($data);
        $order->setName(&#39;xxxxxx&#39;);
        $order->update();
 
        /* 查询示例 */
        $finder = new OrderFinder();
        $order = $finder->find(1);
        echo $order->getName();
    }
}
 
Client::main();
?>

3. 연산 메커니즘

●행 데이터 항목은 데이터베이스의 각 열이 필드인 단일 레코드와 매우 유사한 개체입니다.

●행 데이터 입력은 일반적으로 데이터 소스 유형에서 인메모리 유형으로의 모든 변환을 달성할 수 있습니다.

● 행 데이터 항목에 도메인 로직이 없으면 활성 레코드입니다.

●예제에서 볼 수 있듯이 데이터베이스의 정보를 읽기 위해서는 독립적인 OrderFinder 클래스를 설정해야 합니다. 물론 새 클래스를 생성하지 않고 정적 검색 방법을 사용할 수도 있지만, 데이터 소스마다 다른 검색 방법이 필요한 다형성은 지원하지 않습니다. 따라서 여기서는 검색방법의 대상을 별도로 설정하는 것이 가장 좋습니다.

●행 데이터 입력은 테이블뿐만 아니라 뷰에도 사용할 수 있습니다. 주의가 필요한 것은 뷰의 업데이트 작업입니다.

● 자동 생성 프로세스 중에 모든 데이터베이스 액세스 코드가 자동으로 생성될 수 있도록 코드에 "메타데이터 매핑 정의"를 표시하는 것이 좋습니다.

4. 사용 시나리오

4.1 트랜잭션 스크립트

는 데이터베이스 액세스 코드를 잘 분리할 수 있으며 다른 트랜잭션 스크립트에서 쉽게 재사용할 수 있습니다. 그러나 비즈니스 논리가 여러 스크립트에서 반복되는 것을 볼 수 있으며 이 논리는 행 데이터 입력에 유용할 수 있습니다. 이 논리를 지속적으로 이동하면 행 데이터 항목이 활성 레코드로 발전하여 비즈니스 논리의 중복이 줄어듭니다.

4.2 도메인 모델

데이터베이스의 구조를 변경하고 싶지만 도메인 로직을 변경하고 싶지 않은 경우 행 데이터 입력을 사용하는 것이 좋습니다. 대부분의 경우 데이터 매퍼는 도메인 모델에 더 적합합니다.

행 데이터 항목은 데이터 매퍼와 함께 사용할 수 있습니다. 다소 중복된 것처럼 보일 수 있지만 이 접근 방식은 메타데이터에서 행 데이터 항목이 자동으로 생성되고 데이터 매퍼가 효율적으로 구현되는 경우 유용할 수 있습니다.

4.3 테이블 모듈(고려하지 않음)


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.