gpt4 book ai didi

具有多个持久层的 PHP DataMapper

转载 作者:可可西里 更新时间:2023-11-01 12:38:18 26 4
gpt4 key购买 nike

我正在用 PHP 编写一个必须写入三个持久层的系统:

  • 一个网络服务
  • 两个数据库(一个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);
}
}
?>

我的问题是,由于存在三个持久层,因此每个层也可能需要三个映射器。我想要一个干净的设计模式启发界面来完成这项工作。

我认为它具有三个选项:

  1. 将三个映射器注入(inject)服务并在每个映射器上调用创建
  2. $_mapper 是一个数组/集合,它遍历它们并在每个上调用创建
  3. $_mapper 实际上是一个容器对象,充当在每个上创建进一步的代理和调用

我觉得这些解决方案中的每一个都有问题,如果有任何反馈/认可的设计模式可能适合这个问题,我将不胜感激。

最佳答案

在 PEAR DB 时代,我不得不解决一个类似的问题,但是很多年前。在这种特殊情况下,需要跨多个数据库复制数据。

我们没有遇到不同数据库具有不同映射的问题,所以它更简单一些。

我们所做的是对 DB 类进行外观处理并覆盖 getResult 函数(或调用的任何函数)。然后这个函数分析了 SQL,如果它是一个读 - 它会把它发送给一个支持的,如果它是一个写,它会把它发送给所有的。

对于一个使用率非常高的网站,这实际上非常有效。

从那个背景来看,我建议完全覆盖所有持久性操作。完成后,实现细节就不那么重要了,可以随时更改。

从这个角度来看,您的任何实现想法似乎都是一种合理的方法。不过,您需要考虑很多事情。

  • 如果其中一个后端抛出错误怎么办?
  • 写入三个数据库服务器对性能有何影响?
  • 写入可以异步完成吗(如果可以,再问第一个问题)

还有另一种方法可以解决这个问题。那就是使用存储过程。如果您有一个主数据库服务器,您可以编写一个触发器,它在提交(或大约)时连接到另一个数据库并同步数据。

如果不需要立即更新数据,您可以让主数据库记录更改,并使用另一个脚本定期将此数据“输入”到另一个系统中。同样,需要考虑错误问题。

希望这对您有所帮助。

关于具有多个持久层的 PHP DataMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13064256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com