我正在用
PHP编写一个系统,它必须写入三个持久层:
>一个Web服务
>两个数据库(一个MysqL一个mssql)
原因是遗留系统无法更改.
我想使用DataMapper模式,我正在尝试建立实现我想要的最佳方式.我有一个如下界面:
<?PHP $service = $factory->getService()->create($entity); ?>
为简洁起见,下面是一些人为的和减少的代码:
<?PHP class Post extends AbstractService { protected $_mapper; public function create(Entity $post) { return $this->_mapper->create($post); } } class AbstractMapper { protected $_persistence; public function create(Entity $entity) { $data = $this->_prepareForPersistence($entity); return $this->_persistence->create($data); } } ?>
我的问题是,因为有三个持久层,因此每个都可能需要三个映射器.我想要一个干净的设计模式灵感的界面,使这项工作.
我认为它有三个选择:
>将三个映射器注入服务并在每个映射上调用create
> $_mapper是一个数组/集合,它遍历它们,在每个上调用create
> $_mapper实际上是一个充当a的容器对象
进一步代理和调用创建每个
我不得不解决类似的问题,但很多年前在PEAR DB时代.在该特定情况下,需要跨多个数据库复制数据.
我们没有不同数据库具有不同映射的问题,所以它更简单一些.
我们所做的是对DB类进行外观并覆盖getResult函数(或者它所调用的任何函数).然后,这个函数分析了sql,如果它是一个读取 – 它会将它发送给一个支持的,如果它是一个写,它会将它发送给所有人.
对于利用率很高的网站来说,这实际上非常有效.
从这个背景来看,我建议完全介绍所有持久性操作.完成后,实现细节不太相关,可以随时更改.
从这个角度来看,您的任何实现想法似乎都是一种合理的方法.不过,你会想到各种各样的事情.
>如果其中一个后端发生错误怎么办?
>写入三个数据库服务器会对性能产生什么影响?
>写入是否可以异步完成(如果是,请再次询问第一个问题)
还有另一种方法可以解决这个问题.那就是使用存储过程.如果您有主数据库服务器,则可以编写一个触发器,在提交(或其周围)连接到另一个数据库并同步数据时.
如果数据更新不需要立即进行,则可以让主数据库记录更改,并使另一个脚本定期将此数据“提供”到另一个系统中.同样,需要考虑错误问题.
希望这可以帮助.