Yii2/PHP:为 InfluxDB 和 MySQL 抽象数据库访问
Posted
技术标签:
【中文标题】Yii2/PHP:为 InfluxDB 和 MySQL 抽象数据库访问【英文标题】:Yii2/PHP: Abstracting Database Access for InfluxDB and MySQL 【发布时间】:2019-05-29 01:31:28 【问题描述】:在我的 Yii2/php 项目中,我需要集成两个数据库:
用于元数据、Web-UI 的 mysql ... 用于测量数据的 InfluxDB(大量时间序列数据)为了降低复杂性,我想只从 MySQL 开始,稍后再添加 InfluxDB。
我的想法是为两个数据库(仅用于测量数据)创建一个抽象/超类,允许使用 MySQL 进行实现和执行测试,并在项目的后期使用 InfluxDB 加速。
抽象应该有以下方法:
数据库连接管理 写入数据 读取数据(原始数据、聚合)由于我还不是 InfluxDB 专家:这种架构是否有意义,或者数据模型和方案是否根本不同,所以抽象将毫无价值?有项目可以借鉴吗?
【问题讨论】:
【参考方案1】:首先,你需要像下面这样配置你的数据库,这个例子需要两个 mysql db:
return [
'components' => [
'db1' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=db1name', //maybe other dbms such as psql,...
'username' => 'db1username',
'password' => 'db1password',
],
'db2' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=db2name', // Maybe other DBMS such as psql (PostgreSQL),...
'username' => 'db2username',
'password' => 'db2password',
],
],
];
那么你可以简单地:
// To get from db1
Yii::$app->db1->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()
// To get from db2
Yii::$app->db2->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()
如果您使用的是活动记录模型,您可以在模型中定义:
public static function getDb()
return Yii::$app->db1;
//Or db2
public static function getDb()
return Yii::$app->db2;
然后:
如果你在getDb()方法中设置了db1,结果会从db1中获取,以此类推。
ModelName::find()->select('*')->all();
【讨论】:
感谢您的回答。在我项目的后期阶段,我想要两个数据库,用于元数据的 MySQL 和用于时间序列的 InfluxDB。我的问题只是关于处理时间序列,而不是完全替代我的 Yii2 应用程序中的数据存储。这个超类/接口应该如何构建/构建?【参考方案2】:我不确定将 MySQL 和 InfluxDB 放在同一个模型中是否有意义。
恕我直言,更好的方法是为您的计算提供某种帮助类(即:Stats::getViews()、Stats::getVisitors()、..)首先使用 MySQL,然后重写它以使用InfluxDB,保持相同的方法签名和响应格式。
【讨论】:
为什么抽象在这里是个问题?相同的超类或接口可以帮助以后轻松切换。并且两者都有相似的逻辑:访问前连接,处理错误,相同的编写接口,... 我也同意@WeSee以上是关于Yii2/PHP:为 InfluxDB 和 MySQL 抽象数据库访问的主要内容,如果未能解决你的问题,请参考以下文章
Yii2 / PHP / IIS7 - URL重写和文件权限(漂亮的URL问题)