1

在我的 Yii2/PHP 项目中,我需要集成两个数据库:

  • MySQL 用于元数据、Web-UI、...
  • 用于测量数据的 InfluxDB(大量时间序列数据)

为了降低复杂性,我想只从 MySQL 开始,稍后再添加 InfluxDB。

我的想法是为两个数据库(仅用于测量数据)创建一个抽象/超类,允许使用 MySQL 进行实现和执行测试,并在项目的后期启用 InfluxDB 加速。

抽象应该具有以下方法:

  • 数据库连接管理
  • 写入数据
  • 读取数据(原始数据、聚合)

由于我还不是 InfluxDB 专家:这种架构是否有意义,或者数据模型和方案是否根本不同,所以抽象将毫无价值?有项目可以借鉴吗?

4

2 回答 2

1

首先,你需要像下面这样配置你的数据库,这个例子需要两个 mysql 数据库:

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();
于 2019-01-02T15:36:36.787 回答
0

我不确定尝试将 MySQL 和 InfluxDB 放在同一个模型中是否有意义。

恕我直言,更好的方法是为您的计算提供某种帮助类(即:Stats::getViews()、Stats::getVisitors()、..)首先使用 MySQL,然后将其重写为使用 InfluxDB,保持相同的方法签名和响应格式。

于 2019-01-02T15:18:04.233 回答