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获得第一天的一周和最后一天的日期

Yii2(PHP) 對接 ping++支付接口

Yii2 / PHP / IIS7 - URL重写和文件权限(漂亮的URL问题)

influxDB:如何在 influxDB v2.0 中将字段转换为标签

在 influxdb 中为聚合数据添加标签

CentOS 7 安装 InfluxDB